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.4.dev2-cp313-cp313-manylinux_2_36_x86_64.whl (178.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ x86-64

chalkdf-3.38.4.dev2-cp313-cp313-macosx_15_0_arm64.whl (142.9 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

chalkdf-3.38.4.dev2-cp312-cp312-manylinux_2_36_x86_64.whl (178.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.36+ x86-64

chalkdf-3.38.4.dev2-cp312-cp312-macosx_15_0_arm64.whl (142.9 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

chalkdf-3.38.4.dev2-cp311-cp311-manylinux_2_36_x86_64.whl (178.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.36+ x86-64

chalkdf-3.38.4.dev2-cp311-cp311-macosx_15_0_arm64.whl (142.9 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

chalkdf-3.38.4.dev2-cp310-cp310-manylinux_2_36_x86_64.whl (178.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.36+ x86-64

chalkdf-3.38.4.dev2-cp310-cp310-macosx_15_0_arm64.whl (142.9 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file chalkdf-3.38.4.dev2-cp313-cp313-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp313-cp313-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 d1405269999e206cce0086dcf678f61f53ade5ff68045c8fde01fb210bb43051
MD5 7909ef4732b60c3fbbf283dfd3ea9760
BLAKE2b-256 acf39d98eef56d5474cea51574074834a41067cff54513f1629a2f27d9d6beb5

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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.4.dev2-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3a396436967f3cd0dd1f3057f65b53f730cf71c2124e4d3fa32a30f0d6d6d35d
MD5 16e80f6ffec5875c9a04d217e4f9eed9
BLAKE2b-256 4b35478f3afc08373678639d1aa81a6f3a277cb06b363121157ef69c710020a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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.4.dev2-cp312-cp312-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp312-cp312-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 3f70409ae566926d6775a3e102a6d7bcac2d96f2c36e12107a4e4999878d8fa1
MD5 f89b9defe0982b545efd198a22d5a107
BLAKE2b-256 d6e12136298663978ea8d343487ca1105fda0deac0eed2dd4820870c2b4034b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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.4.dev2-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 a74607deca833d9d13addbac7cc25d87678cb96fbb13d04eea8ab581a1ec1131
MD5 f48ec887bd11395c86913ab2b6240e2d
BLAKE2b-256 2fd99210824de82286d9d826c978d5db5dc6afa218c2bc2dc26b82464b107c7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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.4.dev2-cp311-cp311-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp311-cp311-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 c95718b80ad419acd8d78625cc872ca23069ef2e118f8d7f21420ecd45213b42
MD5 e21ce0eacfb463190397b60ece18a5d7
BLAKE2b-256 e311f0ea6a5e75fa6be017f7e4a4196a4ea9e324a2c2bdd2c7091495486bbe01

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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.4.dev2-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 044b27d13b74485c2524c117ae1bac58fdae2d2f0995b745e1140167aded1b69
MD5 d1236f8821b9abb7a69386dbe58e9efb
BLAKE2b-256 179b485f22d61f00d3710ec04f9b93de4754808137cb1f22f6e543a3d76a3666

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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.4.dev2-cp310-cp310-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp310-cp310-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 ad76b204c4a2c396701de52b6173f35d52eb4209897b1697d4f71c9f618e64ef
MD5 d19b4b48e30d71a2092353dc2abc2630
BLAKE2b-256 26d3a3864fb876879016ebc3cba7814eae829d2515a9cb90bc0870f5d794694f

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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.4.dev2-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for chalkdf-3.38.4.dev2-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 8312724537dcfd873c775fa84991970aa5c0707517c8695ffa9cec54542d4865
MD5 06491d192617d24bd2601586dd6c4139
BLAKE2b-256 19a35a1e6e5c9fdb78da4b4a1ce28372821cc885a7376cec245128a2c75ef0d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for chalkdf-3.38.4.dev2-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