Ciaren

Demo Project & Tutorials

For: anyone who finished the Quick Start or learns best from working examples. You get: four guided tutorials on flows that are already in your Demo project, from a linear cleanup to a three-input sales mart.

The built-in Demo project contains 11 sample datasets and 18 example flows. Open each tutorial flow, preview every step, and tweak it. The other 14 flows cover more cleaning and data-quality patterns plus ML work (PCA, clustering, feature selection, regression, cross-validation, and more) on datasets like house_prices.csv and iris.csv.

Where the demo comes from

The Demo project is created automatically the first time the server starts on a fresh database. You don't run anything — open the app and it's there under Projects → Demo (the emerald one).

The data is generated from a fixed random seed, so every install gets the exact same rows. That's what makes these tutorials reproducible: the numbers you see are the numbers described here.

Don't want it?

Skip seeding with ciaren serve --no-demo, or set CIAREN_SEED_DEMO=false. Seeding is also idempotent — once the Demo project exists it's never recreated, so deleting it keeps it gone.

The sample datasets

The four datasets used by the tutorials below are CSVs and intentionally messy — they have nulls, outliers, duplicates, inconsistent casing, and dates stored as text — so the example flows have something realistic to clean. (The Demo project ships 11 datasets in total; the other seven — house_prices.csv, iris.csv, regional_actuals.csv, regional_targets.csv, survey_responses.csv, web_events.csv, and leads.csv — feed the newer ML-focused and data-quality flows mentioned above.)

DatasetRowsColumnsWhat's messy
customers.csv60id, name, email, signup_date, country, agesignup_date is text; country casing is inconsistent (usa/USA/Usa); age has nulls and two absurd outliers (199, 0)
orders.csv123order_id, customer_id, order_date, amount, statusorder_date is text; amount has two huge outliers; 3 duplicate rows
products.csv12product_id, category, price, ratingprice has nulls
order_items.csv~one–two per orderorder_id, product_id, quantity, unit_pricethe link table joining orders to products

See the mess for yourself

Open any dataset, or drop a File Input node (File type: CSV) and hit Run preview. Switch the preview to Chart → Histogram on amount to see the outliers, or to Profile to spot the null counts. (Charts use a sample — see Visualizations.)

Flows list showing the Demo project's flows, including Clean Customers, ML flows, and the Full Sales Mart


Tutorial 1 — Clean Customers (linear)

Flow: Clean Customers · Goal: turn the raw customer list into a tidy table — fill missing ages, normalize country casing, and make the signup date a real date.

This is the simplest shape: a straight line from input to output.

  1. 1Input
    File Input
    customers.csv
  2. 2Clean
    Fill Nulls
    age → median
  3. 3Clean
    String Transform
    country → upper
  4. 4Clean
    Parse Dates
    signup_date → datetime
  5. 5Output
    File Output
  1. File Input (File type: CSV) → customers.csv.
  2. Fill Nulls — column age, strategy median. (Some ages are blank; median is robust to those 199/0 outliers.)
  3. String Transform — column country, operation upper. Now usa, USA, and Usa all become USA.
  4. Parse Dates — column signup_date, errors coerce. Text like 2022-06-14 becomes an actual date you can sort and extract parts from.
  5. File Output.

Follow along: select each node and Run preview to watch the column change one step at a time. Select String Transform and you'll see country collapse to a handful of clean values.

Try it: add a Group By Aggregate after step 3 (group by country, count id) to see customers per country — proof the casing fix worked.


Tutorial 2 — Order Revenue by Month (dates + aggregation)

Flow: Order Revenue by Month · Goal: total completed revenue per month, in chronological order.

