A dataframe library from scratch

Pure C17 Zero dependencies Single header

Lazy pipeline API with automatic fusion optimization, custom memory management, and Python bindings. Everything built from the ground up.

01

Nothing to install

Pure C17 with zero external dependencies. No package manager, no vendored libraries, no system requirements beyond cmake and a C compiler. One public header file.

02

Describe, don't execute

Build a pipeline of filter, group, sort, and join operations lazily. Nothing runs until you call .collect(). The optimizer rewrites your pipeline automatically—fusing passes, pushing down predicates, eliminating dead branches.

03

Purpose-built internals

Custom buddy allocator with copy-on-write ref counting. Morsel-driven execution processes 1024-element tiles at a time. Thread pool with lock-free dispatch. Every layer designed for columnar workloads.

Build a lazy pipeline, call .collect()

Nothing executes until you ask for results. The optimizer handles the rest.

example.py
import teide as td

# Load CSV — returns a lazy table handle
table = td.read_csv("measurements.csv")

# Build pipeline — nothing executes yet
result = (
    table
    .filter(td.col("region") == "EU")
    .group_by(["product"])
    .agg(
        total=("revenue", "sum"),
        avg_price=("price", "avg"),
        count=("id", "count"),
    )
    .sort("total", descending=True)
)

# Execute — fused optimizer kicks in
df = result.collect()
print(df)

Build from source in seconds

No package manager needed. Just cmake and a C compiler.

Build

git clone https://github.com/hetoku/teide.git
cd teide

# Debug (with sanitizers)
cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build

# Release (optimized)
cmake -B build_release -DCMAKE_BUILD_TYPE=Release
cmake --build build_release

# Run tests
cd build && ctest --output-on-failure

Python

# Use the release build
export TEIDE_LIB=build_release/libteide.so

python3 -c "
import teide as td

table = td.read_csv('data.csv')
result = table.group_by(['id1']).agg(
    v1_sum=('v1', 'sum')
)
print(result.collect())
"

Read the full specification or browse the source on GitHub.