Load Data

ERCOT Load Products

ERCOT publishes several load-related data products covering system-wide and zonal loads.

Actual System Load

NP6-345-CD: Actual System Load by Weather Zone

5-minute actual load data by weather zone.

from lib.iso.ercot import ERCOTClient, ERCOTConfig
from datetime import date

config = ERCOTConfig.from_ini_file()
client = ERCOTClient(config)

# Get load data for January 2026
load_data = client.get_actual_system_load_by_weather_zone(
    operating_day_from=date(2026, 1, 1),
    operating_day_to=date(2026, 1, 31),
    dst_flag=False
)

# Save to CSV
client.save_report_to_csv(load_data, "system_load_jan2026.csv")
client.cleanup()

Weather Zones:

  • COAST - Coastal region

  • EAST - East Texas

  • FWEST - Far West Texas

  • NORTH - North Central Texas

  • NCENT - North Central

  • SOUTH - South Texas

  • SCENT - South Central

  • WEST - West Texas

NP6-346-CD: Actual System Load by Forecast Zone

Load data organized by forecast zones.

load_data = client.get_actual_system_load_by_forecast_zone(
    operating_day_from=date(2026, 1, 1),
    operating_day_to=date(2026, 1, 31)
)

Native Load (Historical)

Historical hourly load data by weather zone from ERCOT’s public archive.

# Get native load data
native_load = client.get_native_load(
    operating_day_from=date(2024, 10, 1),
    operating_day_to=date(2024, 10, 31)
)

Data Columns:

  • operatingDay - Date

  • hourEnding - Hour (01:00 to 24:00)

  • coast, east, farWest, north, northC, southern, southC, west - Zone loads (MW)

  • total - System-wide total (MW)

Note

Native load data is scraped from ERCOT’s public website archives, not the API. Data is cached locally after first download.

Load Resource Data

NP3-965-ER: Load Resource Data in SCED

60-day rolling window of load resource data in SCED.

from datetime import datetime

load_res_data = client.get_load_resource_data_in_sced(
    start=datetime(2026, 1, 1, 0, 0, 0),
    end=datetime(2026, 1, 31, 23, 59, 59)
)

NP3-966-ER: DAM Load Resource Data

60-day Day-Ahead Market load resource data.

dam_load_res = client.get_dam_load_resource_data(
    delivery_date_from=date(2026, 1, 1),
    delivery_date_to=date(2026, 1, 31)
)

Aggregated Load Data

NP3-910-ER: 2-Day Aggregated Load

DSR Loads:

dsr_loads = client.get_dsr_loads_2day_aggregated(
    start=datetime(2026, 1, 1, 0, 0, 0),
    end=datetime(2026, 1, 2, 23, 59, 59)
)

Load Summary (All Regions):

load_summary = client.get_load_summary_2day_aggregated(
    start=datetime(2026, 1, 1, 0, 0, 0),
    end=datetime(2026, 1, 2, 23, 59, 59)
)

Load Summary by Region:

# Available regions: HOUSTON, NORTH, SOUTH, WEST
houston_load = client.get_load_summary_2day_aggregated(
    start=datetime(2026, 1, 1, 0, 0, 0),
    end=datetime(2026, 1, 2, 23, 59, 59),
    region="HOUSTON"
)

Common Analysis Tasks

Calculate Peak Load

import pandas as pd

# Get load data
load_data = client.get_actual_system_load_by_weather_zone(
    operating_day_from=date(2026, 1, 1),
    operating_day_to=date(2026, 1, 31)
)

# Find peak
df = pd.DataFrame(load_data['data'])
peak_load = df['total'].max()
peak_row = df[df['total'] == peak_load].iloc[0]

print(f"Peak Load: {peak_load:.0f} MW")
print(f"Date: {peak_row['operatingDay']}")
print(f"Hour: {peak_row['hourEnding']}")

Daily Load Profile

# Calculate average hourly load
df['hour'] = pd.to_datetime(df['hourEnding'], format='%H:%M').dt.hour
hourly_avg = df.groupby('hour')['total'].mean()

# Plot
import matplotlib.pyplot as plt
hourly_avg.plot(kind='line', title='Average Daily Load Profile')
plt.xlabel('Hour of Day')
plt.ylabel('Load (MW)')
plt.show()

Compare Weather Zones

# Sum loads by zone
zones = ['coast', 'east', 'farWest', 'north', 'northC', 'southern', 'southC', 'west']
zone_totals = df[zones].sum()

# Calculate percentages
zone_pct = 100 * zone_totals / zone_totals.sum()

print("Load Distribution by Weather Zone:")
for zone, pct in zone_pct.items():
    print(f"{zone:10s}: {pct:5.1f}%")

Month-over-Month Growth

# Get two months of data
jan_data = client.get_actual_system_load_by_weather_zone(
    operating_day_from=date(2026, 1, 1),
    operating_day_to=date(2026, 1, 31)
)
dec_data = client.get_actual_system_load_by_weather_zone(
    operating_day_from=date(2025, 12, 1),
    operating_day_to=date(2025, 12, 31)
)

# Calculate averages
jan_avg = pd.DataFrame(jan_data['data'])['total'].mean()
dec_avg = pd.DataFrame(dec_data['data'])['total'].mean()

growth = 100 * (jan_avg - dec_avg) / dec_avg
print(f"Month-over-month load growth: {growth:+.1f}%")

See Also