Skip to main content

onceover

Profile a Polars DataFrame with one call. onceover returns column summaries, ranked findings with evidence, and coverage describing what each pass examined. The computation runs in Rust; Python bindings release the GIL while profiling.

Documentation: the full book — tutorials, case studies, per-pass methodology, implementation notes, and the report contract — is built from this repository and published at https://fcela.github.io/onceover/. The analysis notebook is a complete worked example with charts and controls.

Install

pip install onceover

Requires CPython 3.10+ and Polars 2.x. Binary wheels cover Linux x86_64 and aarch64, macOS Intel and Apple silicon, and Windows x86_64. Building the source distribution requires Rust and a C compiler.

Python

import polars as pl
import onceover

df = pl.DataFrame({
    "order_id": [1, 2, 3, 4],
    "quantity": [2, 1, 4, 3],
    "double_quantity": [4, 2, 8, 6],
})

report = onceover.profile(df)
print(report.overview["headline"])
print(report.to_markdown())

report.columns     # Per-column types, roles, counts, and statistics
report.findings    # Selected statements with supporting evidence
report.coverage    # Pass status, samples, caps, and skipped work
report.groups      # Connected findings, without a redundancy claim
report.data        # Complete JSON-compatible report
report.save("profile.json")

profile(df, budget="standard", deadline_seconds=None) accepts three budgets:

Budget Work
quick Column summaries, single-column keys, duplicates, dates, and sortedness
standard All passes with bounded search and model samples
deep All passes with larger search caps and model samples

Results are deterministic for the same data and configuration. An optional wall-clock deadline can change which passes finish; coverage records skipped work.

Findings

  • Primary, composite, and nearly unique keys; duplicated rows.
  • Exact and approximate functional dependencies, with violation counts.
  • Predictable columns, cross-validated decision tables, and PRISM rules.
  • Pearson, Spearman, and Chatterjee's ξ dependence; redundant column groups.
  • Arithmetic identities, M5-style local linear regimes, and dated residual shifts.
  • Nominal associations with training and diagnostic holdout evidence.
  • Date gaps, irregular intervals, sortedness, constants, missing values, concentration, numeric category codes, and inconsistent string formats.

Finding categories describe the discovered pattern, while contributing methods are recorded in evidence. Scope, measurement basis, and validation are separate fields. Equivalent statements combine evidence; shared selection limits apply across detectors. See the report schema. Model explanations and associations use diagnostic validation; they do not establish causal effects or multiple-testing guarantees.

Rust

cargo add onceover polars@0.55
use onceover::{profile, ProfileConfig};
use polars::prelude::*;

fn main() -> PolarsResult<()> {
    let df = df!("id" => [1i64, 2, 3], "value" => [4.0, 5.0, 6.0])?;
    let report = profile(&df, &ProfileConfig::default());
    println!("{}", report.to_json());
    Ok(())
}

The Rust API uses Polars 0.55. The onceover crate re-exports report types.

Large and wide tables

The profiler accepts in-memory DataFrames with millions of rows and hundreds of columns. Column summaries examine every row and retain exact cardinality, null counts, distributions, and quantiles. Dense and nullable Int64/Float64 columns borrow Arrow buffers; other dtypes can require normalized copies. This is an in-memory profiler, so input size and exact statistics still affect memory and runtime.

Relationship discovery uses broad screening followed by bounded follow-up work:

Work standard deep
Encoded relationship sample 20,000 rows, all usable columns 50,000 rows, all usable columns
Predictability Every eligible target; up to 48 shortlisted predictors and 5,000 fitting rows per target Up to 64 predictors and 10,000 fitting rows
Numeric dependence All pairs screened; up to 496 pairs examined over 20,000 rows Up to 2,016 pairs over 50,000 rows
Functional dependencies Every eligible determinant/target screened; up to 16 determinants per target, verified over 200,000 rows Up to 32 determinants, verified over 500,000 rows
Decision tables / PRISM Up to six promising targets per pass Up to ten targets per pass

Predictor selection uses training rows. Nominal associations consider all eligible nominal columns. Arithmetic identities are fitted on a sample and their residuals are checked over all pair-complete input rows. Single-column key checks use exact full-column cardinality. Higher-order searches, category levels, and explanation output have additional budgets, described in report.coverage.

Samples use deterministic stratified row selection. They can miss rare patterns; shortlisting can miss weak or interaction-only signals. Coverage records samples, shortlists, and skipped work. Absence of a finding is not proof of independence.

Adjust the main relationship costs when needed:

report = onceover.profile(
    df,
    sample_rows=50_000,
    max_predictors=96,
    max_pairs=2_000,
)

