AndreaBozzo/dataprof
AndreaBozzo/dataprof has 34 GitHub stars and 28 forks. GitHot measured 0 stars in 24 hours, +1 in 7 days, and +3 in 15 days. Last checked 2026-11-12 16:23 UTC. Last push 2026-11-04.
Data profiling and quality gates for CSV, JSON, Parquet and DataFrames. Rust core, Python API.
What you can do
- Same data, same numbers. CSV, Parquet, pandas, polars and Arrow of the same values produce the same profile, on every engine. CI checks it.
- Bounded memory. Files larger than RAM stream through fixed-size accumulators.
- Honest verdicts. A sampled or partial scan never passes a claim about the whole file; scores carry their confidence interval.
- Absence is not zero. A metric that wasn't computed is None, never a plausible default.
측정된 스타 증가
- in 24h
- 0
- in 7 days
- +1
- in 15 days
- +3
- in 1 month
- 기록 수집 중
서로 겹치는 기간의 순증가량이며 일별 합계가 아닙니다. 측정값이 없으면 비워 둡니다. 스타는 관심도를 나타내며 품질을 보장하지 않습니다.
README.md
Original
dataprof
Know what's in your data before it ships.
dataprof profiles CSV, JSON, Parquet, DataFrames and Arrow tables in one call: types, nulls, distributions, patterns and a quality score. Then it can gate your pipeline on what it found. It runs locally, gives the same numbers for the same data whichever way you load it, and says "can't tell" instead of guessing.
A Rust library with a Python package on top. No server, no account, no network.
Install
pip install dataprof # or: uv pip install dataprof
Wheels for CPython 3.11 to 3.15 on Linux, macOS and Windows, with no Python dependencies.
Profile a file
import dataprof as dp
report = dp.profile("orders.csv") # also .json, .jsonl, .parquet, DataFrames, dicts
print(report.rows, "rows,", report.columns, "columns, quality", report.quality_score)
amount = report["amount"]
print(amount.data_type, amount.mean, amount.null_percentage)
Ask it what deserves attention. Each finding has a stable code and the evidence behind it, never a raw value:
for finding in report.findings():
print(finding.severity, finding.code, finding.column)
# warning locale_numbers price ("10,50"-style numbers, left out of the stats)
# warning null_heavy email
# info sensitive_pattern email
Gate a pipeline
State what "good enough" means and get a verdict: pass, fail, or inconclusive when the data can't prove it either way.
result = report.check(
min_quality_score=90, max_null_count={"customer_id": 0}, max_null_percentage={"*": 20}
)
if not result.passed:
for check in result.violations:
print(check.code, check.column, check.message)
Or from CI, with no code at all:
python -m dataprof.check orders.csv --min-quality 90 --max-null "*=20"
# exit 0 = pass, 1 = fail, 2 = inconclusive, 3 = an argument, policy, input, baseline or output error
# Or against the last accepted run: fail if quality drops more than 5 points.
python -m dataprof.check orders.csv --baseline accepted.json --max-quality-drop 5
Hand it to an agent
A token-bounded summary for an LLM. Values that look like personal data are never echoed:
print(report.to_llm_context(max_tokens=500))
Use it from Rust
cargo add dataprof
use dataprof::{Profiler, QualityPolicy, Verdict};
let report = Profiler::new().analyze_file("orders.csv")?;
let result = QualityPolicy::new().min_quality_score(90.0).evaluate(&report)?;
assert_eq!(result.verdict, Verdict::Pass);
Minimum supported Rust: 1.96.
What you can count on
- Same data, same numbers. CSV, Parquet, pandas, polars and Arrow of the same values produce the same profile, on every engine. CI checks it.
- Bounded memory. Files larger than RAM stream through fixed-size accumulators.
- Honest verdicts. A sampled or partial scan never passes a claim about the whole file; scores carry their confidence interval.
- Absence is not zero. A metric that wasn't computed is
None, never a plausible default. - Private by default. Reports and summaries carry counts and patterns, not your values.
Status
Beta, and moving fast toward a stable 1.0 contract. Some things are still narrow, and we'd rather tell you than have you find out: numbers written with a decimal comma are detected and flagged but not yet parsed, and beyond empty, null and nan, only a fixed set of markers (NA, N/A, n/a, #N/A, \N, None, matched exactly, ignoring surrounding whitespace) counts as null, so a sentinel like - or -999 is still a value. The release notes list what changed and what's known.
Found something wrong? Open an issue. A file that profiles badly is the most useful bug report there is.
Learn more
- Why dataprof?: profiling and quality gates compared with summaries, visual reports and validation tools, including when to pick each
- Getting started: the metrics and how to read them
- Python API: every function, the gate and the CI entrypoint
- Examples: a messy CSV, an ETL gate, before and after cleaning, a checkpoint against the last accepted run, runnable from a clean checkout
- Agent workflows: AGENTS.md, Cursor rules and Claude Code skills
- Report schema: the saved document and its guarantees
- Database connectors and feature flags: Rust-side options
- Changelog and contributing
Citing dataprof
Use Cite this repository in the GitHub sidebar, which builds APA and BibTeX from CITATION.cff. The citation is for the software; benchmark material lives in scalcom2026-dataprof.
License
Either the MIT License or the Apache License, Version 2.0, at your option.
관련 프로젝트 살펴보기
Asabeneh/30-Days-Of-Python
30 Days of Python 프로그래밍 챌린지는 Python 프로그래밍 언어를 30일 동안 배우기 위한 단계별 가이드입니다. 이 챌린지는 100일 이상 걸릴 수 있습니다. 자신의 속도에 맞춰 진행하세요. 다음 동영상도 도움이 될 수 있습니다: https://www.youtube.com/channel/UC7PNRuno1rzYPb1xLa4yktw
78,618 스타grafana/grafana
개방적이고 조합 가능한 옵저버빌리티 및 데이터 시각화 플랫폼입니다. Prometheus, Loki, Elasticsearch, InfluxDB, Postgres 등 여러 소스의 메트릭, 로그, 트레이스를 시각화합니다.
77,859 스타redis/redis
실시간 데이터 기반 애플리케이션을 구축하는 개발자에게 Redis는 가장 선호되고, 가장 빠르며, 기능이 가장 풍부한 캐시, 데이터 구조 서버이자 문서 및 벡터 쿼리 엔진입니다.
77,472 스타apache/superset
Apache Superset는 데이터 시각화 및 데이터 탐색 플랫폼입니다.
75,495 스타