Skip to main content

duckpd

DuckPD is an experimental lazy DataFrame library with a pandas-shaped frontend and DuckDB as its execution engine.

[!WARNING] DuckPD is a work in progress and is not yet recommended for production-critical workloads. The API and supported pandas semantics may change between 0.x releases, and many pandas operations are intentionally unsupported. Validate results and resource behavior for each intended workload before adopting it.

DuckPD intentionally supports a small, explicit subset of pandas rather than silently falling back to materializing a complete pandas DataFrame. See the release policy for the pre-1.0 stability policy.

Current capabilities

  • Lazy pandas, Arrow, Parquet, DuckDB table, and read-only SQL sources.
  • Column selection, boolean filtering, arithmetic expressions, assign, sort_values, and limit.
  • Eager DataFrame and Series count, size, sum, mean, min, and max reductions over numeric and boolean data, including skipna, min_count, and DataFrame numeric_only support.
  • Explicit lazy indexes with set_index()/reset_index() and source index=/order_by= declarations.
  • Explicit pandas collection, bounded head, Arrow tables and record batches, physical plan inspection, and direct Parquet writes.
  • Session-level memory, spill-directory, temporary-size, and thread settings.
  • Rejection of ambiguous cross-frame alignment and mutating SQL.

Example

import duckpd as pd

orders = pd.read_parquet("orders/*.parquet")

result = (
    orders[orders["status"] == "paid"]
    .assign(net=lambda frame: frame["amount"] - frame["refund_amount"])
    .sort_values("net", ascending=False)[["order_id", "net"]]
    .limit(100)
)

print(result.explain())
preview = result.head(10)
result.write_parquet("largest-paid-orders.parquet")
pandas_result = result.collect()

Transformations above are lazy. explain(), head(), collect(), Arrow output, and file output are explicit execution boundaries. limit() stays lazy while head() returns a bounded pandas preview.

Demos

Small runnable programs are available in demo/:

uv run python demo/basic_pipeline.py
uv run python demo/parquet_pipeline.py
uv run python demo/reduction_pipeline.py
uv run python demo/generate_market_data.py
uv run python demo/market_data_demo.py

See the benchmark results for performance and memory comparisons between DuckPD and pandas across 100 MB, 1 GB, and 5 GB datasets.

Development

uv sync --frozen --group dev
make check
make build

GNU Make is optional. The equivalent commands are:

uv run pytest
uv run ruff check .
uv run ruff format --check .
uv run pyright
uv build

See the documentation index for the implementation roadmap, architecture decisions, benchmarks, research, and changelog.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

duckpd-0.0.4.tar.gz (164.8 kB view details)

Uploaded Source

Built Distribution

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

duckpd-0.0.4-py3-none-any.whl (45.0 kB view details)

Uploaded Python 3

File details

Details for the file duckpd-0.0.4.tar.gz.

File metadata

  • Download URL: duckpd-0.0.4.tar.gz
  • Upload date:
  • Size: 164.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for duckpd-0.0.4.tar.gz
Algorithm Hash digest
SHA256 4bfab198a01cd22468e47568be3529b2a183f7ee5287ad7f2f5fdbc85698f023
MD5 b61a670a7db629145cea208656047161
BLAKE2b-256 7eb9df834367f78251c6b4090afa8ca9b88ac6adfe4d0773a814cf9067ac2748

See more details on using hashes here.

File details

Details for the file duckpd-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: duckpd-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 45.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for duckpd-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 02636402528df3dcb855610cb454e6ba300a8f7e31219a24cb4e386bce246b69
MD5 ff7966002afadd9dfd59cce2da12c67b
BLAKE2b-256 da0012f2f6730af8d893a36d3839928859f9fa6a09f8dcb14b8a10478a219f6d

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.0.7

2 files

0.0.5

2 files

This release

0.0.4 This release

2 files

0.0.3

2 files

0.0.2

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