Data — Reproduction Package

Data — Reproduction package

Everything on this site can be regenerated from a single parquet file (3.1 MB). Below: download links, schemas, and example queries.


The cleaned dataset

File: tornadoes.parquet (3.1 MB; 80,626 rows; 1950–2026)

Direct download: /data/tornadoes.parquet

Schema

ColumnTypeDescription
event_idint64Storm Events event identifier
episode_idint64 (nullable)Parent episode identifier
yearint16Calendar year
monthint8Calendar month (1–12)
begin_datedatetime64[ns]Beginning of event (local time)
begin_timestrBeginning of event (HH:MM local time)
statestr (UPPERCASE)US state name
state_fipsstrTwo-digit FIPS code (e.g. "40")
cz_fipsstrCounty/zone FIPS code
cz_namestr (UPPERCASE)County or zone name
mag_scalestrF0, F1, ..., F5, EF0, ..., EF5, or empty
mag_numfloat32Numeric scale (0–5); null where unrated
begin_latfloat32Touchdown latitude (decimal degrees, may be null)
begin_lonfloat32Touchdown longitude (decimal degrees, may be null)
end_latfloat32Liftoff latitude (may be null)
end_lonfloat32Liftoff longitude (may be null)
tor_lengthfloat32Path length (miles)
tor_widthfloat32Path width (yards)
injuries_dirInt32Direct injuries
injuries_indirInt32Indirect injuries
deaths_dirInt32Direct deaths
deaths_indirInt32Indirect deaths
damage_propstrRaw damage property (e.g. "25K", "1.5M")
damage_cropsstrRaw damage crops
wfostrNWS Weather Forecast Office
sourcestrReporting source

Quickstart (Python)

import pandas as pd
df = pd.read_parquet("tornadoes.parquet")

# Count by year
df.groupby("year").size()

# Filter to F/EF1+
sig = df[df.mag_num >= 1]

# Compute the headline centroid shift
p1_lat = sig[sig.year <= 1985].begin_lat.mean()
p1_lon = sig[sig.year <= 1985].begin_lon.mean()
p3_lat = sig[sig.year >= 2001].begin_lat.mean()
p3_lon = sig[sig.year >= 2001].begin_lon.mean()
shift_miles = 69 * ((p3_lat - p1_lat)**2 + (p3_lon - p1_lon)**2) ** 0.5
print(f"Shift: {shift_miles:.1f} mi")
# Output: Shift: 70.0 mi

Aggregated CSV files

For users who don't need the full parquet:

  • by_year.csv — annual counts, totals, intensities, casualties (78 rows: 1950–2024, plus 2025–2026 working rows)
  • by_state_year.csv — per-state per-year counts (≈4,500 rows)
  • by_state_era.csv — per-state P1/P2/P3 totals with per-year means and the P3:P1 ratio (54 rows)

Headline JSON

A condensed summary of every metric on this site:

Use this for quick checks or for driving an alternate visualization.

Source attribution

All data is from the NOAA Storm Events Database, downloaded 2026-07-12 from https://www.ncei.noaa.gov/pub/data/swdi/stormevents/csvfiles/. Bulk downloads are organized as StormEvents_details-ftp_v1.0_d<YEAR>_c<DATE>.csv.gz, one per calendar year, 1950 through present.

We do not redistribute NOAA data without attribution. The cleaned parquet file is a re-organization of the public NCEI release; it adds derived columns (year from BEGIN_DATE_TIME, month from BEGIN_DATE_TIME, mag_num from TOR_F_SCALE) but does not modify any underlying values.