Installation
taxi-seed is published to PyPI as a single distribution carrying all six commands plus the shared library. There are two ways to get it, and they suit different jobs:
- Install the released package if you want to run the tools — mirror the TLC bucket, analyze drift, load a database.
- Work from a clone if you want to develop on the repo, or if you want the curated normalize mappings that live in the repo rather than in the wheel (see Curated mappings are not in the wheel below).
Both require Python 3.12 or 3.13.
Use 0.2.0 or newer
0.1.0 predates the Python downloader, so it ships every command except taxi-download. It also shipped a k6_loadtest package that shadows the one in taxi-lab. 0.2.0 fixed both and is the current release.
From PyPI
Installs the package into its own isolated environment and puts every console script on your PATH. This is the right choice for a machine that runs the pipeline on a schedule.
No uv required — uv is a convenience for the development workflow, not a runtime dependency of the tools.
Runs a single command in a throwaway environment. Useful for a one-off download or for trying a tool before committing to an install; --from taxi-seed is required because the package name and the command names differ.
Either of the first two puts these commands on your PATH:
| Command | What it does | Guide |
|---|---|---|
taxi-download |
Mirror TLC parquet from CloudFront to raw/ |
Downloader |
schema-drift |
Report column-name and column-shape drift across a mirror | Schema Drift |
normalize |
Rewrite a mirror to a single target schema | Normalize |
taxi-load |
Load normalized parquet into a target database | Loader |
taxi-run |
Drive download → normalize → load as one pipeline | Orchestrator |
taxi-curate-mappings |
Auto-accept detected drift into complete mapping YAMLs | Orchestrator |
Verify the install
If the command is not found after uv tool install, run uv tool update-shell (or add ~/.local/bin to your PATH) and open a new shell.
Upgrading
Installing a prerelease
Prerelease tags (v0.2.0rc1, v0.2.0a1, …) publish to TestPyPI instead of PyPI. TestPyPI is not a mirror of PyPI. It happens to carry unrelated uploads under the names duckdb and pyyaml (newest stable 1.3.2.post1 and 3.11 respectively — neither satisfies this project's floors), and nothing at all under httpx. So the runtime dependencies have to resolve against real PyPI:
From a clone
This is what Getting Started walks through, and it is what Contributing assumes. uv sync materializes the exact locked versions from uv.lock into .venv/, which an install from PyPI does not do — a PyPI install resolves dependencies fresh against the ranges in pyproject.toml.
Reading the examples
Every example in these docs is written for the clone workflow, so commands are prefixed with uv run:
If you installed from PyPI, drop the prefix — the command names are identical:
Curated mappings are not in the wheel
The repo carries hand-curated normalize mappings at normalize/mappings/{yellow,green,fhv,fhvhv}.yaml. These are not packaged into the wheel — the distribution contains Python modules only.
normalize (and the normalize stage of taxi-run) resolves its mapping as normalize/mappings/<type>.yaml relative to the current working directory, with no flag to point it elsewhere. So from a PyPI install in an arbitrary directory, the first normalize yellow finds no mapping, bootstraps a fresh scaffold into ./normalize/mappings/yellow.yaml, and exits 3 for review — the documented first-run behavior, but starting from zero rather than from the curated file.
Two ways to get the curated mappings under an installed workflow:
-
Copy them into your working directory once:
Repeat per trip type. Everything else (
raw/,raw-normalized/) is already relative to--data-dir. -
Or run
normalize/taxi-runfrom a clone, and use the PyPI install only fortaxi-download,schema-drift, andtaxi-load— those three are fully self-contained and need no repo files.
See the Normalize guide for what the mapping file contains and how bootstrap/amend semantics work.
For maintainers
How a tag becomes a PyPI release — branch model, the integration gate, prerelease vs final classification, and the OIDC Trusted Publishing setup — is in Operations → Releasing.