Skip to main content

DataFrame utilities for Chalk AI, backed by libchalk

Project description

chalkdf

DataFrame utilities for building fast, portable data pipelines on top of Apache Arrow — powered by Chalk’s libchalk execution engine.

The API centers on two concepts:

  • chalkdf.DataFrame: a lightweight, eager plan that you can materialize to Arrow.
  • chalkdf.LazyFrame: a serializable, chainable description of a plan that can be round-tripped to/from a protobuf and converted to a DataFrame for execution.

You build expressions with Chalk’s Python underscore DSL (from chalk import _) and function registry (import chalk.functions as F). We also ship pragmatic testing helpers (chalkdf.Testing) to make it easy to compare results in your unit tests.

Installation

  • Requires Python 3.10–3.13
  • Works on Linux and macOS 15+

Install from PyPI:

pip install chalkdf chalkpy

Quickstart

Below are minimal, self‑contained examples that mirror the public API used in the tests.

Create from Arrow and select columns

import pyarrow as pa
from chalkdf import DataFrame

tbl = pa.table({"a": [1, 2, 3], "b": [10, 20, 30], "c": [100, 200, 300]})
df = DataFrame.from_arrow(tbl)

out = df.select("c", "a")
print(out.run())
# ┌─────┬─────┐
# │  c  │  a  │
# ├─────┼─────┤
# │ 100 │  1  │
# │ 200 │  2  │
# │ 300 │  3  │
# └─────┴─────┘

Add or replace columns with expressions

import pyarrow as pa
import chalk.functions as F
from chalk import _
from chalkdf import DataFrame

tbl = pa.table({"a": pa.array([1, 2, 3], pa.int64()), "b": pa.array([10, 20, 30], pa.int64())})
df = DataFrame.from_arrow(tbl)

out = df.with_columns(
    {
        "sum": _.a + _.b,
        "flag": F.if_then_else(_.a < 2, "small", "big"),
    }
)
print(out.run())

Filter, slice, and order

import pyarrow as pa
from chalk import _
from chalkdf import DataFrame

tbl = pa.table({"a": pa.array([1, 2, 3, 4, 5], pa.int64()), "b": pa.array([10, 20, 30, 40, 50], pa.int64())})
df = DataFrame.from_arrow(tbl)

out = df.filter(_.a > 2).slice(1, 2).order_by(("b", "descending"))
print(out.run())

Force caching of a reused subcomputation

DataFrame.replay() is an escape hatch for tests and carefully inspected plans where you need to force a subcomputation to be cached behind an explicit replay boundary. Most plans should let the optimizer place replay nodes automatically; use this only when you know a shared subplan is expensive enough to compute once and reuse.

from chalk import _
from chalkdf import DataFrame

df = DataFrame.from_dict({"id": [1, 2, 3], "amount": [10, 20, 30]})
shared = df.with_columns({"amount_cents": _.amount * 100}).replay("shared_amount_cents")

Rename and explode

import pyarrow as pa
from chalkdf import DataFrame

tbl = pa.table({"id": [1, 2], "vals": pa.array([[1, 2], []], type=pa.list_(pa.int64()))})
df = DataFrame.from_arrow(tbl)

renamed = df.rename({"vals": "values"})
exploded = renamed.explode("values")
print(exploded.run())  # (1,1), (1,2)

Group by and aggregate

import pyarrow as pa
from chalk import _
from chalkdf import DataFrame

tbl = pa.table({"g": [1, 1, 2, 2, 2], "v": pa.array([10, 20, 1, 2, 3], pa.int64())})
df = DataFrame.from_arrow(tbl)

out = df.agg(["g"], _.v.sum().alias("v_sum"))
print(out.run())  # rows may be unordered

Joins

Use a list of join keys when both sides share column names. When names differ, pass a mapping of left columns to their right-hand counterparts.

import pyarrow as pa
from chalkdf import DataFrame

left = DataFrame.from_arrow(pa.table({"key": [1, 2, 3], "x": [10, 20, 30]}))
right = DataFrame.from_arrow(pa.table({"key": [2, 3, 4], "y": [200, 300, 400]}))

joined = left.join(right, on=["key"], how="inner").select("key", "x", "y")
print(joined.run())

# Or with an explicit mapping of left->right keys
joined2 = left.join(right, on={"key": "key"}, how="inner")

# When column names differ, map each left column to its right counterpart
joined3 = left.join(right, on={"key": "lookup_key"}, how="left")

Scan Parquet files

You can construct a DataFrame that scans one or more Parquet files without loading them eagerly. Use local file:// URIs (or remote URIs when running in an environment with appropriate access):

from chalkdf import DataFrame

df = DataFrame.scan(
    ["file:///path/to/data.parquet"],
    name="my_table",
)

print(df.run())  # materializes and prints a preview

Lazy plans (experimental)

LazyFrame records a chain of operations and can round‑trip to a protobuf for transport or persistence. You can reconstruct the same lazy plan later and convert it to a DataFrame to execute.

from chalk import _
from chalkdf import LazyFrame

lf = (
    LazyFrame.from_dict({"c1": [1, 2, 3], "c2": [4, 5, 6]})
    .select("c1", "c2")
    .slice(0, length=10)
    .filter(_.c1 > 0)
)

proto = lf.to_proto()
lf2 = LazyFrame.from_proto(proto)
assert lf == lf2  # structural equality of the recorded plan

df = lf2._convert_to_df()  # convert to a DataFrame for execution
print(df.run())