This adds date-part extraction and grouping.

  1. 1Input
    File Input
    orders.csv
  2. 2Clean
    Parse Dates
    order_date → datetime
  3. 3Clean
    Extract Date Parts
    year + month cols
  4. 4Clean
    Filter Rows
    status = completed
  5. 5Transform
    Group By
    sum amount by month
  6. 6Clean
    Sort Rows
    year → month asc
  7. 7Output
    File Output
  1. File Input → orders.csv.
  2. Parse Dates — column order_date (it's text).
  3. Extract Date Parts — column order_date, parts year, month. This adds order_date_year and order_date_month columns.
  4. Filter Rows — keep status == completed.
  5. Group By Aggregate — group by order_date_year, order_date_month; aggregate amount with sum.
  6. Sort Rows — by order_date_year, order_date_month ascending.
  7. File Output.

Follow along: preview after Extract Date Parts to see the new year/month columns, then after Group By Aggregate to see one row per month.

Try it: select Group By Aggregate, open Chart → Bar, set category = order_date_month and value = amount to see the monthly revenue shape.


Tutorial 3 — Customer Orders Join (two inputs)

Flow: Customer Orders Join · Goal: clean customers and orders independently, then join them and compute a discounted amount.

This is the first branched flow: two inputs, each with its own cleaning chain, meeting at a Join.

Left input
  1. Input
    File Input
    customers.csv
  2. Clean
    Fill Nulls
    age → median
  3. Clean
    String Transform
    country → upper
Right input
  1. Input
    File Input
    orders.csv
  2. Clean
    Remove Duplicates
  3. Clean
    Remove Outliers
    IQR drop
  1. Join
    Join
    on customer_id — inner
  2. Transform
    Calculated Column
    net_amount = amount × 0.9
  3. Output
    File Output

Customer Orders Join canvas — two input branches meeting at a join node, followed by calculatedColumn and csvOutput

Customer branch

  1. File Input → customers.csv.
  2. Fill Nulls — age, median.
  3. String Transform — country, upper.

Orders branch

  1. File Input → orders.csv.
  2. Remove Duplicates — keep first (drops those 3 dupe rows).
  3. Remove Outliers — column amount, method IQR, action drop (removes the 99999.99 / 88888.88 rows).

Join & finalize

  1. Join — left input = customers, right input = orders; left_on = id, right_on = customer_id, how inner.
  2. Calculated Column — net_amount = amount * 0.9.
  3. File Output.

Follow along: preview the Remove Outliers node — the row count drops as the outliers leave. Preview the Join to see customer columns sitting next to their orders.

Why two branches? Each side needs different cleaning. Independent branches keep that logic readable, and the Join's left/right handles make the join direction explicit.


Tutorial 4 — Full Sales Mart (three inputs)

Flow: Full Sales Mart · Goal: build a per-category revenue table from three datasets, then label each category by revenue tier.

This is the most complex flow — three inputs and two chained joins.

  1. Input
    order_items.csv
    Calculated Column: line_total
  2. Input
    products.csv
    Fill Nulls: price → mean
  3. Transform
    Join
    items + products on product_id
  4. Input
    orders.csv
    Remove Duplicates
  5. Transform
    Join
    + orders on order_id
  6. Transform
    Group By
    sum line_total by category
  7. Transform
    Conditional Column
    revenue_tier label
  8. Output
    File Output

Order items branch

  1. File Input → order_items.csv.
  2. Calculated Column — line_total = quantity * unit_price.

Products branch

  1. File Input → products.csv.
  2. Fill Nulls — price, strategy mean.

First join

  1. Join — items (left) + products (right) on product_id, how left.

Orders branch

  1. File Input → orders.csv.
  2. Remove Duplicates — keep first.

Second join + aggregate + label

  1. Join — (items+products) (left) + orders (right) on order_id, how left.
  2. Group By Aggregate — group by category; line_total sum, order_id count.
  3. Conditional Column — revenue_tier: line_total >= 5000 → high, >= 1000 → medium, else low.
  4. File Output.

Follow along: preview each Join to watch the table widen as columns from the next dataset attach. Preview Group By Aggregate for the final one-row-per-category result, then Conditional Column to see the tier label appear.

Try it: on Group By Aggregate, open Chart → Bar (category = category, value = line_total) to compare categories at a glance.

Next steps

You have finished the start path. Pick what fits your next task:

  • Learn the editor — the Interface Tour covers every panel.
  • Follow an end-to-end example — start with Sales Analysis.
  • Look up a node — the Transformations reference documents every node these flows use.
  • Read the generated code — run a flow and open its exported Python code; the demo flows make readable, educational examples.
  • Try the ML flows — open Projects → Demo → Flows and read the ML Quick Start for the concepts they use.