Public Utility Data Liberation Project (PUDL) Data Release
Authors/Creators
- 1. Catalyst Cooperative
Description
v2026.11.0 (2026-11-10)
This is a regular quarterly PUDL release, with updates to EIA-860m, EIA-923, EIA-930, EPA CEMS, EPA MATS, and the EIA Bulk API data, plus a ton of other incidental updates.
This release upgrades PUDL dependencies to Pandas 3, DuckDB 2, Polars 2, and Splink 5. The upgrade to Pandas 3 came with some bonus bugfixes.
We've also got better data validation tests for FERC EQR and RUS, and a pile of bug fixes in RUS, EIA-861, EIA-176, and the EIA-860m changelog.
See below for details.
Enhancements
Standardized how distributed
datapackage.jsondescriptors are produced. FERC EQR now has its own package,FERCEQR_PACKAGE, and a dedicatedferceqr_datapackageasset built with the same factory aspudl_datapackage. Descriptors list only the sources their tables use and describe partitioned tables with per-partitionbytesandhashentries. Each quarterly FERC EQR archive is now verified against the md5 checksum in its Zenodo metadata, and downloading archives from remote storage requires settingPUDL_FERCEQR_ALLOW_DOWNLOADS. See #5279 and #5693.
Expanded Data Coverage
EIA-191
EIA-860M
EIA-923
EIA-930
EIA API Bulk Electricity Data
EPA CEMS
EPA MATS
Updated the raw EPA MATS archive with data through 2026 Q3 (September, 2026). This data is not yet deeply integrated into PUDL. See issue #5742 and PR #5748.
FERC CID
FERC Forms 2 and 6
Re-archived the raw FERC Form 2 and FERC Form 6 XBRL data. Coverage still ends with 2025. This data is converted to SQLite, but not deeply integrated into PUDL. See issue #5742 and PR #5743.
PHMSA
Updated the raw PHMSA archive with revised records. Coverage still ends with 2025. See issue #5742 and PR #5743.
New Data Tests & Validations
Updated
dbtdata validation now to support FERC EQR data. This requiresdbtconfiguration changes to handle partitioned parquet outputs. See issue #4864 and PR #5676. This PR also applies basic validation tests to FERC EQR tables, including row count tests.Updated
dbtdata validation to support FERC EQR, whose partitioned parquet outputs required several configuration changes. Theexternal_locationof each table is now generated automatically, row count tests accept string partition keys such asyear_quarter, anddbt_helpercan generate row counts for partitioned tables. Validation tests can also run against remote parquet datasets without downloading the files, and the FERC EQR deployment asset now runs the EQR validations before publishing. All FERC EQR tables get basic validation tests, including row counts. See #4864 and #5676.Validate that the net utility plant, total other property and investments, and total assets in core_rus7__yearly_balance_sheet_assets and out_rus7__yearly_balance_sheet_assets equal the sum of their subcomponents. The existing
total_utility_plantandtotal_current_and_accruedtests no longer allow any failures. See #5566 and #5729.
Bug Fixes & Data Cleaning
Added a missing US minor outlying islands territory entry to the core_pudl__codes_subdivisions table. See #5696 and #5716.
Restored non-utility property (RUS Form 7 Part C, line 6) to core_rus7__yearly_balance_sheet_assets and out_rus7__yearly_balance_sheet_assets. A typo in the column map (
non_utility_property_asset) meant the transform never picked it up. See #5566 and #5729.Restored non-utility property (RUS Form 12 Section B, line 6) to core_rus12__yearly_balance_sheet_assets and out_rus12__yearly_balance_sheet_assets. As in RUS 7, a typo in the column map (
non_utility_property_asset) meant the transform never picked it up, and the RUS 12asset_typevalues are corrected to match. See #5737, a follow-up to #5729.Added
plant_functionvalues to a few factoids in out_ferc1__yearly_rate_base. See #5690.Made transforms in FERC 1, FERC 714, SEC 10-K, PHMSA, RUS and the EIA API extractor behave identically under pandas 2 and 3 by replacing in-place, chained and dtype-changing assignments. Along the way: the PHMSA operators cleanup no longer nulls non-string values like numeric zip codes. SEC 10-K ownership percentages no longer misread leader dots (
"...99"was 0.0099, now 0.99), andfraction_ownedis now always within 0-1, with out-of-range values (about 9% of non-null values, e.g. adjacent percentages run together) set to null and a field constraint enforcing the range.drop_invalid_rows()has a newdropnaargument (default True) instead of requiring null values ininvalid_values; outputs are unchanged. See #5616, #5623 and #5720.Xin the EIA-861 dynamic pricing time-of-use, critical peak, real time and variable peak columns is now treated asTrue(a checked box) instead of being turned into a null, which changes four 2018 rows ofcore_eia861__yearly_dynamic_pricing. All EIA-861 Y/N flag columns now share one case-insensitive conversion to booleans, so a lowercaseyornis no longer turned into a null in a fewcore_eia861__yearly_reliabilityrows, and unexpected codes other than Y, N and X raise an error. See #5617, #5601 and #5718.Fixed the 2007-2011 EIA-861 advanced metering infrastructure column map, which was loading the utility ownership codes (e.g.
Cfor cooperative) intoshort_formand leavingentity_typenull. Those years ofcore_eia861__yearly_advanced_metering_infrastructurenow haveentity_typepopulated andshort_formnull. See #5617 #5718.When EIA-861 rows for the withheld utility 88888 are combined, boolean columns are no longer summed, nulls are now compatible with non-null values, and the row kept when values conflict no longer depends on input row order, which may change a few rows in several EIA-861 tables. See #5612 and #5718.
Made the EIA-923 transforms behave the same under pandas 3: date and month columns are now assigned directly instead of through chained
.locassignment, and the numeric columns summed when de-duplicating EIA-923 generation fuel rows are explicitly cast tofloat64. See #5619, #5620 and #5719.Made null handling in
stack_generators(), the EIA-176 "other" gas disposition categorization and the EIA-860 ownership spot-fix behave identically under pandas 2 and 3. Pandas 3 changed how nulls are treated bystack(),astype(str)and string comparisons, which would otherwise have left spurious null energy sources, null primary keys, or unremoved bogus ownership records. See #5621, #5622, #5624 and #5721.Stop
make_changelog()from dropping records whose values reverted to an earlier state (e.g.OP->OA->OP), leaving the intermediate value looking like a permanent change. This adds 3-7% more rows to core_eia860m__changelog_generators and the entity resolution forensics tables. It also removes emptyvalid_until_dateintervals, and ensures every series ends on the same date – one month past the entity's final report date. See #5730 and #5731.
Developer Experience
The FERC DBF field types we can't convert to SQL column types are now listed apart from the ones we can, instead of being mixed in as placeholder strings. A field of an unsupported type fails immediately with an error naming the type, field and table. See #5734.
Plant part record IDs for records with a null
utility_id_eianow end innullinstead of<NA>(or<na>), consistent with the rest of the ID. This changesrecord_id_eiaandplant_part_id_eiainout_eia__yearly_plant_partsand the related plant-part association tables for a few hundred records. See #5598 and #5721.Replaced the standalone
pixi run unmapped-idspytest task with analogous Dagster assets (pudl.dagster.assets.core.unmapped_ids) that identify FERC1 and EIA plant/utility IDs missing from the manual PUDL ID mapping spreadsheet. CSVs are saved with other build outputs onbuilds.catalyst.coopand fail the ETL if they are non-empty. See issue #4338 and PR #5539.Added a
DATAPACKAGESregistry of every datapackage PUDL distributes, withall_resources()andfind_resource()helpers, so asset checks, the docs, the data dictionary, dbt tooling and a DuckDB views database per package cover FERC EQR as well as the main PUDL tables. Every<name>_datapackageasset now has blocking checks that validate its descriptor and compare the declared fields with the columns in its Parquet files, and Pandera schemas are strict. This exposed a redundantfiling_quartercolumn in core_ferceqr__quarterly_identity which was removed. The datapackage anddeploy_ferceqrassets also record richer Dagster metadata. See #5279 and #5735.
Major Dependency Updates
A bunch of Python tabular data libraries we depend on have had major releases in the last month (or finally made it into PUDL in the last month anyway), with big performance improvements and new features, but also breaking changes.
Pandas 3
Upgraded to
pandas3 (pandas>=3.1,<4) andpandas-stubs3.1, adapting PUDL to the new string dtype, strictersetitemdtype rules, mandatory Copy-on-Write, andgroupby(...).applyno longer including grouping columns. We also fixed transforms that failed when only some years were processed (as in the fast ETL), removed pandas 2-only code and warning suppressions, and consolidated fragmented wide data frames that had caused thousands of warnings and slow transforms. See PRs #5130, #5718, #5719, #5720, #5721 and Epic #3737.We aimed to keep the outputs the same, so any difference comes from a deliberate decision rather than from the upgrade. Where pandas 2 was correct or the right value was unclear we preserved its behavior, e.g. missing EIA-860M
generator_idandboiler_idvalues stay the string"nan"(#5645), out-of-range dates stayNaT(#5644), and Unicode whitespace is still collapsed in strings (#5646).Where pandas 3 changed a value and the right one was clear, we fixed the data. This affects a small number of values: EIA-861 rows for the withheld utility 88888 (and the Texas state demand derived from them), the order of FERC 1 small plants rows and the plant and fuel types that depend on it, one malformed EIA-860M date, the dtype of
supplier_code_rusin the RUS 7 energy purchased table, etc. See PR #5130 and the commit messages for details.For more on what changed in pandas 3, see the pandas 3.0 announcement, the 3.0.0 and 3.1.0 release notes, and the migration guides.
DuckDB 2
Upgraded to DuckDB 2.0. Its Python client fetches results differently and the SQL parser is new, requiring small query changes. See PR #5726, the announcement and migration guide.
Polars 2
Upgraded to Polars 2 (in v2026.10.0). Lazy queries now stream by default without guaranteeing row order, and one
replace()becamestrict_replace(). See PR #5689, the announcement and upgrade guide.
Splink 5
Upgraded to Splink 5 (in v2026.10.0) and ported the FERC 1 to EIA plant-parts record linkage to its new API. The linkage shifts slightly, as if the random seed had changed. See PR #5698 and the Splink 5.0.0 release notes.
Other PUDL v2026.11.0 Resources
- PUDL v2026.11.0 Data Dictionary
- PUDL v2026.11.0 Documentation
- PUDL in the AWS Open Data Registry
- PUDL v2026.11.0 in a free, public AWS S3 bucket: s3://pudl.catalyst.coop/v2026.11.0/
- PUDL v2026.11.0 in a requester-pays GCS bucket: gs://pudl.catalyst.coop/v2026.11.0/
- Zenodo archive of the PUDL GitHub repo for this release
- PUDL v2026.11.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:997837fbf517e37206a918a72d134d48
|
37 Bytes | Download |
|
md5:790ce5286efeee4b9ebf1c7e55fdccac
|
506.7 MB | Preview Download |
|
md5:cf73bdadf7dbfac49685d9b270102a3e
|
327.2 kB | Preview Download |
|
md5:bdb1c0f0ff6856fc7e27ca972f09bcb5
|
275.0 MB | Preview Download |
|
md5:39691482a4b356888454c42013fe68b5
|
131.6 MB | Preview Download |
|
md5:121b201eb96c94c251d236287802c27a
|
274.6 kB | Preview Download |
|
md5:3cc4e770f619efc105327b8727211586
|
236.7 MB | Download |
|
md5:d9032ae8780c36c79d94e316afce0f95
|
246.5 MB | Preview Download |
|
md5:76211acf3c44dc6ff7375e2922e9e3ec
|
95.4 MB | Preview Download |
|
md5:79ea54e2f7a010eff65008fa53ff1670
|
2.3 MB | Preview Download |
|
md5:ee5c7f18d569c58f3f008b96a16bedff
|
8.5 MB | Preview Download |
|
md5:a88d4218d5e29b8ebe9edf1ded5075f1
|
74.7 MB | Preview Download |
|
md5:4ac9ce1c5a7639b2a2acdc62dd7a2a4f
|
34.0 MB | Preview Download |
|
md5:a66f98a02e46693146eb8543b7270967
|
221.2 kB | Preview Download |
|
md5:a60ec7c72618077ff9540915df957985
|
99.6 MB | Download |
|
md5:d887076cba4e49954d0ee2a2727e961b
|
37.5 MB | Preview Download |
|
md5:a1c3f14aac2a49c426b461abf15380dc
|
14.8 MB | Preview Download |
|
md5:88c21230a3b87ca0f03ba0b40b8e4657
|
2.3 MB | Preview Download |
|
md5:bd09d11e1a79a1623b3d9789bf336c9e
|
7.2 MB | Preview Download |
|
md5:2d37df1145c786c7c552d95b9ac4d1e2
|
2.9 MB | Preview Download |
|
md5:bd8ecf0254fbb49201b166e6d4c4af87
|
2.0 MB | Preview Download |
|
md5:c95112534754314997f4165bbb15145a
|
72.2 kB | Preview Download |
|
md5:334539593400854adb2d87c180404fc6
|
21.0 MB | Download |
|
md5:c392bf0d9eada6b714405ae2816b99c7
|
5.6 MB | Preview Download |
|
md5:02dede9527191e61a30e46606a1ceebf
|
3.9 MB | Preview Download |
|
md5:3f79917a66c43c02127c83823fa3b23d
|
978.1 kB | Preview Download |
|
md5:ba679325b7ae96c87b6fa5584cfae491
|
2.0 MB | Preview Download |
|
md5:3a50d0c7f2dd2e37f5360959052f178f
|
44.0 MB | Preview Download |
|
md5:878688830fa49b9c37e03a8f85d56410
|
19.3 MB | Preview Download |
|
md5:88df5ca65824e8fb8f681761696f3c54
|
127.9 kB | Preview Download |
|
md5:beb280ce0dec96d2290f30df6b981e5b
|
55.6 MB | Download |
|
md5:b0ef9e65f85172811fd9cbe0692226f4
|
30.1 MB | Preview Download |
|
md5:0dc0bec992319318319964933ec261be
|
10.5 MB | Preview Download |
|
md5:e742a3e4b4d035d3b4082d628163b4c2
|
1.3 MB | Preview Download |
|
md5:240ab648e9b6fb13f2540b217638676e
|
3.0 MB | Preview Download |
|
md5:7509fc4fbc561b3eb0cdf1e043c84534
|
60.0 MB | Download |
|
md5:759a414176324fb2b36465e5b07b6706
|
243.5 MB | Preview Download |
|
md5:d8998ccd20630277764e6dd36aaf7963
|
30.5 MB | Preview Download |
|
md5:1333d26391bed7d8f5ab86972354646f
|
65.7 kB | Preview Download |
|
md5:83bcf37029395440c6a0efb7ce49ee8e
|
192.9 kB | Preview Download |
|
md5:747bbbbab150fd945fb268f6232ae314
|
10.6 GB | Download |
|
md5:e266afec99580799f96fd5bcc268f58b
|
3.5 GB | Preview Download |
|
md5:086b61b151c439cb8ca9fce2fb1ec86c
|
12.0 GB | Preview Download |
|
md5:c5a6840b2c9360822bcf38b6cc781189
|
3.3 MB | Preview Download |
Additional details
Related works
- Is documented by
- https://docs.catalyst.coop/pudl/en/v2026.11.0/ (URL)
- Is supplemented by
- Software: 10.5281/zenodo.24119257 (DOI)
- Software: https://github.com/catalyst-cooperative/pudl/releases/tag/v2026.11.0 (URL)