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.

Trips analyzed
Raw Parquet scanned
Parquet files
Months of history

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.

Generated · built in 39m 00s