Public Utility Data Liberation Project (PUDL) Data Release
Abstract
v2026.9.0 (2026-09-11) This is a regular monthly PUDL data release, primarily motivated by updating the EIA-860M monthly data through August 2026. The biggest change this month is that we've started publishing a DuckDB version of the PUDL database! We will be deprecating the old pudl.sqlite database in January, 2027. See below. We also closed a gap where Pandera's Polars backend was silently skipping some of the schema validation checks declared in our metadata (thankfully they were being enforced independently elsewhere!). We've added several new tables (EIA-176 company characteristics, EIA-923 fuel stocks and energy storage, PHMSA distribution mains by install decade), and extended the new CEMS-derived operational characteristics analysis back to 2000. See below for all the details, and the linked PRs and issues for the full story. Output Formats & Distribution Added a fully processed pudl.duckdb database. After the ETL completes we now assemble all of the non-hourly PUDL tables into a single DuckDB database named pudl.duckdb alongside pudl.sqlite, both built directly from the Parquet outputs. It preserves the full set of column checks and primary key constraints. Foreign key constraints are currently omitted due to a handful of column type conflicts outlined in issue #5552 being addressed in PR #5554. Both databases are published to S3, GCS, and Zenodo along with our other outputs. See Data Access. See PR #5538. The fully processed pudl.sqlite database is deprecated. PUDL's ETL no longer writes SQLite directly; pudl.sqlite is now built from the Parquet outputs after the ETL purely for backwards compatibility. We will stop producing SQLite versions of the fully processed PUDL data in 2027. Please migrate to the Parquet outputs or the new pudl.duckdb database. This deprecation does not affect the minimally processed raw FERC data, which will continue to be distributed as SQLite for the time being, but will likely transition at some point in the near future as well. See PR #5538. New Data EIA-176 Added core_eia176__yearly_company_characteristics with company operation type, ownership type, and company characteristic fields from EIA Form 176 Part 3 (Lines A-D). Includes alternative_fleet_size, customer_choice_residential_eligible, customer_choice_residential_participating, has_sales_or_acquisitions, and natural_gas_pump_price_dollars_per_mcf (2014-2016 only). National-level adjustment records (operating_state FX, MX, BL, OO) are excluded. The raw is_other_ownership and is_other_ownership_2 fields (which never co-occur) are merged into a single is_other_ownership boolean. See #4697 and #5412. Thank's to @MeadBarrel for all the work on getting natural gas data integrated into PUDL, and the ongoing support from @switchbox-data. EIA-923 Added the _core_eia923__yearly_fuel_stocks table, which reports end-of-month coal, petroleum liquids, and petroleum coke stocks held at electric power sector generating facilities, aggregated by census division or state. The wide monthly source columns are reshaped into tall monthly records and the reported thousand-unit quantities are converted to base units. See issue #5081 and PR #5431. Thanks to @lazizbekravshanov for this contribution! Added out_eia923__energy_storage for reported EIA-923 energy storage operations, with out_eia923__monthly_energy_storage and out_eia923__yearly_energy_storage providing monthly and yearly aggregations. All three include plant and utility metadata. See issue #4311 and PR #5489. Shout out to @giovannicozzolongo for this. Extracted the unprocessed raw_eia923__source_and_disposition table for further future cleaning, see PR #5546. Thanks to contributor @giovannicozzolongo! EPA CEMS Added a new analysis output, out_epacems__yearly_operational_characteristics, which estimates generator operational characteristics such as minimum stable operating level, minimum up/down times, ramp rates, and heat rates at maximum and minimum load, inferred from hourly EPA CEMS gross load and fuel heat content data over a rolling three-year window. This dagsterizes and vectorizes an analysis originally developed by Sylvan Energy, making it available for all reporting states rather than just California. The output is experimental and marked accordingly, since we are soliciting feedback from the community on the underlying methodology. See issue #5106 and PR #5190. out_epacems__yearly_operational_characteristics now reports these estimates for every calendar year with a full three-year trailing window of usable EPA CEMS data, rather than only the most recent year, going back to 2000 (EPA CEMS's first three reporting years, 1995-1997, are excluded due to known poor unit coverage). Also recalibrated the associated dbt data validations against physically grounded bounds (e.g. the 3.412 MMBtu/MWh thermodynamic floor on heat rates, and the exact trailing window length as an upper bound on minimum up/down times) rather than thresholds fit to a single year of data. See PR #5474. PHMSA Added the core_phmsagas__yearly_distribution_by_install_decade table, which reports PHMSA gas distribution mains miles and services by installation decade. See issue #5266 and PR #5443. Expanded Data Coverage EIA-191 Updated EIA-191 data to include additional records through June 2026. See PR #5572. EIA-860M Added EIA-860M data through July 2026. See issue #5549 and PR #5547. EIA-861 Added early release data from 2025 for EIA-861. See issue #5492 and PR #5493. EIA-930 Updated EIA-930 data to include data published up through the beginning of September 2026. See PR #5572. EIA API Bulk Electricity Data Updated the EIA Bulk Electricity data to include data published up through the beginning of June 2026. See PR #5572. EPA CEMS Updated the EPA CEMS data with additional records through June 2026. See PR #5572. EPA MATS Updated the raw EPA MATS archive with additional records through 2026 Q2 (June 2026). This data is not yet deeply integrated into PUDL. See PR #5572. NREL ATB Updated the NREL ATB extractor and transformer to accommodate changes to the 2024 data and format. See issue #5467 and PR #5513. Added NREL ATB 2025 data. See PR #5569. PHMSA Added 2025 distribution and transmission data for PHMSA. See issue #5504 and #5548. FERC EQR Added full 2026Q2 data for FERC EQR. See PR #5442. FERC Form 2 Updated the raw FERC Form 2 archive to include additional 2025 data. This data is converted to SQLite, but not deeply integrated into PUDL. See PR #5572. Vibrant Pattern Futures Resource Adequacy Renewable Energy (RARE) Power Dataset Added 2024 data for RARE. See issue #5544 and PR #5570. New Data Tests & Validations The subcomponents_sum_to_total dbt test can now identify subcomponents and totals by a combination of categorical columns (e.g. (cost_group, cost_type) tuples) rather than values from a single column, enabling validation of calculations that cross more than one categorical column. Used this to complete the totals validations for core_rus12__yearly_plant_costs and out_rus12__yearly_plant_costs, adding maintenance, operations & maintenance, fixed cost, and total power cost checks, and fixing several existing checks that referenced non-existent cost categories. The test also gained an opt-in minimum_total_coverage argument that catches totals which silently match no records at all (e.g. a misspelled total_label or a category renamed in a future data update), enabled for all of the plant costs checks. See issues #5378, #5154 and PR #5510. Calibrated per-year error thresholds for the heat-rate outlier checks on out_epacems__yearly_operational_characteristics, since the multi-year extension in PR #5474 introduced report years whose data quality, and thus expected outlier rate, varies considerably over the 2000-2025 span. See PR #5571. Bug Fixes & Data Cleaning Fixed a bug in out_eia__yearly_generators_by_ownership where every ownership record for a jointly owned generator reported the plant operator's utility_id_pudl and utility_name_eia instead of the owner's. When ownership slices are generated, the owner's PUDL utility ID and EIA utility name are now swapped in alongside the owner's utility_id_eia. See issue #5430 and PR #5506. Fixed set_gcs_temporary_hold only protecting the top level of a versioned release path from deletion. It shelled out to gcloud storage objects update gs://bucket/prefix/*, and that glob only matches one path segment, so anything nested in a subdirectory was silently left unheld. Updated the function to use the google-cloud-storage API to recursively hold every object under the prefix and verify after the fact that none were missed. Manually re-applied the hold to 4,000+ previously published versioned release objects that had been missed by the original bug. See PR #5477. Fixed EIA-176 extraction bug where raw_eia176__operation_types_and_sector_items was always empty due to a mismatched page key. See #4697 and #5412. Recovered dbt data validation tests that were being silently dropped from several tables as their source schema.human.yml files still used the deprecated tests: key instead of data_tests:, meaning dbt_helper silently discarded the tests they contained instead of merging them into the generated schema.yml. See PR #5458. Fixed several sources of non-deterministic row counts, where identical code and data produced different results on different machines (e.g. local macOS vs. nightly Linux builds) because several functions resolved ties among candidate values using incidental pandas/numpy sort or dedup behavior instead of an explicit, deterministic rule. Affected tables now use the standard, exact check_row_counts_per_partition dbt test in place of the looser row-count range checks previously used to work around the instability. See #4574, #4254, and #5503. Fixed add_null_o
Fields of Study & Subjects
Atmospheric and Environmental Gas Dynamics
Water-Energy-Food Nexus Studies
Environmental Policies and Emissions
Publication details
- Journal / source
- Zenodo (CERN European Organization for Nuclear Research)
- Publication date
- 11 September 2026
- Language
- EN
- Document type
- Dataset