claritystorm/epa-tri-toxic-release-inventory
EPA Toxic Release Inventory — 2022–2023 reporting years Rebuilt September 19, 2026 from the two pinned EPA national Basic Data CSV files. This is a dated historical snapshot; future updates are not included. The archive contains 158,687 TRI form records, representing 23,081 distinct TRI facilities. It does not contain the previously advertised 1987-onward history. This repository contains the deterministic 1,000-row sample. The complete dated CSV/Parquet package is available at… See the full description on the dataset page: https://huggingface.co/datasets/claritystorm/epa-tri-toxic-release-inventory.
EPA Toxic Release Inventory — 2022–2023 reporting years
Rebuilt September 19, 2026 from the two pinned EPA national Basic Data CSV files. This is a dated historical snapshot; future updates are not included. The archive contains 158,687 TRI form records, representing 23,081 distinct TRI facilities. It does not contain the previously advertised 1987-onward history.
This repository contains the deterministic 1,000-row sample. The complete dated CSV/Parquet package is available at ClarityStorm. The following counts and table descriptions refer to the full package.
Tables and joins
epa_tri_releases: 158,687 rows; unique(year, doc_ctrl_num)form keys. A row represents a source form record, not an individual pollution incident. Multiple forms may share a facility, chemical and year; do not deduplicate on that tuple.epa_tri_facilities: 44,385 facility attribute versions across 43,982 facility/year combinations. All 35 original facility fields, including reporting year, define a version. Changing company, location or industry attributes are preserved. This is not a table of 44,385 distinct physical facilities.
Join the tables using facility_record_id (many reports to one facility version). Do not join on TRIFID alone: it repeats across years and attribute versions and would multiply reports. The SHA-256 key uses UTF-8 JSON arrays of the 35 original source strings, no ASCII escaping and compact separators. It is a derived key, not an EPA-issued identifier. source_record_count and facility_year_variant_count make multiplicity explicit.
Quantities and interpretation
The 71 quantity/ratio columns use exact decimal128(30,7), preserving source precision. No risk score, toxicity weighting or cross-chemical unit conversion is applied. unit_of_measure is Pounds or Grams; dioxin and dioxin-like compounds (N150) use grams. Group by unit before summing; mass alone does not measure risk. production_ratio is dimensionless, not a chemical mass.
form_type retains EPA's A or R. Form A does not report release quantities; its source zeroes are preserved with quantity_reporting_status=not_reported_form_a. EPA also inserts zeroes for certain blank/not-applicable quantities. A zero cannot automatically establish absence of pollution. Reporting thresholds, covered industries and chemicals limit what TRI represents.
Supplied totals are preserved. Nine *_difference fields show reported total minus the literal component sum in EPA's guide, with corresponding *_matches_components flags. These are formula comparisons, not judgments that a source report is wrong. On-site, off-site and combined release totals differ by at most 0.002 source units from those sums (921, 180 and 302 rows respectively).
The guide omits POTW treatment from its treatment-total formula: 6,846 rows differ from that literal sum, while adding POTW treatment removes all differences above 0.01 source units. Energy-recovery totals differ in 354 rows and total transfers in 584 rows; the largest discrepancies are 142,991 pounds. Their source calculation semantics remain unresolved. Use these fields with the explicit comparison flags; do not substitute a guessed corrected total. The main release quantities are separate from these waste-management fields. Validation establishes faithful source transformations, not scientific accuracy of facility reporting.
Coordinates, text and schema changes
latitude_raw and longitude_raw retain the original text. Numeric coordinates are supplied only for complete, finite, nonzero, in-range pairs. coordinate_status reports missing/incomplete/invalid/zero-placeholder pairs. Bounds do not establish geographic accuracy. horizontal_datum is retained as supplied; no datum is inferred and no coordinate transformation is applied.
Source text casing, leading-zero identifiers and literal NA are retained. Empty source text remains an empty string. EPA YES/NO flags remain strings. Read CSV identifier fields as strings and disable default NA-token inference. All numeric values and source columns were checked against the pinned inputs; original numeric formatting (trailing zeroes) is not retained. Historical source files may be revised.
This repair changes several column names and types to match their documented meaning; use source-column-mapping.json and field-dictionary.md. The old facility table discarded attribute versions; migrate joins to facility_record_id.
Example
import pandas as pd
reports = pd.read_parquet('epa_tri_releases.parquet')
facilities = pd.read_parquet('epa_tri_facilities.parquet')
joined = reports.merge(
facilities[['facility_record_id', 'facility_year_variant_count']],
on='facility_record_id', validate='many_to_one'
)
# Compare reported quantities only within each unit; Form A values are not measured zeroes.
totals = reports.loc[reports.form_type.eq('R')].groupby(
['year', 'state', 'unit_of_measure']
)['total_releases'].sum()The deterministic sample uses pandas random_state=42 and is drawn from the complete two-year release. It is not an estimate of national totals or a representative survey. Source-row provenance refers to the original national CSVs.
Source: EPA TRI Basic Data. See source-manifest.json for exact URLs, retrieval times and SHA-256 hashes and repair-policy.md for the acceptance rules. EPA publishes the source data for public use. ClarityStorm provides this documented CSV/Parquet preparation.
