Production-grade data quality checks with pluggable LLM reporting (AWS Bedrock, Ollama, OpenAI-compatible).
Project description
qualipilot
Production-grade data quality checker for Python. Runs structural and statistical checks on any tabular dataset (CSV / Parquet / JSON / Pandas / Polars / Dask / cuDF) and, optionally, asks an LLM — AWS Bedrock, Ollama, or any OpenAI-compatible endpoint — to narrate the findings.
- swap engines with one flag (Polars default, Pandas/Dask/cuDF on demand)
- swap LLM providers the same way (
--llm bedrock|ollama|openai|none) - one-click install, docker-compose for local runs, terraform for Lambda
- typed Pydantic results, deterministic JSON output, exit-code severity gate for CI pipelines
Install
One-click (recommended)
# macOS / Linux
./install.sh --all # core + every optional extra
./install.sh --bedrock # core + boto3
./install.sh --dev # editable + dev + pre-commit
# Windows PowerShell
.\install.ps1 -Extras all
Manual
pip install qualipilot # core
pip install "qualipilot[bedrock]" # + boto3 for AWS Bedrock
pip install "qualipilot[ollama]" # + httpx (already core)
pip install "qualipilot[dask]" # + dask[dataframe]
pip install "qualipilot[all]" # everything except cuDF
cuDF (GPU) needs the RAPIDS conda channel — see docs.rapids.ai/install.
Quickstart (CLI)
qualipilot check data.csv \
--engine polars \
--range amount=0,100000 \
--output reports/data.quality.html \
--llm bedrock \
--model anthropic.claude-3-5-haiku-20241022-v1:0 \
--region us-east-1 \
--fail-on warn
--outputcan be.json,.html, or.md; format is inferred.--fail-on {ok,warn,error}decides when the CLI returns a non-zero exit code — wire it straight into CI.- All flags have
--configequivalents; seeexamples/config.yaml.
Quickstart (Python)
import pandas as pd
from qualipilot import DataQualityChecker, QualipilotConfig
from qualipilot.models.config import CheckConfig, ColumnRange, LLMConfig
df = pd.read_csv("orders.csv")
config = QualipilotConfig(
engine="polars",
checks=CheckConfig(
column_ranges={"amount": ColumnRange(min=0, max=100_000)},
),
llm=LLMConfig(
provider="bedrock",
model="anthropic.claude-3-5-haiku-20241022-v1:0",
region="us-east-1",
),
)
report = DataQualityChecker(df, config).run()
print(report.to_json())
print(report.llm_report)
What it checks
| Check | Default | Description |
|---|---|---|
missing_values |
on | per-column null counts + percentage |
duplicates |
on | global duplicate rows (subset-aware) |
data_types |
on | dtype rollup per column |
outliers |
on | IQR rule, Q1/Q3 computed in one pass |
ranges |
on | user-supplied [min, max] per column |
cardinality |
on | distinct count + top-10 values |
freshness |
off | max-timestamp vs freshness_max_age_hours |
Each check returns a typed CheckResult with severity ok / warn / error, a duration, a JSON-safe payload, and any captured exception.
Engines
| Engine | When to use |
|---|---|
polars (default) |
in-memory data up to ~10 GB — 8× faster than pandas |
pandas |
legacy integrations that need pandas-native output |
dask |
larger-than-memory data or multi-worker clusters |
cudf |
single-node GPU acceleration (RAPIDS required) |
--engine auto inspects the input object and picks the fastest safe
backend (Polars for single-node, Dask for already-Dask frames, cuDF
when a GPU frame is handed in).
LLM providers
| Provider | --llm |
Required |
|---|---|---|
| None (default) | none |
nothing |
| AWS Bedrock (Converse API) | bedrock |
boto3, IAM bedrock:Converse |
| Ollama | ollama |
running ollama server |
| OpenAI-compatible | openai |
base URL + API key |
Bedrock uses the Converse API, so the same code path works for
Anthropic Claude, Meta Llama, Mistral, Cohere, etc. — you just change
model=....
Deploy
Docker (local Ollama stack)
docker compose -f docker/docker-compose.yml up --build
This brings up ollama and a qualipilot container wired to it, and
runs the sample check end-to-end.
AWS Lambda (container image)
cd deploy/terraform
terraform init
terraform apply -var project=qualipilot -var aws_profile=sre-tea
# build + push the image to the ECR repo terraform just made
aws ecr get-login-password | docker login --username AWS --password-stdin \
$(terraform output -raw ecr_repository_url | cut -d/ -f1)
docker build -f ../../docker/Dockerfile.lambda -t qualipilot-lambda:latest ../..
docker tag qualipilot-lambda:latest "$(terraform output -raw ecr_repository_url):latest"
docker push "$(terraform output -raw ecr_repository_url):latest"
aws lambda update-function-code \
--function-name qualipilot \
--image-uri "$(terraform output -raw ecr_repository_url):latest"
Invoke with:
aws lambda invoke \
--function-name qualipilot \
--payload '{"s3_uri":"s3://my-bucket/events.parquet"}' \
response.json
Report lands at s3://my-bucket/reports/events.quality.json.
Development
./install.sh --dev
make lint typecheck test
- Ruff for lint + format, MyPy in strict mode, pytest with coverage.
- Pre-commit runs the same locally before every commit.
pytest -m integrationruns tests that need real AWS/Bedrock credentials.
Record linkage / probabilistic dedup
Beyond exact duplicates, qualipilot ships an in-house Fellegi-Sunter linker — no external splink dependency. Polars blocking, rapidfuzz string distance, numpy EM. 1M rows in ~10 s on a laptop.
qualipilot link customers.csv \
--id customer_id \
--compare "name:fuzzy:0.92,0.75" \
--compare "postcode:exact" \
--block "postcode" \
--threshold 0.9
Full details: docs/LINKING.md.
Docs
docs/ARCHITECTURE.md— module layout + data flowdocs/LINKING.md— probabilistic dedup / linkagedocs/DEEP_DIVE.md— audit of the v1 codebasedocs/DEPLOY.md— cloud + on-prem deployment notesdocs/MIGRATION.md— upgrading from v1.xdocs/RUST_CONVERSION.md— should we port to Rust? (tldr: hybrid, not rewrite)
License
MIT.
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 qualipilot-2.0.1.tar.gz.
File metadata
- Download URL: qualipilot-2.0.1.tar.gz
- Upload date:
- Size: 48.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
587afd3490304ebad7d3b6616b4eec2c4e63ee518ce20156be034f907cc00e34
|
|
| MD5 |
200a3048090aac591290a268df30f3b5
|
|
| BLAKE2b-256 |
efee530148ecf6cba78278103e2fb013873dab789df1211317182ec859780acd
|
Provenance
The following attestation bundles were made for qualipilot-2.0.1.tar.gz:
Publisher:
release.yml on Sarvesh-GanesanW/dataqualitychecker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qualipilot-2.0.1.tar.gz -
Subject digest:
587afd3490304ebad7d3b6616b4eec2c4e63ee518ce20156be034f907cc00e34 - Sigstore transparency entry: 1395060089
- Sigstore integration time:
-
Permalink:
Sarvesh-GanesanW/dataqualitychecker@b1895aabbb1eebabdf7e0e88087d050c6a021b4e -
Branch / Tag:
refs/tags/v2.0.1 - Owner: https://github.com/Sarvesh-GanesanW
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b1895aabbb1eebabdf7e0e88087d050c6a021b4e -
Trigger Event:
push
-
Statement type:
File details
Details for the file qualipilot-2.0.1-py3-none-any.whl.
File metadata
- Download URL: qualipilot-2.0.1-py3-none-any.whl
- Upload date:
- Size: 72.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16c7805eda4bf109000d38942b3b3c8aabb00c7540ad049459016c2ebf21ab0c
|
|
| MD5 |
ba96adfe544569da4d790df217d7fbbc
|
|
| BLAKE2b-256 |
ffe2736a2b95aa865429df26ec3fe28312910f87c405e25cd5bbeb8abd89302d
|
Provenance
The following attestation bundles were made for qualipilot-2.0.1-py3-none-any.whl:
Publisher:
release.yml on Sarvesh-GanesanW/dataqualitychecker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qualipilot-2.0.1-py3-none-any.whl -
Subject digest:
16c7805eda4bf109000d38942b3b3c8aabb00c7540ad049459016c2ebf21ab0c - Sigstore transparency entry: 1395060094
- Sigstore integration time:
-
Permalink:
Sarvesh-GanesanW/dataqualitychecker@b1895aabbb1eebabdf7e0e88087d050c6a021b4e -
Branch / Tag:
refs/tags/v2.0.1 - Owner: https://github.com/Sarvesh-GanesanW
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b1895aabbb1eebabdf7e0e88087d050c6a021b4e -
Trigger Event:
push
-
Statement type: