What is Grid Status?#

gridstatus logo

Tests Code Coverage PyPI Version

gridstatus is a standardized Python API to electricity supply, demand, and pricing data for the major Independent System Operators (ISOs) in the United States.

Currently gridstatus supports CAISO, SPP, ISONE, MISO, Ercot, NYISO, and PJM.

We’d love to answer any usage or data access questions! Please let us know by posting a GitHub issue.

5 Minute Overview#

First, we can see all of the ISOs that are supported

import gridstatus
gridstatus.list_isos()
Name Id Class
0 Midcontinent ISO miso MISO
1 California ISO caiso CAISO
2 PJM pjm PJM
3 Electric Reliability Council of Texas ercot Ercot
4 Southwest Power Pool spp SPP
5 New York ISO nyiso NYISO
6 ISO New England isone ISONE
7 Independent Electricity System Operator ieso IESO

Next, we can select an ISO we want to use

caiso = gridstatus.CAISO()

Fuel Mix#

All ISOs have the same API to methods like get_fuel_mix, get_load, and get_status, etc. Here is how we can get the fuel mix

caiso.get_fuel_mix("today")
Time Interval Start Interval End Solar Wind Geothermal Biomass Biogas Small Hydro Coal Nuclear Natural Gas Large Hydro Batteries Imports Other
0 2024-12-06 00:00:00-08:00 2024-12-06 00:00:00-08:00 2024-12-06 00:05:00-08:00 -53 619 793 171 175 146 -1 2264 11928 1459 -747 5256 0
1 2024-12-06 00:05:00-08:00 2024-12-06 00:05:00-08:00 2024-12-06 00:10:00-08:00 -57 641 796 173 176 147 -1 2263 11924 1232 -486 5527 0
2 2024-12-06 00:10:00-08:00 2024-12-06 00:10:00-08:00 2024-12-06 00:15:00-08:00 -54 645 794 173 177 148 -1 2264 11897 1121 -393 5642 0
3 2024-12-06 00:15:00-08:00 2024-12-06 00:15:00-08:00 2024-12-06 00:20:00-08:00 -55 654 793 175 175 148 -1 2263 11859 1115 -422 5589 0
4 2024-12-06 00:20:00-08:00 2024-12-06 00:20:00-08:00 2024-12-06 00:25:00-08:00 -54 703 793 176 176 148 -1 2264 11761 1101 -386 5593 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
152 2024-12-06 12:40:00-08:00 2024-12-06 12:40:00-08:00 2024-12-06 12:45:00-08:00 13490 313 787 182 174 150 -1 2262 5499 349 -6061 2596 0
153 2024-12-06 12:45:00-08:00 2024-12-06 12:45:00-08:00 2024-12-06 12:50:00-08:00 13589 310 787 182 175 151 -1 2263 5513 348 -6070 2496 0
154 2024-12-06 12:50:00-08:00 2024-12-06 12:50:00-08:00 2024-12-06 12:55:00-08:00 13659 308 787 181 175 153 -1 2262 5508 343 -5942 2325 0
155 2024-12-06 12:55:00-08:00 2024-12-06 12:55:00-08:00 2024-12-06 13:00:00-08:00 13679 327 787 183 175 153 -1 2263 5485 345 -5905 2327 0
156 2024-12-06 13:00:00-08:00 2024-12-06 13:00:00-08:00 2024-12-06 13:05:00-08:00 13701 331 787 183 175 153 -1 2263 5470 348 -5920 2337 0

157 rows × 16 columns

Load#

or the energy demand throughout the current day as a Pandas DataFrame

caiso.get_load("today")
Time Interval Start Interval End Load
0 2024-12-06 00:00:00-08:00 2024-12-06 00:00:00-08:00 2024-12-06 00:05:00-08:00 22079.0
1 2024-12-06 00:05:00-08:00 2024-12-06 00:05:00-08:00 2024-12-06 00:10:00-08:00 22208.0
2 2024-12-06 00:10:00-08:00 2024-12-06 00:10:00-08:00 2024-12-06 00:15:00-08:00 22395.0
3 2024-12-06 00:15:00-08:00 2024-12-06 00:15:00-08:00 2024-12-06 00:20:00-08:00 22206.0
4 2024-12-06 00:20:00-08:00 2024-12-06 00:20:00-08:00 2024-12-06 00:25:00-08:00 22193.0
... ... ... ... ...
152 2024-12-06 12:40:00-08:00 2024-12-06 12:40:00-08:00 2024-12-06 12:45:00-08:00 19711.0
153 2024-12-06 12:45:00-08:00 2024-12-06 12:45:00-08:00 2024-12-06 12:50:00-08:00 19741.0
154 2024-12-06 12:50:00-08:00 2024-12-06 12:50:00-08:00 2024-12-06 12:55:00-08:00 19704.0
155 2024-12-06 12:55:00-08:00 2024-12-06 12:55:00-08:00 2024-12-06 13:00:00-08:00 19829.0
156 2024-12-06 13:00:00-08:00 2024-12-06 13:00:00-08:00 2024-12-06 13:05:00-08:00 19838.0

157 rows × 4 columns

Load Forecast#

Another dataset we can query is the load forecast

nyiso = gridstatus.NYISO()
nyiso.get_load_forecast("today")
/home/docs/checkouts/readthedocs.org/user_builds/isodata/checkouts/latest/gridstatus/nyiso.py:905: FutureWarning: Parsed string "12/05/24 07:30 EST" included an un-recognized timezone "EST". Dropping unrecognized timezones is deprecated; in a future version this will raise. Instead pass the string without the timezone, then use .tz_localize to convert to a recognized timezone.
  return pd.Timestamp(last_updated_date, tz=self.default_timezone)
Time Interval Start Interval End Forecast Time Load Forecast
0 2024-12-06 00:00:00-05:00 2024-12-06 00:00:00-05:00 2024-12-06 01:00:00-05:00 2024-12-05 07:30:00-05:00 15987
1 2024-12-06 01:00:00-05:00 2024-12-06 01:00:00-05:00 2024-12-06 02:00:00-05:00 2024-12-05 07:30:00-05:00 15516
2 2024-12-06 02:00:00-05:00 2024-12-06 02:00:00-05:00 2024-12-06 03:00:00-05:00 2024-12-05 07:30:00-05:00 15244
3 2024-12-06 03:00:00-05:00 2024-12-06 03:00:00-05:00 2024-12-06 04:00:00-05:00 2024-12-05 07:30:00-05:00 15180
4 2024-12-06 04:00:00-05:00 2024-12-06 04:00:00-05:00 2024-12-06 05:00:00-05:00 2024-12-05 07:30:00-05:00 15437
... ... ... ... ... ...
139 2024-12-11 19:00:00-05:00 2024-12-11 19:00:00-05:00 2024-12-11 20:00:00-05:00 2024-12-05 07:30:00-05:00 19194
140 2024-12-11 20:00:00-05:00 2024-12-11 20:00:00-05:00 2024-12-11 21:00:00-05:00 2024-12-05 07:30:00-05:00 18698
141 2024-12-11 21:00:00-05:00 2024-12-11 21:00:00-05:00 2024-12-11 22:00:00-05:00 2024-12-05 07:30:00-05:00 17978
142 2024-12-11 22:00:00-05:00 2024-12-11 22:00:00-05:00 2024-12-11 23:00:00-05:00 2024-12-05 07:30:00-05:00 16957
143 2024-12-11 23:00:00-05:00 2024-12-11 23:00:00-05:00 2024-12-12 00:00:00-05:00 2024-12-05 07:30:00-05:00 15991

144 rows × 5 columns

Historical Data#

When supported, you can use the historical method calls to get data for a specific day in the past. For example,

caiso.get_load("Jan 1, 2020")
Time Interval Start Interval End Load
0 2020-01-01 00:00:00-08:00 2020-01-01 00:00:00-08:00 2020-01-01 00:05:00-08:00 21533
1 2020-01-01 00:05:00-08:00 2020-01-01 00:05:00-08:00 2020-01-01 00:10:00-08:00 21429
2 2020-01-01 00:10:00-08:00 2020-01-01 00:10:00-08:00 2020-01-01 00:15:00-08:00 21320
3 2020-01-01 00:15:00-08:00 2020-01-01 00:15:00-08:00 2020-01-01 00:20:00-08:00 21272
4 2020-01-01 00:20:00-08:00 2020-01-01 00:20:00-08:00 2020-01-01 00:25:00-08:00 21193
... ... ... ... ...
283 2020-01-01 23:35:00-08:00 2020-01-01 23:35:00-08:00 2020-01-01 23:40:00-08:00 20494
284 2020-01-01 23:40:00-08:00 2020-01-01 23:40:00-08:00 2020-01-01 23:45:00-08:00 20383
285 2020-01-01 23:45:00-08:00 2020-01-01 23:45:00-08:00 2020-01-01 23:50:00-08:00 20297
286 2020-01-01 23:50:00-08:00 2020-01-01 23:50:00-08:00 2020-01-01 23:55:00-08:00 20242
287 2020-01-01 23:55:00-08:00 2020-01-01 23:55:00-08:00 2020-01-02 00:00:00-08:00 20128

288 rows × 4 columns

Frequently, we want to get data across multiple days. We can do that by providing a start and end parameter to any iso.get_* method

caiso_load = caiso.get_load(start="Jan 1, 2021", end="Feb 1, 2021")
caiso_load
Time Interval Start Interval End Load
0 2021-01-01 00:00:00-08:00 2021-01-01 00:00:00-08:00 2021-01-01 00:05:00-08:00 21937.0
1 2021-01-01 00:05:00-08:00 2021-01-01 00:05:00-08:00 2021-01-01 00:10:00-08:00 21858.0
2 2021-01-01 00:10:00-08:00 2021-01-01 00:10:00-08:00 2021-01-01 00:15:00-08:00 21827.0
3 2021-01-01 00:15:00-08:00 2021-01-01 00:15:00-08:00 2021-01-01 00:20:00-08:00 21757.0
4 2021-01-01 00:20:00-08:00 2021-01-01 00:20:00-08:00 2021-01-01 00:25:00-08:00 21664.0
... ... ... ... ...
8923 2021-01-31 23:35:00-08:00 2021-01-31 23:35:00-08:00 2021-01-31 23:40:00-08:00 20054.0
8924 2021-01-31 23:40:00-08:00 2021-01-31 23:40:00-08:00 2021-01-31 23:45:00-08:00 19952.0
8925 2021-01-31 23:45:00-08:00 2021-01-31 23:45:00-08:00 2021-01-31 23:50:00-08:00 19859.0
8926 2021-01-31 23:50:00-08:00 2021-01-31 23:50:00-08:00 2021-01-31 23:55:00-08:00 19763.0
8927 2021-01-31 23:55:00-08:00 2021-01-31 23:55:00-08:00 2021-02-01 00:00:00-08:00 19650.0

8928 rows × 4 columns

We can now see there is data for all of January 2021

import plotly.express as px

fig = px.line(caiso_load, x="Time", y="Load", title="CAISO Load - Jan '21")
fig