These overrides keep exact column summaries and integrity checks on the full input. A deadline is soft: it skips later passes without interrupting a pass already running.

See the analysis notebook for planted examples, Altair charts, evidence, coverage, and a wide-table demonstration. Install its optional dependencies with pip install 'onceover[notebook]'. The scale benchmark measures runtime, peak resident memory, and recovery of relationships planted in the final columns:

pip install 'onceover[benchmark]'
python benchmarks/scale.py --rows 2000000 --columns 200 --output /tmp/onceover-scale.json

Development

python -m venv .venv
source .venv/bin/activate
pip install 'maturin>=1.15,<2' pytest scipy
maturin develop --release
cargo test --workspace --locked
pytest tests/

Publishing setup is described in RELEASING.md.

License

MIT. See LICENSE.

Metadata

Release files for onceover 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for onceover 0.1.0
File Size Uploaded Provenance Actions
onceover-0.1.0.tar.gz 213.0 kB With provenance Details for onceover-0.1.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for onceover 0.1.0
File Actions
onceover-0.1.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details for onceover-0.1.0-cp310-abi3-win_amd64.whl
onceover-0.1.0-cp310-abi3-manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64 Details for onceover-0.1.0-cp310-abi3-manylinux_2_28_x86_64.whl
onceover-0.1.0-cp310-abi3-manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.28+ ARM64 Details for onceover-0.1.0-cp310-abi3-manylinux_2_28_aarch64.whl
onceover-0.1.0-cp310-abi3-macosx_11_0_x86_64.whl CPython 3.10 abi3 macOS 11.0+ x86-64 Details for onceover-0.1.0-cp310-abi3-macosx_11_0_x86_64.whl
onceover-0.1.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details for onceover-0.1.0-cp310-abi3-macosx_11_0_arm64.whl

Total release size: 24.2 MB

Release files / onceover-0.1.0.tar.gz

Download URL onceover-0.1.0.tar.gz
Size 213.0 kB
Tags Source
SHA-256 checksum
How to use checksums
6ffb39e067529a0c99824c3ec003be766ef679104cd6f0654ccacf57e1d79c60
BLAKE2b-256 checksum
How to use checksums
ace828637aead7e1f4bee544452ed613b58d95b69faad92cb2063ca4b798556a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / onceover-0.1.0-cp310-abi3-win_amd64.whl

Download URL onceover-0.1.0-cp310-abi3-win_amd64.whl
Size 5.1 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
e899e2a1799a23a46842bced7d2c89e295abf7c5ffcec26d5eb92692d1a00db0
BLAKE2b-256 checksum
How to use checksums
497aef87b84d57b42755489c494d8c360530248869c7fa31969aa486c4ed0459
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / onceover-0.1.0-cp310-abi3-manylinux_2_28_x86_64.whl

Download URL onceover-0.1.0-cp310-abi3-manylinux_2_28_x86_64.whl
Size 5.0 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
9a54ccf0683412f8f742b8609b06a3794c8216cd6d600dafa753cf6446ddd449
BLAKE2b-256 checksum
How to use checksums
5cd0fe2f9935b31d20f6ddf6275936eecd58dc4862703777ecf5b09d27549ed0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / onceover-0.1.0-cp310-abi3-manylinux_2_28_aarch64.whl

Download URL onceover-0.1.0-cp310-abi3-manylinux_2_28_aarch64.whl
Size 4.6 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
ee1d57863e4ff2e765d84aab119c67d57fbfb1ccb7b21dd095dadadfdeaf6395
BLAKE2b-256 checksum
How to use checksums
9c275c9e89f0f93a8c10a8fcae015f426a961bda4c1bc2359f21ae56ad06201c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / onceover-0.1.0-cp310-abi3-macosx_11_0_x86_64.whl

Download URL onceover-0.1.0-cp310-abi3-macosx_11_0_x86_64.whl
Size 4.9 MB
Tags CPython 3.10 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
5de5c5521228f5ddd18d6882c74c026873800469d0c5225c86dd1d85e5622684
BLAKE2b-256 checksum
How to use checksums
c26280659f055f3be02c2baee8280a17e390351e595448803401f2f0b0a9dc37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / onceover-0.1.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL onceover-0.1.0-cp310-abi3-macosx_11_0_arm64.whl
Size 4.4 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4dad2625a4da9265cc665bc20301c1263474f769593ba4065f85860e0e6bb940
BLAKE2b-256 checksum
How to use checksums
2b0a61d0023ee2ac22875336d47ce53a8435eec959c09760fce08d0ee68e0cfd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Security for onceover 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for onceover-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page