NYC Taxi & Ride-Hail Data — 1.6 Billion Rides
Interactive dashboard of every NYC yellow-cab, green-cab, Uber and Lyft trip since January 2020 — 1.6 billion rows of NYC TLC trip record data queried straight from the raw Parquet files by DuckDB, rebuilt nightly on GitHub Actions, served as a static page.
Every chart on this page is a SQL query running on DuckDB over the raw Parquet files published by the NYC Taxi & Limousine Commission — no warehouse, no ETL, no server. A GitHub Actions job re-downloads the data and rebuilds the page every night, so when TLC publishes a new month, it shows up here on its own.
Taxis vs ride-hail since 2020 #
Six years of monthly trips, one line per service — the yellow cab, the green cab, Uber and Lyft. Each line is that service's own volume, so the COVID-19 collapse in early 2020 and the long climb back read straight off the axis.
Money and market share tell the same story from two more angles — who carries the trips, and who collects the fares:
Fares and tips are where the two worlds diverge most:
A note on the comparison: cab "base fare" is the meter fare; Uber/Lyft is the base passenger fare before fees. Cab tips are only recorded on card payments; Uber/Lyft tips are always in-app — that's the honest reason the gap looks so brutal.
Under the microscope: the newest month #
TLC publishes with a ~2-month lag; the freshest month on file is , with trips — each one a row in the raw files queried below.
The receipts #
Every number above comes from these monthly aggregates — the raw output of the history query, one row per service per month:
How it's built — the raw TLC Parquet files are downloaded as-is
(scripts/fetch_data.py), and every chart above is a plain SQL query in
queries/ that reads those files directly with DuckDB's read_parquet() — no
tables to define, no ETL. Dashdown's
dashdown build executes the queries once and bakes the results into this
static page; a GitHub Actions cron does that every night. The prose between the
charts is written by an LLM at build time from each query's result — commentary
that refreshes with the data.