Skip to main content

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)

Source distribution for dataproof 0.1.0
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)

Table of built distributions (wheels) for dataproof 0.1.0
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

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