dataproof
Find out what your dataframe code actually did.
import pandas as pd, dataproof
with dataproof.observe() as report:
orders = pd.read_csv("orders.csv")
clean = orders.dropna()
joined = clean.merge(tiers, on="customer_id")
gold = (joined.tier == "gold").sum()
print(f"gold customers: {gold}")
print(report)
gold customers: 0
dataproof: 1 finding(s)
- dropna() removed ALL 122 rows — a row was dropped if any value in it was
null. Pass how='all', a subset=[...] of columns that matter, or thresh=N
to keep partly-populated rows. [analysis.py:5]
The answer was zero. The real answer was 33. One column in that file was
entirely empty, so every row contained a null, so dropna() removed all of
them — and pandas said nothing, because nothing went wrong as far as pandas is
concerned.
That is the problem this solves. Not crashes: crashes are easy. Plausible answers that are quietly wrong.
What it watches for
| Silent row loss | dropna() that empties a frame, deduplication that removes most of it |
| Join fan-out | a repeated key multiplying rows instead of pairing them |
| Joins that matched nothing | usually a type mismatch — 1 and "1" do not join |
| Unmatched rows in a left join | row count unchanged, but a third of the result is null on one side |
| Numbers stored as text | statistics silently computed over nothing |
| Derived correlations | r = 1.000 because one column was computed from the other |
| Sparse columns | a confident mean resting on 4 of 60 values |
What it does not do
It does not change your results. Every wrapped call returns exactly what pandas returned. The code inside the block is ordinary pandas.
It does not ask you to write differently. No new API to learn, no wrapper types, no rewriting a pipeline to use someone else's functions. That is deliberate — a verification tool you have to remember to call is one you will not call.
It does not cry wolf. Every threshold here exists because a noisier version was tried and rejected. A group-by is not a 96% row loss. A few points beyond the IQR fence are not outliers worth reporting unless they actually move the mean. A finding that fires on correct code teaches you to skip all of them, which is worse than having none.
Install
pip install dataproof
Pandas is the only dependency.
Also useful
Check any frame on demand, without a block:
dataproof.Report().check(df)
Use it as an assertion in a pipeline or a notebook:
with dataproof.observe() as report:
...
assert report.ok, str(report)
Why this exists
It came out of building a data library for AI agents, and measuring what agents actually do. Given six purpose-built tools and a free choice, an agent used none of them and wrote pandas — correctly. The tools were not the problem. The problem was that neither the agent nor the person reading its answer could tell when an operation had quietly destroyed the data.
Agents now write a great deal of dataframe code, at a speed no one reviews line
by line. They are good at it. But dropna() behaves the same for everyone, and
the failure is silent for everyone.
MIT licensed.
Metadata
Release files for dataproof 0.1.0
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 |
|---|---|---|---|---|
| dataproof-0.1.0.tar.gz | 11.7 kB | With provenance | Details for dataproof-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dataproof-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for dataproof-0.1.0-py3-none-any.whl |
Total release size: 22.3 kB
Release files / dataproof-0.1.0.tar.gz
| Download URL | dataproof-0.1.0.tar.gz |
|---|---|
| Size | 11.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0fe734f9d8c87735b5ec06abc692506a1a69b13f0ec40adc3db9f417b5840896
|
|
BLAKE2b-256 checksum How to use checksums |
c3c6f4f044222db52c631d88f0ed31b432d5c8b17ed87db8c044f86602d0ad78
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 20, 2026.
Transparency logRelease files / dataproof-0.1.0-py3-none-any.whl
| Download URL | dataproof-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
078504f8fab4812f9773adef2892f7942d6dd8a488a53b8bbac1353cfb7d1c23
|
|
BLAKE2b-256 checksum How to use checksums |
b37c231c29aaa1ea23498e3ba0d8839b01d841ca40dbf15c3c36d723c71fb94f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 20, 2026.
Transparency logSecurity for dataproof 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
Both files in this release have been uploaded with provenance metadata.
Attestation for dataproof-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 20, 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.