Generation Data
This page documents the generation and renewable energy data products available through the ERCOT API.
Wind Power Production
Report: NP4-732-CD
Method: get_wind_power_production()
Update Frequency: Hourly
Hourly-averaged wind generation actuals across ERCOT.
from datetime import date
from lib.iso.ercot import ERCOTClient, ERCOTConfig
config = ERCOTConfig.from_ini_file()
client = ERCOTClient(config)
# Get wind production for August 2025
wind_data = client.get_wind_power_production(
delivery_date_from=date(2025, 8, 1),
delivery_date_to=date(2025, 8, 31)
)
# Analyze peak production
import pandas as pd
df = pd.DataFrame(wind_data['data'])
print(f"Peak Wind: {df['generation'].max():,.0f} MW")
print(f"Average: {df['generation'].mean():,.0f} MW")
client.cleanup()
Data Fields:
deliveryDate- Date of generationhourEnding- Hour ending (1-24)generation- Wind generation in MW
Use Cases:
Renewable energy forecasting
Wind capacity factor analysis
Grid integration studies
Renewable portfolio standard (RPS) compliance
—
Solar Power Production
Report: NP4-737-CD
Method: get_solar_power_production()
Update Frequency: Hourly
Hourly-averaged solar generation actuals across ERCOT.
# Get solar production for August 2025
solar_data = client.get_solar_power_production(
delivery_date_from=date(2025, 8, 1),
delivery_date_to=date(2025, 8, 31)
)
# Find peak solar hours
df = pd.DataFrame(solar_data['data'])
peak_hours = df.nlargest(10, 'generation')
print("Top 10 Solar Hours:")
print(peak_hours[['deliveryDate', 'hourEnding', 'generation']])
Data Fields:
deliveryDate- Date of generationhourEnding- Hour ending (1-24)generation- Solar generation in MW
Use Cases:
Solar generation analysis
Capacity factor calculations
Peak solar hours identification
Renewable portfolio tracking
—
Fuel Mix
Report: NP6-785-ER
Method: get_fuel_mix()
Update Frequency: 5-minute intervals
Real-time generation by fuel type including Natural Gas, Coal, Nuclear, Wind, Solar, Hydro, and Other.
# Get fuel mix for a specific day
fuel_data = client.get_fuel_mix(
delivery_date_from=date(2025, 8, 15),
delivery_date_to=date(2025, 8, 15)
)
# Aggregate by fuel type
df = pd.DataFrame(fuel_data['data'])
by_fuel = df.groupby('fuelType').agg({
'generation': ['mean', 'min', 'max', 'sum']
}).round(0)
print("\nFuel Mix Summary:")
print(by_fuel)
# Calculate percentages
total_gen = df.groupby('fuelType')['generation'].sum()
pct = (total_gen / total_gen.sum() * 100).round(1)
print("\nGeneration Share:")
print(pct.sort_values(ascending=False))
Data Fields:
timestamp- 5-minute SCED timestampfuelType- Fuel category (Natural Gas, Coal, Nuclear, Wind, Solar, Hydro, Other)generation- Generation in MW
Fuel Types:
Natural Gas - Combined cycle and combustion turbine
Coal - Coal-fired generation
Nuclear - Nuclear generation
Wind - Wind generation
Solar - Solar PV and thermal
Hydro - Hydroelectric
Other - Biomass, waste, storage discharge, etc.
Use Cases:
Emissions analysis
Fuel diversity studies
Carbon intensity calculations
Energy mix trends
Environmental reporting
—
Unplanned Resource Outages
Report: NP3-233-CD
Method: get_unplanned_resource_outages()
Update Frequency: Real-time (every 5 minutes)
Real-time tracking of unplanned (forced) generation resource outages.
from datetime import datetime
# Get unplanned outages for a specific day
start_dt = datetime(2025, 8, 15, 0, 0, 0)
end_dt = datetime(2025, 8, 15, 23, 59, 59)
outages = client.get_unplanned_resource_outages(
sced_timestamp_from=start_dt,
sced_timestamp_to=end_dt
)
# Aggregate by fuel type
df = pd.DataFrame(outages['data'])
if not df.empty:
by_fuel = df.groupby('fuelType')['outageMW'].agg(['count', 'sum', 'mean'])
print("\nUnplanned Outages by Fuel Type:")
print(by_fuel)
print(f"\nTotal Outage MW: {df['outageMW'].sum():,.0f} MW")
else:
print("No unplanned outages during this period")
Data Fields:
scedTimestamp- SCED timestampresourceName- Resource identifierfuelType- Fuel categoryoutageMW- Outage capacity in MWoutageType- Type of outage (Forced, etc.)
Use Cases:
Reliability analysis
Generation fleet health monitoring
Risk assessment
Forced outage rate (FOR) calculations
Capacity planning
—
System Wide Actual Load vs Forecast
Report: NP6-346-CD
Method: get_system_wide_actual_load_vs_forecast()
Update Frequency: Hourly
Comparison of actual system load versus forecasted load for accuracy evaluation.
# Get load vs forecast for a week
load_forecast_data = client.get_system_wide_actual_load_vs_forecast(
delivery_date_from=date(2025, 8, 1),
delivery_date_to=date(2025, 8, 7)
)
# Calculate forecast accuracy
df = pd.DataFrame(load_forecast_data['data'])
df['error_MW'] = df['actualLoad'] - df['forecastLoad']
df['error_pct'] = abs(df['error_MW'] / df['actualLoad'] * 100)
print("\nForecast Accuracy Metrics:")
print(f"MAPE: {df['error_pct'].mean():.2f}%")
print(f"Max Error: {df['error_MW'].abs().max():,.0f} MW")
print(f"Mean Bias: {df['error_MW'].mean():,.0f} MW")
# Find largest forecast misses
worst = df.nlargest(5, 'error_pct')[['deliveryDate', 'hourEnding', 'actualLoad', 'forecastLoad', 'error_pct']]
print("\nLargest Forecast Errors:")
print(worst)
Data Fields:
deliveryDate- Date of loadhourEnding- Hour ending (1-24)actualLoad- Actual system load in MWforecastLoad- Forecasted load in MWdstFlag- Daylight saving time indicator
Use Cases:
Forecast accuracy evaluation
Load prediction model validation
Real-time vs forecast deviation analysis
Operational planning assessment
Forecasting model improvement
—
CLI Usage
All generation data products can be accessed via the command-line interface:
# Wind power production
python isodart.py ercot generation --gen-type wind --start 2025-08-01 --duration 30
# Solar power production
python isodart.py ercot generation --gen-type solar --start 2025-08-01 --duration 30
# Fuel mix (5-minute data)
python isodart.py ercot generation --gen-type fuel_mix --start 2025-08-15 --duration 1
# Unplanned outages
python isodart.py ercot generation --gen-type unplanned_outages --start 2025-08-15 --duration 1
—
Example Scripts
See examples/ercot_generation_analysis.py for a comprehensive example demonstrating:
Generation mix analysis
Renewable energy trends
Outage tracking
Scarcity pricing correlation
# Run all analyses
python examples/ercot_generation_analysis.py --date 2025-08-15
# Run specific analysis
python examples/ercot_generation_analysis.py --date 2025-08-15 --analysis renewables
python examples/ercot_generation_analysis.py --date 2025-08-15 --analysis mix