Existing Generators Settings¶
These parameters control how existing power plants are processed, clustered, and configured for the model.
Clustering Parameters¶
num_clusters¶
Type: Integer or nested dictionary Required: Yes Example: See below
Default number of clusters to create for each technology in each region. Can be specified globally or per region/technology.
Global (same for all regions/technologies):
num_clusters:
Conventional Steam Coal: 3
Nuclear: 1
Natural Gas Fired Combined Cycle: ~ # Does not cluster plants
Regional (different per region):
alt_num_clusters:
CA_N:
Conventional Steam Coal: 5
Natural Gas Fired Combined Cycle: 10
Onshore Wind Turbine: 3
CA_S:
Natural Gas Fired Combined Cycle: 8
How it works:
- K-means clustering, by default on heat rate and fixed O&M
- Each cluster represents a group of similar generators
- Reduces thousands of plants to manageable number of resources
- "None" (
~) skips clustering and returns individual generators
Practical guidance (ReEDS/IPM-scale regions)
- Small regions often work with
num_clusters: 1as a starting point - Use
alt_num_clustersto split very large or heterogeneous fleets (e.g., >3–4 GW of combustion turbines with a wide heat-rate IQR) - The generated thermal inputs include heat rate inter-quartile range and standard deviation columns. Check those to decide where an extra cluster is warranted.
alt_num_clusters¶
Type: Dictionary (region → technology → number) Required: No Example: See below
Overrides num_clusters for specific region/technology combinations.
num_clusters:
Nuclear: 2 # Default
alt_num_clusters:
CA_N:
Nuclear: 1 # Each nuclear plant is unique
Biomass: 2 # Only 2 biomass clusters needed
This allows fine-grained control without repeating all technologies in the main num_clusters parameter.
generator_cluster_columns¶
Type: List of strings
Required: No
Default: ["heat_rate_mmbtu_mwh", "fixed_o_m_mw"]
Example: See below
Columns (features) used for k-means clustering. By default, generators are clustered based on heat rate and fixed O&M costs.
Default behavior (uses heat rate and fixed O&M implicitly):
Custom features:
Use cases:
- Add
capacity_mwto keep large/small plants separate - Add
operating_yearto segregate old vs. new plants - Add
minimum_load_mwfor minimum load constraints - Use only
heat_rate_mmbtu_mwhfor thermal efficiency clustering
Available columns depend on your generation data schema. Common options:
heat_rate_mmbtu_mwh: Thermal efficiencycapacity_mw: Plant sizefixed_o_m_mw: Fixed O&M costsvariable_o_m_mwh: Variable O&M costsoperating_year: Plant age proxyminimum_load_mw: Minimum stable operation level
Clustering Quality
Clustering features should be normalized or on similar scales for best results. PowerGenome uses the scikit-learn StandardScaler() method to normalize features.
Technology Grouping¶
tech_groups¶
Type: Dictionary (group name → list of technologies) Required: No Example: See below
Combines multiple similar technologies into a single group before clustering. Useful for technologies that are functionally equivalent.
tech_groups:
Peaker:
- Natural Gas Fired Combustion Turbine
- Natural Gas Steam Turbine
Biomass:
- Biomass
- Municipal Solid Waste
- Landfill Gas
Benefits:
- Reduces cluster count for minor technology variations
- Groups functionally similar resources
- Simplifies output analysis
Matching: Technology names are matched case-insensitively with partial matching.
Attribute Modifiers¶
resource_attr_modifiers¶
Type: Dictionary (technology → list of modifier dictionaries) Required: No Example: See below
Apply custom formulas to modify generator attributes based on other data fields. Useful for age-based cost adjustments, regional scaling, or custom business logic.
resource_attr_modifiers:
conventional steam coal:
- attribute: fom_per_mwyr
formula:
op: add
rate: 126 # $/kW-yr per year of age
multiplier: age
Structure:
Each technology can have multiple modifiers. Each modifier requires:
attribute: Column name to modify (e.g.,fom_per_mwyr,heat_rate_mmbtu_mwh)formula: Dictionary with operation detailsop: Operation type (add,mul,sub,truediv, orreplace)rate: Numeric rate/coefficientmultiplier: Column name containing values to multiply by rate
Operations:
| Operation | Formula | Example |
|---|---|---|
add |
new = old + (rate × multiplier) |
Add age-based O&M |
mul |
new = old × (rate × multiplier) |
Scale by efficiency |
sub |
new = old - (rate × multiplier) |
Reduce value |
truediv |
new = old / (rate × multiplier) |
Divide value |
replace |
new = rate × multiplier |
Ignore old value |
Multiple attributes:
resource_attr_modifiers:
natural gas fired combined cycle:
- attribute: fom_per_mwyr
formula:
op: add
rate: 75
multiplier: age
- attribute: heat_rate_mmbtu_mwh
formula:
op: mul
rate: 1.002 # 0.2% degradation per year
multiplier: age
Multiple technologies:
resource_attr_modifiers:
conventional steam coal:
- attribute: fom_per_mwyr
formula:
op: add
rate: 126
multiplier: age
nuclear:
- attribute: fom_per_mwyr
formula:
op: add
rate: 200
multiplier: age
Technology matching: Case-insensitive substring matching (e.g., "coal" matches "Conventional Steam Coal").
Common attributes:
fom_per_mwyr: Fixed O&M cost ($/MW-yr)vom_per_mwh: Variable O&M cost ($/MWh)heat_rate_mmbtu_mwh: Heat rate (MMBtu/MWh)capex_mw: Capital cost ($/MW)minimum_load_mw: Minimum load (MW)ramp_rate_mw_per_min: Ramp rate (MW/min)
Common multipliers:
age: Plant age in yearscapacity_mw: Nameplate capacityoperating_year: Year plant started operation
Column Requirements
Both attribute and multiplier columns must exist in the generator dataframe. Missing columns raise KeyError.
Execution Order
Applied after clustering and cost loading, so you can reference calculated fields like age.
See Modify Generator Attributes How-To Guide for detailed examples and validation.
Data Table Configuration¶
generation_table¶
Type: String or dictionary Required: Yes Example: See below
Source of existing generator data. Can be a simple filename or advanced configuration with filters.
Simple:
Advanced:
generation_table:
table_name: generators.parquet
filters:
- - [operating_year, '<=', 2030]
- [retirement_year, '>', 2030]
columns: [plant_id, technology, capacity_mw, heat_rate, region]
See Data Tables for full filter syntax.
plant_region_table¶
Type: String or dictionary
Required: No
Example: "plant_regions.csv"
Mapping of plants to base regions.
Expected columns:
plant_id: Plant identifierregion: Region name (matchingmodel_regions)
Example Configuration¶
Complete existing generator settings for a regional model:
# Clustering
num_clusters:
Conventional Steam Coal: 3
Nuclear: 2
Hydroelectric Pumped Storage: 2
Peaker: 1
alt_num_clusters:
CA_N:
Nuclear: 1
Hydroelectric Pumped Storage: 1
CA_S:
Nuclear: 1
# Technology grouping
tech_groups:
Peaker:
- Natural Gas Fired Combustion Turbine
- Natural Gas Steam Turbine
# Data source
generation_table:
table_name: generators.parquet
filters:
- - [operating_year, '<=', 2030]
Related Settings¶
- Model Definition: Planning years affect retirement calculations
- Regions:
model_regionsused in clustering - Resource Tags: Tag assignment for clustered generators
- Data Tables: Table configuration details