Real Python + pandas in your browser, same Meridian data as the SQL practice. All seven tables are pre-loaded as DataFrames. Assign your answer to result; use print() to explore (output appears under “stdout”). The first run downloads the runtime; later runs are instant. The Python ladder currently mirrors chapters 1–2; more comes after the SQL ladder settles.

Tables and columns (as of 31 Aug 2026)
  • accounts · Customer companies

    account_id, account_name, industry, region, tier, created_date

  • customers · Contacts at accounts

    customer_id, account_id, full_name, role, email

  • deals · One row per opportunity; stage is the current CRM value

    deal_id, account_id, owner, stage, amount, source, created_date, closed_date

  • deal_stage_history · Append-only log of stage transitions

    history_id, deal_id, stage, entered_at

  • transactions · Money movements against closed_won deals

    transaction_id, deal_id, amount, transaction_date, type

  • pipeline_runs · Daily run log for 3 pipelines (Apr–Aug 2026)

    run_id, pipeline, run_date, started_at, finished_at, status, rows_in, rows_out

  • dashboard_views · Usage events for the legacy and new dashboards

    view_id, dashboard, viewer_id, viewer_role, viewed_at

Level 0 · The basics · SQL & Python 101

How many deals are there?

Warm-up

deals is a DataFrame. Set result to the number of rows in it.

Why this matters for a data product

len() on a DataFrame is COUNT(*). Knowing the row count is the sanity check before any other number.

Related: Python & pandas 101: the formulas