ddn.df
DataFrames, relational operations and query execution for D in the spirit of Polars.
DataFrame is the table product of the DDN Analytics family: it wraps the structural ColumnBatch carrier and adds projection and column assembly, null operations, stacking and reshape, grouping and aggregation, keyed/multi-key/cross/asof joins, frame sorting, over and dynamic time windows, and describe. Series is an alias of the canonical Column implemented by ddn-columnar; it is never a second storage engine. The columnar foundation supplies immutable, 64-byte-aligned chunks, validity bitmaps, value kernels, rich types and the one deterministic process-wide executor.
The query layer keeps eager frames, expressions, logical plans, the optimizer and streaming execution together. Eager execution is the oracle: optimized and unoptimized collections preserve schema, order, values and errors. ColumnSchema nullability/cardinality facts and the owner-local ScanSource interface remain query metadata/contracts; concrete file sources and sinks are supplied by ddn-df-io.
This facade intentionally contains no file-format or IO modules. readCsv, writeCsv, scanCsv, readIpcFile, scanIpc and the incremental sinks require the explicit ddn-df-io dependency. The standard Arrow C Data and IPC codecs belong to ddn-data-arrow. Historical ddn.df.* selective imports re-export the canonical columnar and Arrow implementations where compatibility is provided, but they do not restore implicit IO imports.
Semantics follow the delivered Polars-inspired contracts unless a module documents a deviation: stable sorting, explicit null rules, exact decimal/temporal behaviour, deterministic parallel results and disclosed materialising fallbacks. Temporal arithmetic is delivered through typed DATE/DATETIME/TIME/DURATION rules; it is not banned.
The dataframe design history is doc/DDN-DF.md; the family's active decision records live in ../ddn-analytics/doc/adr/.