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")
2025-01-27 15:03:47 - INFO - Fetching URL: https://www.caiso.com/outlook/current/fuelsource.csv?_=1737990227
Time Interval Start Interval End Solar Wind Geothermal Biomass Biogas Small Hydro Coal Nuclear Natural Gas Large Hydro Batteries Imports Other
0 2025-01-27 00:00:00-08:00 2025-01-27 00:00:00-08:00 2025-01-27 00:05:00-08:00 -53 2021 812 247 142 181 -1 2268 10705 1469 -656 4224 0
1 2025-01-27 00:05:00-08:00 2025-01-27 00:05:00-08:00 2025-01-27 00:10:00-08:00 -52 1957 812 245 141 181 -1 2269 10657 1369 -430 4492 0
2 2025-01-27 00:10:00-08:00 2025-01-27 00:10:00-08:00 2025-01-27 00:15:00-08:00 -52 1930 811 243 142 180 -1 2269 10667 1251 -384 4648 0
3 2025-01-27 00:15:00-08:00 2025-01-27 00:15:00-08:00 2025-01-27 00:20:00-08:00 -53 1920 811 243 142 180 -1 2269 10703 1240 -301 4540 0
4 2025-01-27 00:20:00-08:00 2025-01-27 00:20:00-08:00 2025-01-27 00:25:00-08:00 -53 1949 811 244 142 180 -1 2268 10719 1239 -299 4506 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
80 2025-01-27 06:40:00-08:00 2025-01-27 06:40:00-08:00 2025-01-27 06:45:00-08:00 -51 1390 810 238 142 168 -1 2270 11937 1806 3352 3531 0
81 2025-01-27 06:45:00-08:00 2025-01-27 06:45:00-08:00 2025-01-27 06:50:00-08:00 -41 1427 810 237 142 167 -1 2271 11936 1795 3591 3441 0
82 2025-01-27 06:50:00-08:00 2025-01-27 06:50:00-08:00 2025-01-27 06:55:00-08:00 -11 1487 810 238 141 167 -1 2270 11938 1796 3599 3540 0
83 2025-01-27 06:55:00-08:00 2025-01-27 06:55:00-08:00 2025-01-27 07:00:00-08:00 43 1519 814 239 141 168 -1 2270 11942 1804 3565 3643 0
84 2025-01-27 07:00:00-08:00 2025-01-27 07:00:00-08:00 2025-01-27 07:05:00-08:00 142 1533 817 238 141 168 -1 2270 11943 1758 3433 3849 0

85 rows × 16 columns

Load#

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

caiso.get_load("today")
2025-01-27 15:03:47 - INFO - Fetching URL: https://www.caiso.com/outlook/current/demand.csv?_=1737990227
Time Interval Start Interval End Load
0 2025-01-27 00:00:00-08:00 2025-01-27 00:00:00-08:00 2025-01-27 00:05:00-08:00 21427.0
1 2025-01-27 00:05:00-08:00 2025-01-27 00:05:00-08:00 2025-01-27 00:10:00-08:00 21606.0
2 2025-01-27 00:10:00-08:00 2025-01-27 00:10:00-08:00 2025-01-27 00:15:00-08:00 21760.0
3 2025-01-27 00:15:00-08:00 2025-01-27 00:15:00-08:00 2025-01-27 00:20:00-08:00 21678.0
4 2025-01-27 00:20:00-08:00 2025-01-27 00:20:00-08:00 2025-01-27 00:25:00-08:00 21745.0
... ... ... ... ...
80 2025-01-27 06:40:00-08:00 2025-01-27 06:40:00-08:00 2025-01-27 06:45:00-08:00 25649.0
81 2025-01-27 06:45:00-08:00 2025-01-27 06:45:00-08:00 2025-01-27 06:50:00-08:00 25795.0
82 2025-01-27 06:50:00-08:00 2025-01-27 06:50:00-08:00 2025-01-27 06:55:00-08:00 25950.0
83 2025-01-27 06:55:00-08:00 2025-01-27 06:55:00-08:00 2025-01-27 07:00:00-08:00 26121.0
84 2025-01-27 07:00:00-08:00 2025-01-27 07:00:00-08:00 2025-01-27 07:05:00-08:00 26263.0

85 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/v0.29.1/gridstatus/nyiso.py:941: FutureWarning: Parsed string "01/26/25 07:55 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 2025-01-27 00:00:00-05:00 2025-01-27 00:00:00-05:00 2025-01-27 01:00:00-05:00 2025-01-26 07:55:00-05:00 16411
1 2025-01-27 01:00:00-05:00 2025-01-27 01:00:00-05:00 2025-01-27 02:00:00-05:00 2025-01-26 07:55:00-05:00 16071
2 2025-01-27 02:00:00-05:00 2025-01-27 02:00:00-05:00 2025-01-27 03:00:00-05:00 2025-01-26 07:55:00-05:00 15875
3 2025-01-27 03:00:00-05:00 2025-01-27 03:00:00-05:00 2025-01-27 04:00:00-05:00 2025-01-26 07:55:00-05:00 15842
4 2025-01-27 04:00:00-05:00 2025-01-27 04:00:00-05:00 2025-01-27 05:00:00-05:00 2025-01-26 07:55:00-05:00 16105
... ... ... ... ... ...
139 2025-02-01 19:00:00-05:00 2025-02-01 19:00:00-05:00 2025-02-01 20:00:00-05:00 2025-01-26 07:55:00-05:00 18692
140 2025-02-01 20:00:00-05:00 2025-02-01 20:00:00-05:00 2025-02-01 21:00:00-05:00 2025-01-26 07:55:00-05:00 18345
141 2025-02-01 21:00:00-05:00 2025-02-01 21:00:00-05:00 2025-02-01 22:00:00-05:00 2025-01-26 07:55:00-05:00 17857
142 2025-02-01 22:00:00-05:00 2025-02-01 22:00:00-05:00 2025-02-01 23:00:00-05:00 2025-01-26 07:55:00-05:00 17160
143 2025-02-01 23:00:00-05:00 2025-02-01 23:00:00-05:00 2025-02-02 00:00:00-05:00 2025-01-26 07:55:00-05:00 16529

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")
2025-01-27 15:03:48 - INFO - Fetching URL: https://www.caiso.com/outlook/history/20200101/demand.csv?_=1737990228
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

Next Steps#

The best part is these APIs work in the same way across all the supported ISOs!

Examples