← All courses

🐻‍❄️ Polars

The one you choose — expressions instead of chained indexing, lazy evaluation with a real query optimiser, Arrow memory, larger-than-memory streaming, and an honest account of what moving off pandas costs.

No lessons published yet — this is the roadmap, so you can see exactly what the course will cover before it lands.

Before you start: Python for Data — Series 1. You need Python and some dataframe experience. Knowing pandas is not required, but if you do know it, Series 1 · 00 is about unlearning the index.

Short on time? The 14 episodes marked core are the shortest path to being productive at work. Start there and pick up the rest whenever a job asks for them.


Series 1 · Expressions

describing a computation instead of performing one

  1. 01

    There Is No Index — What Changes When Alignment Stops Being Implicit

    coreintermediatecoming soon
  2. 02

    Expressions and Contexts — pl.col() Does Nothing Until You Give It a Context

    coreintermediatecoming soon
  3. 03

    when/then, over() and Namespaces — One Expression Across Many Columns

    coreintermediatecoming soon
  4. 04

    dtypes, List and Struct — and One Null Instead of Three Kinds of Missing

    coreintermediatecoming soon
  5. 05

    Joins and group_by — Semi, Anti, and Catching a Fan-Out With validate

    coreintermediatecoming soon
  6. 06

    Project — Rewrite a Loop-Heavy Script as One Expression Pipeline

    coreintermediate#projectcoming soon

Series 2 · Lazy Evaluation and the Optimiser

let the engine see the whole query first

  1. 01

    scan Against read — Nothing Runs Until You Call collect()

    coreadvancedcoming soon
  2. 02

    explain() — Predicate and Projection Pushdown, and Proving They Happened

    coreadvancedcoming soon
  3. 03

    map_elements and Early collect() — The Two Ways to Blind the Optimiser

    coreadvancedcoming soon
  4. 04

    Streaming — Larger Than Memory on One Machine, and Which Operations Support It

    coreadvancedcoming soon
  5. 05

    IO and Arrow Interop — Handing Data to DuckDB Without Copying It

    advancedcoming soon
  6. 06

    Project — A Lazy Pipeline Over a Folder of Parquet, With the Plan as Evidence

    coreadvanced#projectcoming soon

Series 3 · In Practice

migrating, testing, and where it ends

  1. 01

    Migrating From pandas — The Idioms Not to Translate

    coreadvancedcoming soon
  2. 02

    Testing — assert_frame_equal, and Asserting the Row Count Rather Than Hoping

    advancedcoming soon
  3. 03

    Polars SQL — When It Helps, and When DuckDB Is the Better Answer

    advancedcoming soon
  4. 04

    Where Polars Ends — One Machine, a Smaller Ecosystem, and When to Stay Put

    coreadvancedcoming soon
  5. 05

    Project — Port a pandas Job and Prove the Numbers Match

    coreadvanced#projectcoming soon

Not here, on purpose

  • Python itself and doing a data job end to end — covered in Python for Data
  • pandas' own model — the index, copy against view, SettingWithCopyWarning — covered in pandas. Referenced here only where it explains what Polars deliberately does differently
  • Distributed execution — covered in Apache Spark. Polars is a single-machine engine. In this course, Series 3 · 15 is honest about where that ends