Update 2025 Interconnection Queue - #15
Yunzhi-Chen wants to merge 84 commits into
Conversation
Update Links
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…l/ReEDS_Input_Processing into yc/natural_gas_update
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…config.json" This reverts commit 92f0e8b.
…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.
…om AEO directly" This reverts commit 0e86670.
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
2026 State RPS / CES /Hydrofrac Update
dfcb62f to
81ccd24
Compare
Remove 'atb/' from .gitignore and update comments.
…Model/ReEDS_Input_Processing into yc/interconnectionqueue25
# Conflicts: # interconnection_queues/README.md # interconnection_queues/outputs/figures/compare_queue_versions.html # interconnection_queues/outputs/interconnection_queues.csv # interconnection_queues/process_interconnection_queues.py
Condense the multi-line explanatory blocks to one or two lines each, keeping the non-obvious reasoning (FIPS-vs-name matching, the aggregated resource-type supplement) and dropping the worked examples. Also replaces the online-year comment that still named the hardcoded 2027/2030 years with one that refers to t_1/t_2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The rule belongs to the 2024 bug-fix work, not the 2025 queue update, and it left three unrelated lines in this PR's diff. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The committed figures plotted the 2025 queue against the pre-bugfix 2024 outputs. Now that PR #16's FIPS-matching and t_2 double-count fixes are merged, re-running the script rebuilds the cap_1 series from the corrected interconnection_queues_2024.csv (e.g. 2030 pv 975.4 -> 948.6 GW, battery 630.0 -> 620.4 GW). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Drop the hybrid/co-located matching explanation, which duplicates the add_detailed_types docstring, and point at that docstring instead. Also removes the per-vintage unmatched-record count, which goes stale with the next supplement, and folds the two resource-type lists into one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Address An's comment 3857462136 with a direct valid-FIPS filter. Retain and document the county-name fallback needed to preserve 110 MW of solar reported under a retired FIPS code.
atpham88
left a comment
There was a problem hiding this comment.
Thanks very much Yunzhi. I just have a few comments.
Can you also add the outputs and figures subfolders of this folder (interconnection_queues) to .gigignore? We want to keep them locally only.
| filename = 'LBNL_Ix_Queue_Data_File_thru2025.xlsx' | ||
| # LBNL supplement with the detailed types behind "Other"/"Other Storage" | ||
| filename_other = 'queues_other_forNLR_2025.xlsx' | ||
| version = 2026 # release year |
There was a problem hiding this comment.
This is not on you since it was always there but can we just change version to whatever version the data is, in this case 2025. It's confusing to have both version and year release, which sometimes we also call version :' and later you keep having to subtract 1 to get to the version in the file name.
| type_no = 3 | ||
| queue_data = pd.read_excel(os.path.join(dir,'inputs',filename), sheet_name='03. Complete Queue Data') | ||
| # The first row is empty, so remove it | ||
| queue_data.columns = queue_data.iloc[0] |
There was a problem hiding this comment.
Not on you again but can we add a check to make sure the first row is really empty before doing this?
| return queue_data | ||
|
|
||
| # Number of technology type (as specified in the queue data file) | ||
| type_no = 3 |
There was a problem hiding this comment.
since we add a function, can we add the main() function here for all the script below?
|
|
||
| # Resource types LBNL folded into aggregated categories from the 2025 vintage on, mapped to the | ||
| # category each was folded into. Only types with a matching ReEDS tech group are listed. | ||
| folded2aggregated = { |
There was a problem hiding this comment.
move this to main() function below the add_detailed_types() function. Can we make the text a little easier to understand? For example: the LBNL queue data aggregates biofuel and biomass technologies into technology type 'Other' and pumped storage is include in 'Other Storage'. Here we map these technologies to their aggregated categories for later processing.
| 'biomass': 'Other', | ||
| } | ||
|
|
||
| def add_detailed_types(queue_data, filename_other, type_cols): |
There was a problem hiding this comment.
Can we just pd.merge queue_data (with only the active rows) with other data by q_id (or q_id + entity, or whichever combination that makes unique identifier in queue_data) then overwrite the type_1,2,3 in queue_data with those in other data?
I'm assuming the rows that are in other data but not in queue_data are not considered in the queue right?
| queue_data, filename_other, ['type_'+str(item+1) for item in range(type_no)]) | ||
|
|
||
| # County-to-FIPS mapping from the ReEDS repo | ||
| county_state = pd.read_csv(os.path.join(reeds_path,'inputs','zones','county_state.csv')) |
There was a problem hiding this comment.
We can remove this since queue_data already has column fips_code. We just need to put in to ReEDS format: queue_data['fips_code'] = 'p' + queue_data['fips_code'].astype(str).str.zfill(5)
| county_state['FIPS'] = 'p' + county_state['FIPS'].astype(str).str.zfill(5) | ||
|
|
||
| # Assuming zero queue for csp | ||
| csp_queue = pd.read_csv(os.path.join(dir,'inputs','csp_queues.csv')) |
There was a problem hiding this comment.
Not on you again. this is bad coding earlier on my part so flagging this so I can fix in the next PR where I will convert the altair plot to matplotlib.
| @@ -12,14 +12,17 @@ This repo includes scripts and inputs to preprocess interconnection queues that | |||
|  | |||
There was a problem hiding this comment.
Can we delete this screenshot (it's outdated anyway) and replace it with a table? If cannot do in this PR, I'm flagging this to do in my figure update one next.
| active_queue_county_filtered = active_queue_county_filtered.merge(csp_queue, on=['r','tg'], how='outer').fillna(0) | ||
|
|
||
| ##################### SAVE OUTPUTS ###################### | ||
| active_queue_county_filtered.to_csv(os.path.join(dir,'outputs','interconnection_queues_'+str(version-1)+'.csv'),index=False) |
There was a problem hiding this comment.
Can remove this since it's the same as the one below. To plot the difference, we can just use the interconnection_queues.csv one to plot against version-1, or better yet just read the current interconnection_queues.csv from main ReEDs repo to compare.
(can leave this to my figure update PR).
Summary
Update interconnection queues to LBNL's 2025 data vintage, producing ReEDS capacity limits for 2027-2031.
Changes
Figures
2025 Interconnection Queue
2025 vs. 2024 Comparison
Related ReEDS Update
Paired PR: ReEDS-Model/ReEDS#216
LLM Usage
Claude Code assisted with the original update and supplemental matching. GitHub Copilot reviewed the diff, simplified current-vintage processing, automated comparison selection, and ran pipeline and equivalence checks.