Automated Data Cleaning Library with a Rust compute backend
Project description
AutomatedCleaning
AutomatedCleaning is a Python library for automated data cleaning, now powered by a Rust compute backend. It preprocesses and analyzes datasets โ handling missing values, outliers, spelling corrections, text cleaning, PII masking and more โ while the CPU-heavy work runs in compiled Rust for speed and true (GIL-free) parallelism.
Why Rust + Python?
The library is a hybrid: a friendly Python API on top, a fast Rust engine underneath.
- ๐ Python frontend โ the API you call, plus everything that leans on the Python ecosystem (Polars I/O, scikit-learn imputation, Plotly dashboards, Presidio PII, Claude AI).
- ๐ฆ Rust backend (
automatedcleaning._rustcore) โ the number-crunching and per-row string work: text preprocessing, symbol stripping, IQR outliers, skewness, correlation, multicollinearity and JSON detection.
You install one wheel and write normal Python โ the Rust is invisible.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ your code โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ import automatedcleaning as ac โ
โ df = ac.load_data("data.csv"); ac.clean_data(df) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ calls
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Python frontend (automatedcleaning/cleaning.py) โ
โ Polars โข scikit-learn โข Plotly โข Presidio โข LangChain โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ delegates hot loops
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ฆ Rust backend (_rustcore, built with PyO3 + rayon) โ
โ text cleaning โข skewness โข IQR โข correlation โข JSON detect โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Benchmark โ text preprocessing over 50,000 rows: ~3.8ร faster than the pure-Python path, with the GIL released so it scales across cores.
Features
- Supports both large (100+ GB) and small datasets
- Detects and handles missing values and duplicate records
- Identifies and corrects spelling errors in categorical values
- Detects and removes outliers (IQR)
- Detects and fixes data imbalance
- Identifies and corrects skewness in numerical data
- Checks for correlation and detects multicollinearity
- Analyzes cardinality in categorical columns
- Identifies and cleans text columns
- Detects JSON-type columns
- Detects and masks PII columns
- Performs univariate, bivariate, and multivariate analysis (interactive dashboard)
Installation
From PyPI (recommended)
pip install AutomatedCleaning
Prebuilt abi3 wheels are published for Linux, macOS and Windows and work on
CPython 3.11+ โ no Rust toolchain needed to install. The import name is also
automatedcleaning (import automatedcleaning as ac).
From source
Building from source requires the Rust toolchain (because the backend is compiled):
# 1. Install Rust (https://rustup.rs) and maturin
pip install maturin
# 2. Clone and build
git clone https://github.com/DataSpoof/dataspoof-data-cleaning.git
cd dataspoof-data-cleaning
# Build & install into the current environment
pip install .
# --- or, for development (needs an active virtualenv) ---
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
maturin develop --release
Quick start
import automatedcleaning as ac
# Load any CSV / TSV / JSON / Parquet file (via Polars)
df = ac.load_data("dataset.csv")
# Run the full interactive cleaning pipeline
df_cleaned = ac.clean_data(df, background_image_path="assets/gradient.png")
clean_data() walks the dataset through the whole pipeline and asks a few interactive
questions (column spelling fixes, categorical corrections, target column for imbalance).
It writes cleaned_data.csv and an EDA dashboard to output/eda/dashboard.html.
Using individual steps
Every stage is also a standalone function you can call directly โ useful for scripting or building your own non-interactive pipeline. These delegate to the Rust backend:
import polars as pl
import automatedcleaning as ac
df = ac.load_data("dataset.csv")
df = ac.detect_column_types_and_process_text(df) # classify + clean text columns (Rust)
df = ac.handle_negative_values(df) # negatives -> absolute values (Rust)
df = ac.replace_symbols(df) # strip $ โน , - โข (Rust)
df = ac.handle_missing_values(df) # KNN impute + mode fill (Python/sklearn)
df = ac.handle_duplicates(df) # drop duplicate rows (Polars)
df = ac.remove_outliers(df) # IQR outlier removal (Rust)
df = ac.fix_skewness(df) # log-transform skewed columns (Rust)
df = ac.check_multicollinearity(df, threshold=0.7)# drop correlated features (Rust)
df, cardinality = ac.check_cardinality(df) # report + drop constant columns
df = ac.fix_json_columns(df) # expand JSON columns (Rust detection)
df = ac.detect_and_mask_pii_polars(df) # detect + mask PII (Presidio)
ac.generate_dashboard(df) # Plotly EDA dashboard
ac.save_cleaned_data(df, "cleaned_data.csv")
Text preprocessing on its own
ac.preprocess_text("I can't wait!! Visit https://x.co @bob ๐ it's GR8")
# -> 'cannot wait visit'
Additional cleaning steps (automatedcleaning.steps)
Beyond the core pipeline, ~45 focused, composable steps are available directly
on ac.*. String-heavy ones (whitespace, Unicode NFKC, mojibake, disguised-missing,
booleans) run in the Rust backend.
df = ac.standardize_column_names(df) # trim/lowercase/snake_case/de-dupe
df = ac.drop_empty_rows_and_columns(df)
df = ac.drop_high_missing_columns(df, 0.5)
df = ac.remove_duplicate_columns(df)
df = ac.drop_id_like_columns(df)
df = ac.replace_disguised_missing(df, numeric_sentinels=[999, -1]) # "NA","?"โฆ -> null (Rust)
df = ac.add_missing_indicators(df)
df = ac.impute_missing(df, numeric_strategy="mice") # mean|median|knn|mice|interpolate|ffill|bfill
df = ac.normalize_whitespace(df) # Rust
df = ac.normalize_unicode(df) # NFKC + control-char strip (Rust)
df = ac.fix_mojibake(df) # "รยฉ" -> "รฉ" (Rust)
df = ac.standardize_casing(df, {"name": "title"})
df = ac.parse_dates(df, ["signup"]) # -> native datetime
df = ac.extract_date_parts(df, ["signup"]) # year/month/day/weekday/quarter
df = ac.normalize_booleans(df, ["active"]) # yes/no/Y/N/1/0 -> bool (Rust)
df = ac.downcast_numeric(df) # int64->int32, etc.
df = ac.group_rare_categories(df, 0.01)
df = ac.fuzzy_cluster_categories(df) # merge "New York"/"newyork" (rapidfuzz)
df = ac.encode_categorical(df, "onehot") # onehot|label|frequency|ordinal|target
df = ac.remove_outliers_zscore(df) # + _mad, _isolation_forest, _by_group
df = ac.winsorize(df) # cap instead of drop
df = ac.fuzzy_deduplicate(df, ["name","email"])
df = ac.scale_numeric(df, "standard") # minmax|standard|robust
df = ac.bin_numeric(df, ["age"], bins=5)
df = ac.apply_range_rules(df, {"age": (0, 120)}, action="clip")
df = ac.validate_formats(df, {"email": "email", "phone": "phone"})
df = ac.normalize_phone_numbers(df, ["phone"], region="US") # -> E.164
df = ac.normalize_emails(df, ["email"]); df = ac.canonicalize_urls(df, ["site"])
Steps that need optional libraries (detect_language, redact_profanity,
correct_spelling_text) are installed via the extra:
pip install "AutomatedCleaning[text]"
Supported file formats
load_data() reads .csv, .tsv, .json, and .parquet (Excel must be converted first).
Requirements
- Python โฅ 3.11
- Key runtime deps (installed automatically):
polars,pandas,numpy,pyarrow,nltk,scikit-learn,matplotlib,seaborn,missingno,plotly,pyfiglet,langchain-anthropic,presidio-analyzer,presidio-anonymizer - The automatic categorical spell-correction step optionally uses the Anthropic Claude API (you'll be prompted for a key); you can skip it or correct values manually.
Building & contributing
The project uses maturin as its build backend (pyproject.toml). See
BUILD.md for the full architecture and build/publish guide.
Cargo.toml # Rust crate config
src/
lib.rs # PyO3 module โ functions exposed to Python
text.rs # text preprocessing (contractions, regex, stopwords)
stats.rs # skewness, IQR, correlation, multicollinearity
automatedcleaning/ # Python frontend package
Cross-platform wheels are built and published to PyPI automatically via GitHub Actions
(.github/workflows/CI.yml) on every tagged release (vX.Y.Z).
License
MIT ยฉ Abhishek Kumar Singh / DataSpoof
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file automatedcleaning-1.7.0.tar.gz.
File metadata
- Download URL: automatedcleaning-1.7.0.tar.gz
- Upload date:
- Size: 188.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0bd99fbdf6f34e0fce7201151c11fe2089c0d56d14540717f5c4558c928ebe68
|
|
| MD5 |
91ee4bd8db0b41652a881da0ba58115d
|
|
| BLAKE2b-256 |
a09c6eb33cfaa2153169b5fb1d7eaa1c0d55eb11a7b1608cbb502322794d6d2f
|
File details
Details for the file automatedcleaning-1.7.0-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: automatedcleaning-1.7.0-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 825.1 kB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c26ac19fd50246a3323c19ff7a3c0e599293221c34bdec282fcea34b90e1334
|
|
| MD5 |
36646cb4f6a888c63d6e1cfdcd29f2df
|
|
| BLAKE2b-256 |
46d609996c694cb12c654ec3c686c777e3b054861fa0c54052ee7670309c724f
|