Data operations are built-in feature groups that transform existing columns: row-preserving analytics (binning, ranks, windows, offsets, percentiles), group-reducing aggregations, and element-wise string transforms.
These guides describe the contracts each category must honor, the cross-framework reference-implementation pattern, and the end-to-end recipe for adding a new operation.
Read them after you are comfortable with the feature-group patterns. They extend that model with the additional invariants that make a single feature name produce identical results on PyArrow, Pandas, Polars, DuckDB, and SQLite.
- Overview - Categories, naming patterns, and where the code lives
- Row-preserving contract - Output row count and order must match input
- Reference implementation pattern - PyArrow is the source of truth
- Supported ops per framework - Excluding ops a framework cannot express
- Binning -
binvsqbin, NTILE vs rank, NULL handling - Window aggregation - Partitioned aggregates broadcast per row
- Percentile, rank, offset - The analytic window family
- Scalar aggregate, frame aggregate, scalar arithmetic, and point arithmetic - Global broadcast, rolling/expanding windows, element-wise column-vs-constant arithmetic, and element-wise column-vs-column arithmetic
- String operations - Element-wise string transforms
- Adding a new data operation - End-to-end recipe
- Time bucketization -
floor/ceil/rounda timestamp to a bucket interval (minute / hour / day / week / month / year) - Forward fill by time - Carry the last non-null value forward across time gaps, per partition (row-preserving)
- EMA - Exponential moving average (
{col}__ema_{span}), per partition; pandas / polars native, pyarrow / duckdb / sqlite not implemented (no backend) - Resample - Collapse events onto a regular time grid (
{col}__resample_{n}_{unit}_{agg}); the firstrow_changingoperation - Sessionization - Assign a gap-threshold session id on an ordered timestamp (
{ts}__sessionize_{n}_{unit}), per partition (row-preserving) return_data_type_rulefailure handling - The fail-fast, post-selection contract: why the type rules no longer catch extraction errors, how binning/resample matching was tightened so a selected feature never raises, and the completeness-test guard (#244 -> #265, core #485/#493)- Known divergences - Audited cases where a framework would diverge from the PyArrow reference, with the mitigation for each
- Framework support matrix - Operation x framework capability table, generated from
supported_*()test overrides