NYC Hazard Historian

Data flow

How the archive is built from eight public sources. Open any stage to see what it does to the data and the rule it keeps. The counts below are read from the current build, not written by hand.

Events
—
Source rows
—
Coverage
—
Built
—

Sources

Federal and city records, each fetched from its publisher. Radar is the exception: it is never downloaded, and is read live by the browser when a map is opened.

    pipeline/

    Five stages, deliberately separate, so a change to one does not re-run the others. Python standard library only.

    00_config.py

    Every tunable value: source URLs and dataset versions, the zone and county mapping, the hazard vocabulary, validation thresholds, unit conversions and the hand-declared event merges. Nothing downstream hard-codes a URL or a cutoff.

      Outputs

      Staged first, then moved into place in one step, so a failed build leaves the live files untouched.

        • Every measure carries a status — ok, not_collected, withheld, not_applicable — never a bare zero.
        • Derived figures, like storm surge and event peaks, are labeled as derived everywhere they appear.
        • Dollars travel in both bases: nominal as published, and adjusted with the metropolitan consumer price index.

        The site

        Static HTML, CSS and JavaScript. No framework, no bundler. The whole explorer works over one index file, which is why filtering keeps up with typing.

          Every stage, source and rule on this page is defined in one place: the FLOW block in docs/js/dataflow.js. The static diagram in the README is generated from the matching CONFIG block in tools/make_dataflow_diagram.py.