Ciaren

Transformations Reference

Transformations Reference

Ciaren ships with file/storage/SQL input/output nodes plus 66 registered transformation nodes for cleaning, reshaping, combining, validating, charting, analytics, and scripting data. Each node maps to one clear dataframe operation and contributes to the exported Python — in the pandas, polars, or lazy polars version.

This page is the map. Each node also has its own reference page with use cases, full configuration, generated code, and tips — follow the links below or use the sidebar.

Source of truth

The authoritative list lives in backend/app/engine/registry.py. Each node's type (shown on its page) is the value stored in the flow graph at node.type; its settings live at node.data.config.

Node categories

The node palette (left panel in the editor) groups all nodes into color-coded categories. Click a category to expand it, then drag a node onto the canvas or click to place it.

Flow editor showing the node palette with Inputs, Cleaning, Columns, Reshape, Analytics, Data Quality, Charts, Machine Learning, and Outputs categories

How nodes connect

A flow is a graph of nodes and edges (React Flow-compatible). Most nodes have a single input handle (in) and output handle (out). Two are special:

A minimal complete pipeline always starts with at least one Input node and ends with at least one Output node — or a terminal that persists a result on its own, like an ML train node or a chart node. Everything in between is optional cleaning and transformation.

Input node
File · SQL · Storage
input
Clean nodes
columns · nulls · rows · text · numeric
clean
Transform nodes
reshape · combine · analytics
transform
Quality nodes
assert contracts on your data
quality
Output node
File · SQL · Storage
output

Choosing the right node

I want to...Use
Remove columnsDrop columns
Fix column namesRename columns
Keep only some columnsSelect columns
Change a column's typeChange types
Remove rows with missing valuesDrop nulls
Fill missing valuesFill nulls
Remove duplicate rowsRemove duplicates
Keep rows matching a conditionFilter rows
Filter on a multi-condition expressionFilter by expression
Join columns into one text fieldCombine columns
First non-null across columnsCoalesce columns
Split a delimited/list column into rowsSplit to rows
Moving average / rolling windowRolling aggregate
Row-over-row delta or % changeRow difference
Days/hours between two datesDate difference
Assert values are in an allowed setAssert values in set
Create a new computed columnCalculated column
Sum / count / average by groupGroup by + aggregate
Read an uploaded fileFile input
Read from S3 / GCS / Azure BlobStorage input
Write to S3 / GCS / Azure BlobStorage output
Read from a databaseSQL input
Combine two datasets on a keyJoin
Stack datasets row-wiseUnion / Concat
Reshape long ↔ widePivot / Unpivot
Bucket a number into bandsBin column
Split a date into year/month/…Extract date parts
Turn date text into real datesParse dates
Split one column into severalSplit column
Recode values (A→Pass, B→Pass…)Map values
Rank, running total, lag/leadWindow function
Bucket with custom if/else logicConditional column
Assert a column has no nullsAssert not null
Assert no duplicate rowsAssert unique
Assert values are within a rangeAssert value range
Assert a boolean expressionAssert expression
Assert row count in boundsAssert row count
Save a chart of the results on every runChart nodes
Run arbitrary Python on a framePython transform

Generated code: pandas and polars

Every node implements both to_python_code (pandas) and to_polars_code (polars), so exporting a flow gives you a runnable script in either dialect. The per-node pages show the pandas export; the polars export is equivalent and produced from the same config. The two engines are kept at parity by a test suite that runs each node on both.

Current limitations

LimitationWorkaround
Join takes two inputs at a timeChain multiple join nodes
rank/dense_rank rank by a single order columnPre-sort, or use a calculated key
calculatedColumn evaluates arithmetic expressionsFor complex logic, use Conditional column, Python transform, or export and edit the Python
pythonTransform scripts run without sandboxingCiaren is local-first — only run scripts from sources you trust

Custom transformations

Need a node that isn't built in? Use Python transform as an escape hatch for one-off scripts, build a plugin node when you want a reusable extension. Core nodes are kept selective; propose one in an issue only when it is broadly useful and fits the lightweight built-in toolbox. Each transformation implements validate_config, execute, to_python_code, and to_polars_code, and is registered in app/engine/registry.py with tests.

Next steps

  • Examples — sample workflows end to end
  • Engines — polars vs. pandas and code export
  • REST API — driving flows programmatically