Notes:

  • LazyFrame._convert_to_df() is currently a private/experimental helper.
  • For named tables, use LazyFrame.named_table("table_name", schema) as a root.

Testing helpers

Use chalkdf.Testing.assert_frame_equal to compare DataFrame results in unit tests. It materializes both frames to Arrow and supports relaxed comparisons.

import pyarrow as pa
from chalkdf import Testing, DataFrame

left = DataFrame.from_arrow(pa.table({"a": [1.000001], "b": [2.0]}))
right = DataFrame.from_arrow(pa.table({"a": [1.0], "b": [2.0]}))

Testing.assert_frame_equal(left, right, atol=1e-5, rtol=0.0)

# Ignore row or column order when needed
Testing.assert_frame_equal(left, right, check_row_order=False, check_column_order=False)

Why chalkdf?

  • Built on Apache Arrow memory formats for zero‑copy interop.
  • Runs on Chalk’s native engine for performance and portability.
  • Small, predictable API surface suited for services and batch jobs.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

chalkdf-3.38.32-cp313-cp313-manylinux_2_36_x86_64.whl (180.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ x86-64

chalkdf-3.38.32-cp313-cp313-macosx_15_0_arm64.whl (144.6 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

chalkdf-3.38.32-cp312-cp312-manylinux_2_36_x86_64.whl (180.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.36+ x86-64

chalkdf-3.38.32-cp312-cp312-macosx_15_0_arm64.whl (144.6 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

chalkdf-3.38.32-cp311-cp311-manylinux_2_36_x86_64.whl (180.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.36+ x86-64

chalkdf-3.38.32-cp311-cp311-macosx_15_0_arm64.whl (144.6 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

chalkdf-3.38.32-cp310-cp310-manylinux_2_36_x86_64.whl (180.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.36+ x86-64

chalkdf-3.38.32-cp310-cp310-macosx_15_0_arm64.whl (144.6 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file chalkdf-3.38.32-cp313-cp313-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp313-cp313-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 baa4a8b9adb7792b59b6e17b4bffd6fe9e784032af6f526189ab91337c68c24b
MD5 f50b576125fe05a1c10af75ab3691c20
BLAKE2b-256 1195cdf585c5e48c12247ca62ca07e002e6f1840806a22aab3137a533436dd44

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp313-cp313-manylinux_2_36_x86_64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

File details

Details for the file chalkdf-3.38.32-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 6b5b403719cee88fbbadc15355f5e3428b4e9cc79873b871ddcc8640bbe0529f
MD5 0d33451d8b6fbe2a9913350d57233384
BLAKE2b-256 2f991cb81b12726b44788ededcae5559c81791b1b5664d4dee30e8abdf2ef9e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

File details

Details for the file chalkdf-3.38.32-cp312-cp312-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp312-cp312-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 576c7882a8691d37a1ef12b5264a44d0737c61cabcd987bcf230fbdb8d27b7c4
MD5 a00115224f21fe2d4332d661be25212e
BLAKE2b-256 a3e7f5e8bd7aa0a157eb4b4c2a0b126403f9e865a8f0cc41d4f9e4197bcd6cc8

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp312-cp312-manylinux_2_36_x86_64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

File details

Details for the file chalkdf-3.38.32-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 b89d95fbdcaf1a7f62581129800a24dce54dfa583201267b96a826f61b0053fc
MD5 1ad8ce04019e51072d3855471970d6c7
BLAKE2b-256 7f5bdb687c6be139cf5bdfe4a2cccb76a0930b051355a1663358bc052e810a83

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

File details

Details for the file chalkdf-3.38.32-cp311-cp311-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp311-cp311-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 54edea0a72891f1bb95adea3797bf7d8f8dc847d567aa1097d23f5c0afe57f16
MD5 02cbfdeb90b3bfeb81f3713218e1d889
BLAKE2b-256 9e88ee13e132f239b99dfa44fedb62c11317401a14c408fca2a1c522b62faac7

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp311-cp311-manylinux_2_36_x86_64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

File details

Details for the file chalkdf-3.38.32-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d5ce879b23f73bdbee7e20755d706b04b5645babcc8922df264be5c7a7fb9f51
MD5 4183d5bb9aedd64e7d3e6d62e265d90c
BLAKE2b-256 4777473236f8ebdd13f9633578bc56dd0faa4163da9aa2b7bb2774d3be9844d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp311-cp311-macosx_15_0_arm64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

File details

Details for the file chalkdf-3.38.32-cp310-cp310-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp310-cp310-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 41412aad3af45a95b2e8393e42b5475e7d0f1eb967b79f9b10d4b9a2d17bdcbe
MD5 2cdb8279a59c4f3c005b67acb6ff3e53
BLAKE2b-256 a16b9199c33ead3f886f129b238ed18ce372ff02d5dfe29073b71db0d74a9758

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp310-cp310-manylinux_2_36_x86_64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

File details

Details for the file chalkdf-3.38.32-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.32-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c9ad7d25108a44096029962d77a2f20beaae08e799e8ac68612b1e448bb498f4
MD5 6857eaf2fba17e1c1b8fc9c521eb724c
BLAKE2b-256 636df137ee538150cdd6db0ab4bcc3bc1172240d12a5f3d3b297a65e32db3f37

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.32-cp310-cp310-macosx_15_0_arm64.whl:

Publisher: build-dataframe.yml on chalk-ai/chalk-private

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page