DataReady 🧹
ML dataset quality scanner, scorer, and auto-fixer — in 3 lines of code.
DataReady scans your CSV/DataFrame for 20+ data quality issues, scores it 0–100, and interactively fixes problems — before you train your ML model.
import pandas as pd
from dataready import DataReady
df = pd.read_csv("data.csv")
dr = DataReady(df, target_col="label")
dr.scan()
clean_df = dr.fix()
That's it.
Why DataReady?
Most ML bugs come from dirty data — missing values, ID columns accidentally left in, boolean columns stored as "yes"/"no" strings, outliers that skew your model. DataReady catches all of these before training, not after.
Installation
pip install dataready
Requirements: Python ≥ 3.9, pandas ≥ 1.5, numpy ≥ 1.23
Quick Start
import pandas as pd
from dataready import DataReady
df = pd.read_csv("student_performance.csv")
dr = DataReady(df, target_col="passed")
# 1. Scan — prints a full quality report in the terminal
dr.scan()
# 2. Fix — interactive prompt before each fix
clean_df = dr.fix()
# 3. Or auto-approve all fixes
clean_df = dr.fix(auto_approve=True)
# 4. Export a standalone HTML report
dr.export_report("report.html")
What It Detects
| Issue | Severity | Auto-Fix |
|---|---|---|
| Missing values | warning / critical | ✅ Median / mode imputation, drop if >80% null |
| Duplicate rows | warning / critical | ✅ Drop duplicates |
| Outliers (IQR) | warning / critical | ✅ Winsorization |
| High skewness | warning / critical | ✅ log1p transform |
| ID / key columns | warning | ✅ Drop column |
| Single-value columns | critical | ✅ Drop column |
| Near-zero variance | warning | ✅ Drop column |
| High cardinality | warning | ✅ Group rare categories as "Other" |
| Numeric stored as string | warning | ✅ Convert to float64 |
| Boolean stored as string | info | ✅ Convert to bool |
| Datetime stored as string | info | ✅ Convert to datetime64 |
| Mixed types in column | warning | ✅ Cast to string |
| High correlation (multicollinearity) | warning | ✅ Drop redundant column |
| Leading/trailing whitespace | info | ✅ Strip whitespace |
| Encoding corruption | warning | ✅ Remove corrupt characters |
| Class imbalance | warning / critical | ❌ Manual (SMOTE / class weights) |
| Data leakage | critical | ✅ Drop leaking column |
Quality Score
Every dataset gets a 0–100 quality score with a letter grade:
| Score | Grade | Label |
|---|---|---|
| 100 | A+ | Perfect — ML-ready |
| 90–99 | A | Excellent |
| 75–89 | B | Good — minor issues |
| 60–74 | C | Fair — needs attention |
| 40–59 | D | Poor — significant cleaning needed |
| < 40 | F | Critical — major work required |
Terminal Output Example
============================================================
DataReady — Dataset Quality Report
============================================================
Shape : 500 rows × 11 columns
Issues : 5 found
Quality Score
86.0 / 100 [█████████████████░░░] Grade: B
Good — minor issues to address
[WARNING] — 2 issue(s)
1. 'parent_education' has 117 missing values (23.4%)
2. 'student_id' is an ID/key column (500 unique, 100% unique)
[INFO] — 3 issue(s)
1. 'internet_access' looks boolean but stored as string
2. 'extracurricular' looks boolean but stored as string
3. 'passed' looks boolean but stored as string
============================================================
5 of 5 issues are auto-fixable. Call .fix() to apply.
============================================================
HTML Report
dr.export_report("report.html")
Opens in any browser. Includes score, grade, all issues, score breakdown, and a column-by-column detail table.
API Reference
dr = DataReady(df, target_col=None, use_color=True)
dr.scan() # run checks, print report → returns self
dr.fix(auto_approve=False) # interactive or auto fix → returns clean DataFrame
dr.export_report("report.html") # save HTML report → returns path
dr.score() # → dict {score, grade, label, breakdown}
dr.issues() # → list of Issue objects
dr.summary() # print one-line summary
target_col
Optional. Enables two extra checks:
- Class imbalance — is your target unevenly distributed?
- Data leakage — is any feature suspiciously correlated with the target?
Advanced: scan only specific columns
feature_cols = ["age", "score", "income", "label"]
dr = DataReady(df[feature_cols], target_col="label")
Interactive Fixer
[1/5] WARNING: 'parent_education' has 117 missing values (23.4%)
Apply this fix? [y]es / [n]o / [a]ll / [q]uit :
- y — apply this fix
- n — skip this fix
- a — apply this and all remaining fixes
- q — quit the fixer
Contributing
Pull requests are welcome! To get started:
git clone https://github.com/yourusername/dataready.git
cd dataready
pip install -e ".[dev]"
pytest tests/
Please open an issue first for major changes.
License
MIT © 2025 — free to use, modify, and distribute.
Metadata
Release files for dataready 0.2.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 |
|---|---|---|---|---|
| dataready-0.2.0.tar.gz | 23.2 kB | Without provenance | Details for dataready-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dataready-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for dataready-0.2.0-py3-none-any.whl |
Total release size: 45.2 kB
Release files / dataready-0.2.0.tar.gz
| Download URL | dataready-0.2.0.tar.gz |
|---|---|
| Size | 23.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e64a5a63d7dcf981280fd416f5a0cb5a57d776c231cfc21ee52b7c099f4c99b7
|
|
BLAKE2b-256 checksum How to use checksums |
f379721195d399e9cbae5c8f3adf0215b944ef5d4552db08940f53a94d99cb6c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|
Release files / dataready-0.2.0-py3-none-any.whl
| Download URL | dataready-0.2.0-py3-none-any.whl |
|---|---|
| Size | 22.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
004a7c6dbed7ca7244c20b65f2f04b48a63718d511d526ab6f6663b457178d26
|
|
BLAKE2b-256 checksum How to use checksums |
f999497c95f9c0f4b319d51643aad2166af47442cea21d54d842ab53db7bd63d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|
Security for dataready 0.2.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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
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.