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.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| onceover-0.1.1.tar.gz | 231.5 kB | With provenance | Details for onceover-0.1.1.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| onceover-0.1.1-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details for onceover-0.1.1-cp310-abi3-win_amd64.whl |
| onceover-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details for onceover-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl |
| onceover-0.1.1-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details for onceover-0.1.1-cp310-abi3-manylinux_2_28_aarch64.whl |
| onceover-0.1.1-cp310-abi3-macosx_11_0_x86_64.whl | CPython 3.10 | abi3 | macOS 11.0+ x86-64 | Details for onceover-0.1.1-cp310-abi3-macosx_11_0_x86_64.whl |
| onceover-0.1.1-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details for onceover-0.1.1-cp310-abi3-macosx_11_0_arm64.whl |
Total release size: 24.6 MB
Release files / onceover-0.1.1.tar.gz
| Download URL | onceover-0.1.1.tar.gz |
|---|---|
| Size | 231.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fe46133f7cab30e945fb46917a106a4e9f869cfe82b0c21a9744f6fe6b46fb82
|
|
BLAKE2b-256 checksum How to use checksums |
f617ba2a9cd766f06132315cfcd7877c5138966730d03755c93414eba6489e76
|
| 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 27, 2026.
Transparency logRelease files / onceover-0.1.1-cp310-abi3-win_amd64.whl
| Download URL | onceover-0.1.1-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 5.2 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
0583b3d145228e037b04f3d05bef49df755d4571a3b75493b42a848cddf932c0
|
|
BLAKE2b-256 checksum How to use checksums |
1793b550e6549c7f549abf982f08c76973ae5522d8091c215afa9f4b83053e4d
|
| 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 27, 2026.
Transparency logRelease files / onceover-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | onceover-0.1.1-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f7028bcc75fa77896cf4f33c62934617eb5b66be9713f51a52c3cbbc21d1504e
|
|
BLAKE2b-256 checksum How to use checksums |
dfc031d218eb212ae0993d6c237b6bbdc9478a5218727180faedb0a1c9f53f77
|
| 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 27, 2026.
Transparency logRelease files / onceover-0.1.1-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | onceover-0.1.1-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
810e0bf6f72c2a320f5c2b91a7753a3c82967e05f8ed5633b9b8e59481aa5dab
|
|
BLAKE2b-256 checksum How to use checksums |
12540f483e968253e7af0b291a6d4c3732e478f113eb19d8773c8657649f756c
|
| 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 27, 2026.
Transparency logRelease files / onceover-0.1.1-cp310-abi3-macosx_11_0_x86_64.whl
| Download URL | onceover-0.1.1-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 |
c67bee4d68ea4f34a0936fedce660c027b077cc7982f32042989a4836e521f0f
|
|
BLAKE2b-256 checksum How to use checksums |
07a3848037d47a366807c4c28f72b45a5610ed214ac0ad976dda6fa421a000d9
|
| 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 27, 2026.
Transparency logRelease files / onceover-0.1.1-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | onceover-0.1.1-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7820f4ba57d04be479011050f00f61f132e538195fd78dfbcd72334113b029c9
|
|
BLAKE2b-256 checksum How to use checksums |
40c56eb3ea018f09192702c7c358dffa8fcffde5672113fda333b9357f794b28
|
| 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 27, 2026.
Transparency logSecurity for onceover 0.1.1
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.
Attestation for onceover-0.1.1.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 27, 2026.
Transparency logA 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.