Skip to content

Add 2024 ATB Update Pipeline - #14

Open
Yunzhi-Chen wants to merge 86 commits into
mainfrom
yc/24ATB
Open

Yunzhi-Chen wants to merge 86 commits into
mainfrom
yc/24ATB

Conversation

@Yunzhi-Chen

@Yunzhi-Chen Yunzhi-Chen commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds a workflow that converts corrected ATB 2024 data into ReEDS-compatible inputs. It downloads, formats, plots, and validates ATB data, fills historical years from an explicitly configured source, optionally smooths future years, and produces before/after plots for review.

Structure

atb/
├── config.yaml            # all user choices; validated by config.schema.json
├── scripts/               # pipeline (13 modules)
├── historical/            # prepared history, committed — atb.csv, real.csv, manual.csv
├── manual_input/          # projection-year config (CSP ratios, offshore multipliers, coal overrides)
├── scraped_input/         # raw download cache (git-ignored)
├── output/                # generated ReEDS inputs (git-ignored)
└── comparison/            # validation and before/after plots (git-ignored)

How to run

cd atb
python scripts/future_atb_scraper.py     # cache the ATB flat file and workbook
python scripts/run_pipeline.py           # format, plot, compare

run_pipeline.py runs offline against the committed history and never rewrites it. Use --only format to generate CSVs without plots.

To rebuild history from original sources:

python scripts/historical_data_scraper.py    # --no-download to rebuild from cache

Verification

With smoothing disabled and all metrics set to manual, the workflow reproduces the inputs ReEDS uses today. Of 32 files: 21 exact, 8 differing only by floating-point noise (≤1e-9 relative), 3 offshore files differing by up to 0.018% in the CF multiplier, consistent with a different ATB 2024 release than the pinned v3.0.0.

Sanity-check plots — smoothing off, manual history, vs current ReEDS:

sanity_check_2024.zip

New ATB 2024 plots for future years:

ATB2024-CAPEX ATB2024-Fixed O M ATB2024-Variable O M

New ATB 2024 plots and the components:

gas_ATB_2024 nuclear-smr_ATB_2024 nuclear_ATB_2024 ofs-wind_ATB_2024 ons-wind_ATB_2024 upv_ATB_2024 battery_ATB_2024 biopower_ATB_2024 coal-ccs_ATB_2024 coal_ATB_2024 csp_ATB_2024 fuelcell_ATB_2024 gas-ccs_ATB_2024

New ATB 2024 vs current ReEDS 2024:

sanity_check_2024.zip

Scope and open questions

  • Geothermal is not generated;

LLM usage

LLM tools assisted with implementation, documentation, debugging, and validation. Outputs were reviewed and tested against the current ReEDS inputs.

kennedy-mindermann and others added 30 commits April 30, 2026 17:13
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…ession/README.md

Co-authored-by: Wesley Cole <49044852+wesleyjcole@users.noreply.github.com>
Update AEO preprocessing to pull from AEO2026
This reverts commit c43c67f.
Add natural gas price regression pipeline
Remove highprice and lowprice since AEO 2026 does not have the two scenarios
Update natural gas regression parameters with AEO 2026 data
Fix formatting issues in README.md
@Yunzhi-Chen
Yunzhi-Chen requested a review from bsergi September 2, 2026 22:04

@bsergi bsergi left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Yunzhi for all the hard work on this.

Based on the outputs it seems to work, but my biggest concern is that it is very complex and would be difficult for anyone else to use. A few suggestions:

  • Put non-user facing helper scripts in a sub-folder (or if they are few enough, move the user-facing ones up to the root director)
  • Simplify some of the input files with lots of columns or text
  • Organize the root directory folders (e.g., have one inputs folder with subfolders for historical data or other categories).
  • Add more comments to the code to explain what is going on, including function docstrings
  • Try to reduce the length of the code
  • Consider break up config file into more manageable chunks, with instructions about what settings need to be re-evaluated with a new run.

@@ -0,0 +1,34 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this file indented like this? It seems like all the lines could be moved 2 tabs to the left.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment for the other json files in this folder.

Comment thread atb/README.md
Comment on lines +43 to +44
index; used for wind-ons and upv FOM, whose surveys report a partial-scope
level but a usable trend.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The phrase "whose surveys report a partial-scope level but a usable trend" doesn't make sense to me.

Comment thread atb/README.md Outdated
investment before its own `firstyear`, so the value only needs to be far
above any real cost (ReEDS's own files use 9999, which is below Vogtle).
- `atb`, `manual`, `broadcast`: archived ATB estimates, the ReEDS ATB 2024
baseline, or the first projection value held flat.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By baseline do you mean moderate? And I think it would be better call the broadcast option "backfill".

Comment thread atb/README.md Outdated
`indexed` for O&M), hold the first ATB projection value flat otherwise
(`broadcast`), and write the ReEDS placeholder before a technology's first
buildable year (`unavailable`). Archived ATB estimates (`atb`) and the ReEDS
ATB 2024 baseline (`manual`) remain selectable per metric in `config.yaml`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

baseline or moderate? and should it be stuck to 2024 or alter with the ATB being processed? I'm not sure about calling this 'manual' either as that doesn't help understand what is being done.

Comment thread atb/README.md

The default projection start follows `atb.year - 2`; individual series retain
their actual start year. Financial cases can be changed in config without
editing `settings.yaml`. To match `yc/25ATB`, use:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should the README be hardcoded with a reference to a branch?

Comment thread atb/config.yaml
@@ -0,0 +1,468 @@
# yaml-language-server: $schema=./config.schema.json

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be good to have the config be focused on fields the user is expected to update, with other files provided entries that aren't expected to change. I can't quite tell what in here falls in that category but given how long it is I worry that users won't know what needs to be updated.

Comment thread atb/config.yaml
unit: USD/kW
capacity_basis: AC
statistic: project
geography: United States

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is this needed?

avail_params = atb_data.loc[(atb_data.Technology == tech)
& (atb_data.Scenario.isin(scenarios)), "Parameter"
].unique()
if args.debug:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this still relevant or a holdover from earlier code?

Comment thread atb/scripts/generate_atb_files.py Outdated

return output.sort_index()

def add_beccs_techs(tech, settings, df, techcol='i'):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'll probably need to debug this one when testing ATB 2025 for BECCS

keys = keys if isinstance(keys, tuple) else (keys,)
labels = dict(zip(['Scenario', *ids], keys))
boundary = settings['atb_series_start'][tech].get(keys, smoothing['projection_start_year'])
series = labels.get(identity, '*') if tech != 'wind-ons' else '*'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's going on here? Why is this specific to wind-ons ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants