NYC TLC Taxi data analysis tools
Project description
taxi
taxi is one repo, four tools for working with the NYC Taxi & Limousine Commission (TLC) trip record data set: a WAF-aware CloudFront downloader (WAF = Web Application Firewall — the layer AWS uses to block traffic that looks like a scraper), a schema-drift analyzer, a normalize step that halts on any data loss unless the operator explicitly acknowledges the drift, and a k6-loadtest rig that drives SQL Server from real parquet or a synthetic generator. The project is MIT-licensed. The downloader script was loosely based on toddwschneider/nyc-taxi-data; the other three tools are original to this repo. See Acknowledgments for details.
- WAF-aware CloudFront downloader with a 5 / 15 / 60 minute exponential backoff ladder and stop-on-local incremental catch-up so nightly crons stay cheap once the mirror is warm.
- Normalizer that treats data loss as a first-class error — missing columns, lossy casts, and silent renames halt the run; explicit
ack_dateacknowledgment is required before drift is written through. - K6-based SQL Server load tester with both real-parquet and synthetic-generator modes so you can iterate on a
test.jsin seconds without waiting for a multi-gigabyte load.
→ Full documentation: https://andrekamman.github.io/taxi-seed/
The site has the deep-dive guides, a cookbook of cross-cutting recipes, an architecture overview, and the design specs; this README stays intentionally short.
Components
Four tools, one repo:
downloader/— bash CLI that mirrors the TLC CloudFront bucket to local parquet.schema-drift/— Python CLI that reports column-name and column-shape drift across a mirror.normalize/— Python CLI that rewrites a mirror to a single target schema, refusing to lose data.k6-loadtest/— K6 rig plus a Python preprocessor that turns parquet (or synthetic data) into a self-contained load-test bundle.
Each component has a short README.md that points at the guide on the site; the guide is authoritative.
Quick start
git clone https://github.com/andrekamman/taxi-seed.git
cd taxi
./downloader/download_taxi_data.sh --recent 3 yellow
Downloads ~200 MB in 1–2 minutes on residential broadband. This Quick Start only exercises the downloader (bash + curl — no Python needed). To use the other three tools (schema-drift, normalize, k6-preprocess) you'll additionally need uv sync for the Python side; the Getting Started tutorial walks the full end-to-end path from clone to normalized parquet.
A full-history mirror is roughly 40 GB and takes 6–10 hours end-to-end; the downloader is designed to be resumable, incremental, and cheap to re-run on a schedule rather than something you kick off once and hope survives.
Requirements
bash4+,curl(Git for Windows on Windows). Required by the downloader; that's all the downloader needs.- Python 3.12 or 3.13, uv. Required by the other three tools (schema-drift, normalize, k6-preprocess), which are all Python.
- Disk sized to intent — see the Downloader guide.
- Individual tools list per-guide prerequisites (Go 1.22+ for the K6 binary build, SQL Server for load testing, etc.).
Everything runs on macOS, Linux, and Windows (via Git Bash). CI runs the test suite and the strict docs build on every PR.
Documentation map
The documentation site is the source of truth. High-level sections:
- Getting Started — 10-minute end-to-end walkthrough from clone to normalized parquet.
- Guides — one deep-dive per tool (Downloader, Schema Drift, Normalize, K6 Load Test).
- Cookbook — cross-cutting recipes (nightly cron, DuckDB
httpfsquerying, corporate proxy, load-testing at scale). - Architecture — how the four tools fit together end-to-end.
- Reference — configuration keys and exit codes.
- Design Specs — the "why is this shaped this way?" trail.
Contributing
PRs welcome. See docs/contributing.md — also published as the Contributing page on the site — for the dev-setup, test, and PR-checklist details.
License
MIT — see LICENSE.
Acknowledgments
The downloader shell script was loosely based on toddwschneider/nyc-taxi-data (MIT) — specifically its convention for organizing TLC parquet by type and year. The rest of the repo (schema-drift analyzer, normalizer, k6-loadtest rig) is original work and shares no code with Todd's project. See THIRD_PARTY_NOTICES for the full attribution.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file taxi_seed-0.1.0.tar.gz.
File metadata
- Download URL: taxi_seed-0.1.0.tar.gz
- Upload date:
- Size: 351.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ea991defc9a6f753d0add9286e66569c226d7e82ba5bf95ae59899c820e9327
|
|
| MD5 |
bd0203ffb9055d9901647a1b85de6d77
|
|
| BLAKE2b-256 |
e2e0f86c4308648cdc93e46142aadfddaf1e3be448481e4b8aa86005e1609c30
|
Provenance
The following attestation bundles were made for taxi_seed-0.1.0.tar.gz:
Publisher:
release.yml on andrekamman/taxi-seed
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
taxi_seed-0.1.0.tar.gz -
Subject digest:
4ea991defc9a6f753d0add9286e66569c226d7e82ba5bf95ae59899c820e9327 - Sigstore transparency entry: 2256109610
- Sigstore integration time:
-
Permalink:
andrekamman/taxi-seed@fe33231a8e1e32177be9c4f522fa4805a7ba209c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/andrekamman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe33231a8e1e32177be9c4f522fa4805a7ba209c -
Trigger Event:
push
-
Statement type:
File details
Details for the file taxi_seed-0.1.0-py3-none-any.whl.
File metadata
- Download URL: taxi_seed-0.1.0-py3-none-any.whl
- Upload date:
- Size: 62.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa90cc71f0e1a378b6791258a084f67e9311d2b86e133e1ba9ef61aac4776aac
|
|
| MD5 |
f2e85aa4f6561f3f85928164e9031450
|
|
| BLAKE2b-256 |
40fc0f6808f1e734d61f50589c95e69493e6817bb87393fa13f9f14a3a21e581
|
Provenance
The following attestation bundles were made for taxi_seed-0.1.0-py3-none-any.whl:
Publisher:
release.yml on andrekamman/taxi-seed
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
taxi_seed-0.1.0-py3-none-any.whl -
Subject digest:
fa90cc71f0e1a378b6791258a084f67e9311d2b86e133e1ba9ef61aac4776aac - Sigstore transparency entry: 2256109617
- Sigstore integration time:
-
Permalink:
andrekamman/taxi-seed@fe33231a8e1e32177be9c4f522fa4805a7ba209c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/andrekamman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe33231a8e1e32177be9c4f522fa4805a7ba209c -
Trigger Event:
push
-
Statement type: