Skip to main content

Eliza DQ

The fastest open-source data quality engine for Python.

259M rows. 17 checks. Samples. 1.5 seconds.

CI Python License


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 uses LIMIT N on 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

eliza_dq-0.1.0.tar.gz (40.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

eliza_dq-0.1.0-py3-none-any.whl (31.9 kB view details)

Uploaded Python 3

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

Hashes for eliza_dq-0.1.0.tar.gz
Algorithm Hash digest
SHA256 64cddb77bc71493d395c778c916365bca5bbb8fabc27df2ba8d3349317febcac
MD5 19f7869aba1248a8180ec0c76f691f51
BLAKE2b-256 2c57730bff715eeb0f06ced06d58d4a5cad2a774e0f544fe99996524276b7a26

See more details on using hashes here.

Provenance

The following attestation bundles were made for eliza_dq-0.1.0.tar.gz:

Publisher: publish.yml on Se7enquick/eliza-dq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for eliza_dq-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a409d6ae6232f4f6d5142033349ffb5107b71a915f298f07e847db7d017837e4
MD5 4731c2043f965c13c00b0ae8ef58487b
BLAKE2b-256 d99c868032f52a405c3d56e730711c69dcda410eab26496b0d1c520502c086b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for eliza_dq-0.1.0-py3-none-any.whl:

Publisher: publish.yml on Se7enquick/eliza-dq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.1

2 files

0.2.0

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page