Skip to content

Update 2025 Interconnection Queue - #15

Open
Yunzhi-Chen wants to merge 84 commits into
mainfrom
yc/interconnectionqueue25
Open

Yunzhi-Chen wants to merge 84 commits into
mainfrom
yc/interconnectionqueue25

Conversation

@Yunzhi-Chen

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

Copy link
Copy Markdown
Contributor

Summary

Update interconnection queues to LBNL's 2025 data vintage, producing ReEDS capacity limits for 2027-2031.

Changes

  • Add the public 2025 workbook and LBNL's supplemental resource-type workbook from the website.
  • Add pumped-storage and biofuel/biomass using the supplement from LBNL, since LBNL grouped pumped storage under "Other Storage" and biofuel/biomass under "Other" in the public file.

Figures

2025 Interconnection Queue

image

2025 vs. 2024 Comparison

image

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.

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 self-assigned this Aug 19, 2026
@Yunzhi-Chen
Yunzhi-Chen requested a review from atpham88 August 20, 2026 19:55
@Yunzhi-Chen
Yunzhi-Chen force-pushed the yc/interconnectionqueue25 branch from dfcb62f to 81ccd24 Compare August 24, 2026 17:32
Comment thread interconnection_queues/process_interconnection_queues.py Outdated
Comment thread interconnection_queues/process_interconnection_queues.py Outdated
Comment thread interconnection_queues/process_interconnection_queues.py Outdated
Yunzhi-Chen and others added 11 commits September 9, 2026 17:06
# 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 atpham88 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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 = {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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'))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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'))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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
![interconnection queue inputs](interconnection_queue_inputs.png)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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).

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