Public Utility Data Liberation Project (PUDL) Data Release
Authors/Creators
- 1. Catalyst Cooperative
Description
v2026.10.0 (2026-10-14)
This is a regular monthly PUDL data release, primarily motivated by updating the EIA-860M monthly data through August 2026. It also brings in final release 2025 data for the EIA-860, EIA-861, and EIA-923, plus straggler FERC Form 1 filings from 2025.
We made several important improvements for reproducibility in this release. These
changes make all outputs fully deterministic, which will make it possible to detect
specific changes between builds. We've also added the new table
core_epamats__hourly_emissions brings hourly mercury and hydrogen chloride
emissions into PUDL. Thanks to @bsousa22 for this contribution! Finally, we
fixed a longstanding bug in the net generation and fuel allocation that silently
dropped legitimate data for generators transitioning between
proposed/existing/retired status across a multi-year
ETL run.
Enhancements
Added
county_id_fipsandstate_id_fipsto the core_eia__entity_plants, out_eia__monthly_generators and out_eia__yearly_generators tables. See PR #5688.out_eia__yearly_generators_by_ownership now identifies each generator's operator as well as its owners, via new
operator_utility_id_eia,operator_utility_id_pudlandoperator_utility_name_eiacolumns, with foreign key checks on the IDs. See issue #5550 and PR #5585.
New Data
EPA MATS
Created the core_epamats__hourly_emissions table, bringing hourly mercury and hydrogen chloride emissions data from the EPA into PUDL. See issue #5357 and PR #5572. Thanks to contributor @bsousa22 for bringing in this data!
Expanded Data Coverage
EIA-860
EIA-860M
EIA-861
EIA-923
Added final release data from 2025 for EIA-923, and monthly release from June 2026. See issue #5594 and PR #5599.
FERC Form 1
Integrated any updates or straggler filings from 2025 for FERC Form 1. See PR #5668.
Documentation
Fixed dbt macro argument documentation in
dbt/macros/schema.ymlanddbt/tests/data_tests/generic_tests/schema.ymlto match dbt 1.12's stricter validation of macroarguments:blocks against their jinja signatures, clearing a long list of spuriousdbt parsewarnings. Also standardized on the long-formstringtype name (rather thanstr) throughout, since both are accepted by dbt but were used inconsistently. See PR #5593.
New Data Tests & Validations
Added unit tests for the ID assignment process that builds core_epa__assn_eia_epacamd_subplant_ids. Fixed several bugs that those tests exposed, including one that could split a physically connected group of generators into separate subplants. Simplified the underlying ID assignment logic to be entirely graph-based. See issue #5675 and PR #5543. Part of an effort to harmonize the Open Grid Emissions initiative and PUDL. See epic #5439 which is tracking that effort.
Added minimum and maximum constraints for plant and Census latitudes and longitudes, to catch impossible locations. EIA-860M coordinates are not cleaned up (about 0.04% of its records are obviously wrong), so core_eia860m__changelog_generators is exempt, and new dbt tests cap the number of known bad records in it instead. See PR #5697.
Bug Fixes & Data Cleaning
Made the EIA-930 and FERC-714 hourly demand imputation deterministic. The underlying tensor-completion algorithm previously relied on a unseeded random subsampling mechanism which meant
demand_imputed_pudl_mwhvalues could shift slightly from one build to the next. For our hourly annual (8760) imputation blocks, the subsampling wasn't any faster than using all the data points, so we removed it. Added a guard against the algorithm stopping prematurely on a transient dip in its convergence metric. This was never observed happening, but seemed uncomfortably close to the set tolerance. Also stopped replacing values that were not flagged for imputation with the values estimated by the tensor completion. They should match the original reported value exactly now, rather than carrying tiny model reconstruction error. Tightened the corresponding dbt tolerance tests accordingly. See #5649 and #5656.Fixed
allocate_gen_fuel.pysilently dropping legitimate generation and fuel data for generators transitioning betweenproposed/existingorexisting/retiredstatus across a multi-year ETL run. Unified the slightly different logics of these transitions into a single, shared, symmetric process. This simplification exposed a bug in which one generator's status transition could silently prevent data from another group of generators at the same plant from being allocated. Added extensive unit tests and new dbt data quality tests validating that >=99.7% of all reported generation and fuel survives allocation. Thanks to @grgmiller for surfacing the issue and initiating the fix. See #5440 and PRs #5419, #5511.Fixed a bug where a skipped nightly/release build (i.e. one that found good build outputs for its commit and kicked off the
deploy-pudl.ymlworkflow) uploaded its own small logfile to the build outputs bucket. This created newer object path with the same commit confusingdeploy-pudlcausing deployment to fail. See #5579 and #5580.Fixed a broken metadata override in
CashFlowsTableTransformerthat left thestarting_balance/ending_balancerows forcash_and_cash_equivalentsin core_ferc1__yearly_cash_flows_sched120 withoutrow_type_xbrl,is_within_table_calc,balance, orferc_accountmetadata. See #5587 and #5588.Made
plant_id_ferc1deterministic. The IDs assigned to FERC 1 steam plants used to be reshuffled by tiny changes in the input data, even when the plants themselves were unchanged. They now depend only on which records belong to each plant, so unrelated plants keep their IDs and differences between runs reflect real changes. IDs now start at 1 instead of 0, and are still not stable across data updates. We also corrected several hand-assignedplant_id_pudlvalues that split one plant across multiple IDs, which cut the number ofplant_id_ferc1values spanning more than oneplant_id_pudlfrom 6 to 2. See issue #5609 and PR #5642.Updated the record-linkage which assigns
plant_id_ferc1to make it insensitive to floating point noise. See issue #5609 and PR #5687.Fixed tags for new 2025 XBRL factoids and rescued the
ferc_accountfield in out_ferc1__yearly_rate_base. See #5520 and #5597.Fixed
valid_until_datein the_core_eia__forensics_entity_resolution_*and_core_rus*__forensics_entity_resolution_borrowerstables. Each record's end date was being drawn from an unrelated column of the same entity, and ties were sorted arbitrarily, so values were often wrong and changed between builds. It's now the next change in the same column, and the output is deterministic. See #5608 and #5641.Made the FERC 1 to EIA plant-parts record linkage reproducible. The splink model sampled record pairs without a seed and broke ties between equally probable matches arbitrarily, so about 1% of the matches in out_pudl__yearly_assn_eia_ferc1_plant_parts changed on every run even with identical inputs. The sampling is now seeded and ties are broken by EIA record ID. See #5610 and #5643.
Made shared helpers in
pudl.helpersbehave identically under pandas 2 and 3.standardize_percentages_ratio()now accepts numeric strings (as some Excel-sourced columns arrive) and always returnsfloat64; genuinely non-numeric values still raise.scale_by_ownership()now always returnsfloat64for the scaled columns, where the dtype previously depended on the data (Int64if every value happened to be integral). String-cleaning, boolean and phone-number helpers were also hardened against pandas 3 dtype behavior changes. See #5613, #5614, #5615 and #5662.Fixed the integer NERC region code
25470reported by utility 55959 in 2013 and 2014 in the EIA-861 tables, which was becomingUNKinstead ofMRO. See PR #5685.Fixed a bug introduced in PR #5506 which improperly aggregated generators with multiple owners after an ineffective drop duplicates, resulting in double counting in a small number of out_eia__yearly_plant_parts records. See issue #5651 and PR #5703.
Fixed a bug that gave plants with no reported state the state FIPS code
74(U.S. Minor Outlying Islands). Those plants in core_eia__entity_plants, and the generators built from them, now have a nullstate_id_fips. See PR #5697.
Performance Improvements
Sped up the FERC EQR batch deployment to cloud object storage from ~3 hours to ~5 minutes. Uploads to and server-side copies within S3 now go through
boto3in the newpudl.deploy.s3_transfermodule, while GCS and all other targets stay onfsspec/UPathand run in a thread pool. Deployment now stages each build under a per-build._staging_{BUILD_ID}prefix, verifies the staged files by name and size, snapshots the previous outputs into._ferceqr_previousfor manual rollback, and then merges the staged files into the live prefix. Existing files that a build doesn't replace are left in place in anticipation of doing incremental per-file updates. The build VM was also bumped toc4d-standard-32after an out-of-memory crash. See issue #5317 and PR #5561.Sped up the FERC EQR batch ETL from ~45 minutes to ~25 minutes: a standalone Dagster gRPC code server, newest-quarter-first partitioning, and a bounded
ferceqr_extractconcurrency pool. Also fixed an intermittent out-of-memory kill that silently dropped a quarter from the build, by capping DuckDB's resource use per connection and streaming quarterly archive downloads instead of reading them into memory. See issue #5318 and PR #5595.Switched all of PUDL's Parquet outputs from snappy to zstd compression, which makes the files substantially smaller. The codec and compression levels are now set in one place (
pudl.PARQUET_COMPRESSIONand related constants) and used by every Parquet writer. See #5603 and #5604.
Developer Experience
Replaced all remaining uses of
importlib.resourceswith directpathlib.Pathaccess to files undersrc/pudl/package_data, since PUDL is only ever run from a git checkout and no longer needs to support being installed as a distributable package. Also removed the now-unneeded dummy__init__.pyfiles that madepackage_datasubdirectories importable, which incidentally stops Sphinx from generating documentation pages for these non-code directories. See PR #5592.Upgraded to Pyrefly 1.3.0 and adopted its new concise baseline format. Fixed a handful of genuine typing gaps that the upgrade surfaced. Mostly this involved type narrowing in places where an object that might be
Nonewas subject to a regex match, dict lookup, or other operation that would fail onNone. See PR #5583.Switched to using quieter, more compact
pytestoutput instead of logging 1000s of tests to the terminal. Fast ETL in pipeline tests will still log. Madepixi.lockdrift checking in pre-commit hooks more robust. Fixed open SQLite database warnings coming from FERC SQLite IO Manager. See PR #5573.
Other PUDL v2026.10.0 Resources
- PUDL v2026.10.0 Data Dictionary
- PUDL v2026.10.0 Documentation
- PUDL in the AWS Open Data Registry
- PUDL v2026.10.0 in a free, public AWS S3 bucket: s3://pudl.catalyst.coop/v2026.10.0/
- PUDL v2026.10.0 in a requester-pays GCS bucket: gs://pudl.catalyst.coop/v2026.10.0/
- PUDL v2026.10.0 release on GitHub
Contact Us
If you're using PUDL, we would love to hear from you! Even if it's just a note to let us know that you exist, and how you're using the software or data. Here's a bunch of different ways to get in touch:
- Follow us on GitHub
- Use the PUDL Github issue tracker to let us know about any bugs or data issues you encounter
- GitHub Discussions is where we provide user support.
- Watch our GitHub Project to see what we're working on.
- Email us at hello@catalyst.coop for private communications.
- On Mastodon: @CatalystCoop@mastodon.energy
- On BlueSky: @catalyst.coop
- Connect with us on LinkedIn
- Play with our data and notebooks on Kaggle
- Combine our data with ML models on HuggingFace
- Learn more about us on our website: https://catalyst.coop
- Subscribe to our announcements list for email updates.
Files
censusdp1tract.sqlite.zip
Files
(28.4 GB)
| Name | Size | |
|---|---|---|
|
md5:c5f195d03227445c1bd9c45325091610
|
506.7 MB | Preview Download |
|
md5:72957c9550ad7177a188f41933a66527
|
327.2 kB | Preview Download |
|
md5:05331c189222fe2a81ec0f3b0d46c8f2
|
275.0 MB | Preview Download |
|
md5:2f70a1be9a50b4b280004f08dc0a5e54
|
131.6 MB | Preview Download |
|
md5:4d633069132fb60dae70f6955ea5d9e0
|
274.6 kB | Preview Download |
|
md5:2961b3c317579e6a7eac03813f4a3b85
|
1.2 GB | Download |
|
md5:28e12b9c064af70d01168517c98d3a69
|
247.3 MB | Preview Download |
|
md5:0dca3861b42663f763b705d9c33edc58
|
95.4 MB | Preview Download |
|
md5:7cf3116bf90014e99bbf7268de2d8f9c
|
2.3 MB | Preview Download |
|
md5:ee5c7f18d569c58f3f008b96a16bedff
|
8.5 MB | Preview Download |
|
md5:57d3aed9a8fee7aabab9731c9174d23f
|
74.7 MB | Preview Download |
|
md5:a342afac829b598a476862ff5781df9c
|
34.0 MB | Preview Download |
|
md5:704e8491ad2e8d65e3181ede8129add2
|
221.2 kB | Preview Download |
|
md5:c3edea93f68b9358eea2d647ef5a26ad
|
148.1 MB | Download |
|
md5:73520f7706a85044fe41986c1d24937c
|
37.5 MB | Preview Download |
|
md5:0a63b400e13eb071402e9b74788c8320
|
14.7 MB | Preview Download |
|
md5:c7833812c60555b383a18088f2fdbbc0
|
2.3 MB | Preview Download |
|
md5:bd09d11e1a79a1623b3d9789bf336c9e
|
7.2 MB | Preview Download |
|
md5:d509d8ac45c3fc337c36b29aa25d934e
|
2.9 MB | Preview Download |
|
md5:332042a711b3779c9332203321e3706c
|
2.0 MB | Preview Download |
|
md5:3384003901f01fda6665d412a89aefa0
|
72.2 kB | Preview Download |
|
md5:1c579079c763e4728f19ef0a5b9325fb
|
50.9 MB | Download |
|
md5:71c20d3c2b78109edce1a1e2fe925883
|
5.6 MB | Preview Download |
|
md5:d434f49ed22c3e359e6f4570c50bc4f0
|
3.9 MB | Preview Download |
|
md5:30b1576acd311263593c1efd9ef85d5a
|
978.1 kB | Preview Download |
|
md5:ba679325b7ae96c87b6fa5584cfae491
|
2.0 MB | Preview Download |
|
md5:b03ae8c129b9339fefa374e445ed625f
|
44.0 MB | Preview Download |
|
md5:ce66e65957c67d4cbebd960d52206c61
|
19.3 MB | Preview Download |
|
md5:744698388f053a2c9fa04323c5212bda
|
127.9 kB | Preview Download |
|
md5:32f67cac9c8aeef197321e831d8e97ec
|
71.8 MB | Download |
|
md5:87441e2bfbc1d3328333a001c89432b6
|
30.1 MB | Preview Download |
|
md5:6afe0b113a8b89122a177b756b072af6
|
10.5 MB | Preview Download |
|
md5:1de418ab8c13701aa02d1976685f28cc
|
1.3 MB | Preview Download |
|
md5:240ab648e9b6fb13f2540b217638676e
|
3.0 MB | Preview Download |
|
md5:1a8190aba238229530ce4d94e1f53143
|
81.0 MB | Download |
|
md5:06f7126293c520ffc8ffbf7d0b997fe3
|
243.5 MB | Preview Download |
|
md5:1f2839fb75b54b9c175a5674037d9590
|
30.5 MB | Preview Download |
|
md5:82c6f7bb275b01f9ad9b0d31c6f94017
|
65.7 kB | Preview Download |
|
md5:83bcf37029395440c6a0efb7ce49ee8e
|
192.9 kB | Preview Download |
|
md5:7fe0382f23ec4dcb7ab805cd5fac3c72
|
38 Bytes | Download |
|
md5:abda191be5c7f36fb355eaa88c221a9b
|
9.5 GB | Download |
|
md5:8498ce0ddd15f08a54daf9287afaf51a
|
3.5 GB | Preview Download |
|
md5:9efa50e6c38e503e1de3da42ccb471d3
|
12.0 GB | Preview Download |
|
md5:04ce96dc705cc18be3a26a94cd92c388
|
4.5 MB | Preview Download |
Additional details
Related works
- Is documented by
- https://docs.catalyst.coop/pudl/en/v2026.10.0/ (URL)
- Is supplemented by
- Software: https://github.com/catalyst-cooperative/pudl/releases/tag/v2026.10.0 (URL)