Eliza DQ
The fastest open-source data quality engine for Python.
259M rows. 17 checks. Samples. 1.5 seconds.
Eliza DQ validates DataFrames and warehouse tables with streaming execution, parallel SQL pushdown, and instant failure sampling. It runs on Polars LazyFrames (constant memory, no matter the data size), connects to 8 warehouses, and ships with 2 dependencies.
pip install eliza-dq
from eliza import check
result = check("data.parquet", checks={
"order_id": ["not_null", "unique"],
"amount": ["not_null", "not_negative"],
"email": ["is_email"],
})
print(result.summary())
# 3 passed, 0 warnings, 2 failed (1,000,000 rows, 3ms)
Benchmarks
DataFrame Engine
In-memory Polars DataFrame, 5 checks, warmup + 3 runs, min time.
| Rows | Eliza | Cuallee | Pandera | Pointblank | GX |
|---|---|---|---|---|---|
| 3M | 1.6ms | 5.3ms | 5.7ms | 35ms | 331ms |
| 10M | 4.5ms | 13ms | - | - | - |
| 41M | 14ms | 29ms | - | - | - |
| 126M | 40ms | 89ms | 118ms | 1,453ms | 4,400ms |
| 259M | 1.5s | OOM | OOM | OOM | OOM |
Eliza streams from disk via LazyFrames — constant memory regardless of file size. Competitors must load the entire dataset into RAM.
SQL Pushdown Engine
Athena, 179M rows (crossref_silver), 8 not_null checks.
| Eliza | Soda Core | |
|---|---|---|
| Without samples | ~10s | 22.4s |
| With samples (10 rows) | 16.8s | DNF (killed after 5 min) |
| 17 checks + samples | 18.4s | - |
Eliza batches all inline checks into one
SELECT, runs separate checks and samples in parallel, and usesLIMIT Non sample queries. Soda runs queries sequentially and fetches ALL failing rows before truncating in memory.
Eliza vs Competitors
Features
| Feature | Eliza | Soda | GX | Pandera | Cuallee | Dataframely |
|---|---|---|---|---|---|---|
| Polars native | Yes | - | - | Yes | Yes | Yes |
| LazyFrame streaming | Yes | - | - | - | - | - |
| SQL pushdown | 8 DWH | Yes | Yes | - | - | - |
| Parallel SQL queries | Yes | - | - | - | - | - |
| Failed row samples | LIMIT N |
All rows* | - | - | - | All rows* |
| YAML config | Yes | Yes | Yes | - | - | - |
| Inline dict API | Yes | - | - | Yes | Yes | Yes |
| CLI | Yes | Yes | Yes | - | - | - |
| Auto-learn from data | Yes | - | Yes | Yes | - | - |
| PDF report | Yes | - | - | - | - | - |
| Slack alerting | Yes | Cloud** | - | - | - | - |
| Partition filter | Yes | Yes | Yes | - | - | - |
| Schema validation | Yes | Yes | Yes | Yes | - | Yes |
| FK reference check | Yes | Yes | Yes | - | - | - |
| Core dependencies | 2 | 30+ | 30+ | 7+ | 3+ | 2 |
* Materializes all failing rows in memory before truncating — causes OOM/timeout on large failures.
** Soda Slack alerting requires Soda Cloud ($25k+/yr).
Checks
| Check | Eliza | Soda | GX | Pandera | Cuallee |
|---|---|---|---|---|---|
| not_null | Yes | Yes | Yes | Yes | Yes |
| not_missing (custom) | Yes | Yes | Yes | - | - |
| unique | Yes | Yes | Yes | Yes | Yes |
| not_negative | Yes | Yes | Yes | Yes | Yes |
| between (range) | Yes | Yes | Yes | Yes | Yes |
| in_set | Yes | Yes | Yes | Yes | Yes |
| regex | Yes | Yes | Yes | Yes | Yes |
| is_email | Yes | - | - | - | - |
| is_url | Yes | - | - | - | - |
| min/max_length | Yes | Yes | Yes | - | - |
| freshness | Yes | Yes | - | - | - |
| row_count | Yes | Yes | Yes | - | - |
| cross_column | Yes | - | Yes | Yes | - |
| schema | Yes | Yes | Yes | Yes | - |
| reference (FK) | Yes | Yes | Yes | - | - |
| custom SQL | Yes | Yes | Yes | - | - |
| anomaly detection | - | Cloud | Yes | - | - |
| distribution | - | Cloud | Yes | - | - |
| change over time | - | Cloud | - | - | - |
Warehouse Support
| Warehouse | Eliza | Soda | GX |
|---|---|---|---|
| BigQuery | Yes | Yes | Yes |
| Athena | Yes | Yes | Yes |
| Snowflake | Yes | Yes | Yes |
| PostgreSQL | Yes | Yes | Yes |
| MySQL | Yes | Yes | Yes |
| ClickHouse | Yes | - | - |
| Databricks | Yes | Yes | Yes |
| Redshift | Yes | Yes | Yes |
pip install eliza-dq[bigquery] # install only what you need
pip install eliza-dq[athena]
pip install eliza-dq[snowflake]
pip install eliza-dq[postgres]
pip install eliza-dq[clickhouse]
pip install eliza-dq[mysql]
pip install eliza-dq[databricks]
pip install eliza-dq[redshift]
Quick Start
Inline checks (notebook / script)
import polars as pl
from eliza import check
df = pl.read_parquet("orders.parquet")
result = check(df, checks={
"order_id": ["not_null", "unique"],
"amount": ["not_null", "not_negative", {"between": {"min": 0, "max": 100000}}],
"email": ["is_email"],
"status": [{"in_set": {"values": ["pending", "shipped", "delivered"]}}],
"name": [{"min_length": {"min": 2}}, {"max_length": {"max": 100}}],
})
print(result.summary())
result.raise_on_fail() # exit code 1 on failure
YAML config (production)
# eliza_checks/orders.yaml
connection:
type: bigquery
project: my-project-123
table: my-project-123.analytics.orders
filter: "created_at >= '2024-01-01'"
samples:
limit: 20
checks:
- column: order_id
check: not_null
- column: order_id
check: unique
- column: amount
check: not_negative
- column: email
check: not_missing
missing_values: ["", "N/A", "null"]
- column: updated_at
check: freshness
max_age: 24h
- check: row_count
min: 1000
from eliza import check
result = check(config="orders")
CLI
# Initialize project
eliza init
# Auto-learn checks from data
eliza learn data/orders.parquet --name orders
# Run checks (exit code: 0=pass, 1=fail, 2=error)
eliza check --config orders --source data/orders.parquet
# JSON output for orchestrators
eliza check --config orders --format json
Alerting & Reporting
from eliza import check
from eliza.alert import send_slack
from eliza.report import generate_pdf
result = check(config="orders")
# Slack message + PDF attachment
send_slack(result, token="xoxb-...", channel="C...", pdf=True, name="orders")
# PDF report with charts (donut, failure bars, sample tables)
generate_pdf(result, name="orders")
# -> eliza_orders_2026-09-07.pdf
pip install eliza-dq[report] # for PDF reports
CI/CD Integration
# .github/workflows/dq.yml
- run: pip install eliza-dq
- run: eliza check --config orders --source data/orders.parquet
# Airflow
@task
def dq_check():
from eliza import check
result = check(config="orders")
result.raise_on_fail()
return result.to_dict()
Architecture
Polars native (DataFrames, files): Streaming engine with per-column grouping. Files are scanned as LazyFrames — data streams through without loading into RAM. Each column group runs one collect(engine="streaming") call. Failed row samples use .filter().head(N).collect(engine="streaming") — instant, no full materialization.
SQL pushdown (warehouses): All inline checks batched into one SELECT COUNT(*), SUM(CASE WHEN ...) FROM table. Separate checks (unique, freshness) and sample queries run in parallel via ThreadPoolExecutor with thread-local connections. Sample queries use LIMIT N in SQL — never fetches all failing rows.
License
MIT
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 eliza_dq-0.1.0.tar.gz.
File metadata
- Download URL: eliza_dq-0.1.0.tar.gz
- Upload date:
- Size: 40.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64cddb77bc71493d395c778c916365bca5bbb8fabc27df2ba8d3349317febcac
|
|
| MD5 |
19f7869aba1248a8180ec0c76f691f51
|
|
| BLAKE2b-256 |
2c57730bff715eeb0f06ced06d58d4a5cad2a774e0f544fe99996524276b7a26
|
Provenance
The following attestation bundles were made for eliza_dq-0.1.0.tar.gz:
Publisher:
publish.yml on Se7enquick/eliza-dq
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eliza_dq-0.1.0.tar.gz -
Subject digest:
64cddb77bc71493d395c778c916365bca5bbb8fabc27df2ba8d3349317febcac - Sigstore transparency entry: 2750496711
- Sigstore integration time:
-
Permalink:
Se7enquick/eliza-dq@94c9255d4bcbe726a464909808d59d7d86b766f9 -
Branch / Tag:
refs/tags/0.0.1 - Owner: https://github.com/Se7enquick
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@94c9255d4bcbe726a464909808d59d7d86b766f9 -
Trigger Event:
release
-
Statement type:
File details
Details for the file eliza_dq-0.1.0-py3-none-any.whl.
File metadata
- Download URL: eliza_dq-0.1.0-py3-none-any.whl
- Upload date:
- Size: 31.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a409d6ae6232f4f6d5142033349ffb5107b71a915f298f07e847db7d017837e4
|
|
| MD5 |
4731c2043f965c13c00b0ae8ef58487b
|
|
| BLAKE2b-256 |
d99c868032f52a405c3d56e730711c69dcda410eab26496b0d1c520502c086b8
|
Provenance
The following attestation bundles were made for eliza_dq-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Se7enquick/eliza-dq
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eliza_dq-0.1.0-py3-none-any.whl -
Subject digest:
a409d6ae6232f4f6d5142033349ffb5107b71a915f298f07e847db7d017837e4 - Sigstore transparency entry: 2750496713
- Sigstore integration time:
-
Permalink:
Se7enquick/eliza-dq@94c9255d4bcbe726a464909808d59d7d86b766f9 -
Branch / Tag:
refs/tags/0.0.1 - Owner: https://github.com/Se7enquick
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@94c9255d4bcbe726a464909808d59d7d86b766f9 -
Trigger Event:
release
-
Statement type: