us-county-airdata-trends
U.S. county-level 5-year AirData emission trends, derived from EPA AirData annual AQI summaries 2020-2024.
Sensitivity-gated 5-year change classification for 994 US counties, with explicit display-hold flags for counties below the facility-count floor (368 counties) and the 4 petrochemical-corridor counties that surface a methodology-review notice instead of a trend value.
Produced by ZipCheckup Trend Layers v1. Display methodology underwent a 4-agent legal pre-build review (FTC compliance + defamation/stigmatization + statistical methodology + feeds feasibility) — see methodology page.
Install
pip install us-county-airdata-trends
Quick start
import us_county_airdata_trends as airdata
# Look up a single county
la = airdata.get_county("06037")
# {
# "county_fips": "06037",
# "county_name": "Los Angeles",
# "state": "CA",
# "airdata_change_class": "stable",
# "airdata_pct_change": -5.9,
# "cycles_used": 5,
# "facility_count": 331,
# "sensitivity_robust": None,
# "skip_reason": None,
# "source_attribution": "EPA AirData annual AQI summaries 2020-2024",
# "petrochemical_corridor": False,
# "aqi_latest_year": 2024,
# }
# All counties for a state
texas = airdata.filter_counties(state="TX")
# Counties classified as decreasing (and display-eligible)
decreasing = airdata.filter_counties(change_class="decrease", exclude_skipped=True)
# Display-eligible vs display-held — for methodology dashboards
eligible = airdata.get_display_eligible_counties()
held = airdata.get_display_held_counties()
# Coverage metadata
print(airdata.meta)
# Meta(generated='2026-05-25', total_counties=994, license='CC-BY-4.0')
# Field schema
print(airdata.schema())
Field schema
| Field | Type | Description |
|---|---|---|
county_fips |
str | 5-digit US county FIPS code |
county_name |
str | None | County name without "County" suffix |
state |
str | None | 2-letter state abbreviation |
airdata_change_class |
"decrease" | "increase" | "stable" | "insufficient_data" | None |
Sensitivity-gated 5-year class |
airdata_pct_change |
float | None | Signed percent change between earliest and latest cycle |
cycles_used |
int | None | Number of reporting cycles (target 5, minimum 3) |
facility_count |
int | None | Distinct facilities in latest cycle (display gate ≥5) |
sensitivity_robust |
bool | None | True if direction stable when top-1 facility excluded |
skip_reason |
str | None | "facility_count_below_threshold" | "petrochemical_corridor" | "cycles_below_threshold" | None |
source_attribution |
str | Required attribution string for any public render |
petrochemical_corridor |
bool | True for 4 corridor counties (Harris TX, Calcasieu LA, Iberville LA, Kanawha WV) |
aqi_latest_year |
int | None | Latest reporting year included in window |
Full machine-readable schema: ship via airdata.schema().
Coverage (snapshot)
| Class | Counties |
|---|---|
decrease |
67 |
increase |
176 |
stable |
376 |
insufficient_data (display held) |
375 |
| Total | 994 |
Of which display-held:
facility_count_below_threshold: 368petrochemical_corridor: 4
Methodology
Source: EPA AirData annual AQI summaries (annual_aqi_by_county_{YEAR}.zip), years 2020-2024, retrieved via aqs.epa.gov/aqsweb/airdata/download_files.html.
Pipeline:
- Aggregate facility-reported emissions to county rollups per year.
- Compute percent change between earliest and latest cycle.
- Apply sensitivity gates:
≥3reporting cycles in window≥5reporting facilities in latest cycle- Top-1-exclude robustness: direction unchanged when largest facility excluded
- Bucket as
decrease/increase/stable(|pct_change| < 10%) /insufficient_data. - Hold display for 4 petrochemical-corridor counties pending methodology review (Harris TX
48201, Calcasieu LA22019, Iberville LA22047, Kanawha WV54039) — seepetrochemical_corridorboolean.
Full methodology: zipcheckup.com/methodology/airdata-trend/.
Caveats
- This is facility-reported emissions data, not ambient air quality. The trend reflects what facilities reported to EPA — not what residents breathe.
- AirData updates may reflect reporting methodology changes between cycles. Disclose this in any user-facing render.
- 4 petrochemical-corridor counties surface as
skip_reason: "petrochemical_corridor"with a methodology-review notice; do not silently treat them asinsufficient_data. - This package is updated periodically. The
meta.generatedfield surfaces the build date — check it before using for time-sensitive analysis.
License
CC BY 4.0. Free to use with attribution.
Citation
Akulov, A. (2026). U.S. County AirData 5-Year Emission Trends [Data set].
ZipCheckup. https://doi.org/10.5281/zenodo.20382474
Or BibTeX:
@dataset{zipcheckup_us_county_airdata_trends,
author = {Akulov, Artem},
title = {U.S. County AirData 5-Year Emission Trends},
year = {2026},
publisher = {ZipCheckup},
doi = {10.5281/zenodo.20382474},
url = {https://doi.org/10.5281/zenodo.20382474}
}
Related
us-water-quality-data— ZIP-level water quality dataset (sibling package).us-housing-risk-data— Housing risk and home values (sibling package).- ZipCheckup Public API — REST API including
/v1/county/{fips}/airdata-trend/.
Source repository
github.com/artakulov/waterbyzipcode (this package lives under packages/us-county-airdata-trends-python/).
Metadata
Release files for us-county-airdata-trends 2026.5.26
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| us_county_airdata_trends-2026.5.26.tar.gz | 30.8 kB | Without provenance | Details for us_county_airdata_trends-2026.5.26.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| us_county_airdata_trends-2026.5.26-py3-none-any.whl | Python 3 | none | any | Details for us_county_airdata_trends-2026.5.26-py3-none-any.whl |
Total release size: 61.7 kB
Release files / us_county_airdata_trends-2026.5.26.tar.gz
| Download URL | us_county_airdata_trends-2026.5.26.tar.gz |
|---|---|
| Size | 30.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2c05497865a853e28cb98b2ab90a8043b4b4ad4f42cabc519780ce4666d17567
|
|
BLAKE2b-256 checksum How to use checksums |
f61f7f2ca628151a38addc2f5a8a37c5cb04fa71c3fdb60229ad84fcd527adc8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Release files / us_county_airdata_trends-2026.5.26-py3-none-any.whl
| Download URL | us_county_airdata_trends-2026.5.26-py3-none-any.whl |
|---|---|
| Size | 30.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1358989d8fd15ed6ff4d6ec1125ac1c99f54efebec9e7c0c3878f1dfe673862b
|
|
BLAKE2b-256 checksum How to use checksums |
98a8c26462d9cd5a1b73d54fed20d5349b2390863ebc755780175ecd72db5ca3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Security for us-county-airdata-trends 2026.5.26
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.