Spp

Contents

Spp#

Module Contents#

Classes Summary#

SPP

Southwest Power Pool (SPP)

Functions#

add_interval(→ pandas.DataFrame)

Adds Interval Start and Interval End columns to df

process_gen_mix(→ pandas.DataFrame)

Parse SPP generation mix data from

Attributes Summary#

Contents#

gridstatus.spp.add_interval(df: pandas.DataFrame, interval_min: int) pandas.DataFrame[source]#

Adds Interval Start and Interval End columns to df

gridstatus.spp.BASE_LOAD_FORECAST_MID_TERM_URL = 'https://portal.spp.org/file-browser-api/download/mtlf-vs-actual?path='[source]#
gridstatus.spp.BASE_LOAD_FORECAST_SHORT_TERM_URL = 'https://portal.spp.org/file-browser-api/download/stlf-vs-actual?path='[source]#
gridstatus.spp.BASE_SOLAR_AND_WIND_MID_TERM_URL = 'https://portal.spp.org/file-browser-api/download/midterm-resource-forecast?path='[source]#
gridstatus.spp.BASE_SOLAR_AND_WIND_SHORT_TERM_URL = 'https://portal.spp.org/file-browser-api/download/shortterm-resource-forecast?path='[source]#
gridstatus.spp.DA_BINDING_CONSTRAINTS = 'da-binding-constraints'[source]#
gridstatus.spp.FILE_BROWSER_API_URL = 'https://portal.spp.org/file-browser-api/'[source]#
gridstatus.spp.FILE_BROWSER_DOWNLOAD_URL = 'https://portal.spp.org/file-browser-api/download'[source]#
gridstatus.spp.FS_DAM_LMP_BY_LOCATION = 'da-lmp-by-location'[source]#
gridstatus.spp.FS_RTBM_LMP_BY_LOCATION = 'rtbm-lmp-by-location'[source]#
gridstatus.spp.LAST_UPDATED_KEYWORDS = ['last updated', 'as of'][source]#
gridstatus.spp.LMP_BY_SETTLEMENT_LOCATION_WEIS = 'lmp-by-settlement-location-weis'[source]#
gridstatus.spp.LMP_HUBS_AND_INTERFACES[source]#
gridstatus.spp.LOCATION_TYPE_ALL = 'ALL'[source]#
gridstatus.spp.LOCATION_TYPE_BUS = 'Bus'[source]#
gridstatus.spp.LOCATION_TYPE_HUB = 'Hub'[source]#
gridstatus.spp.LOCATION_TYPE_INTERFACE = 'Interface'[source]#
gridstatus.spp.LOCATION_TYPE_SETTLEMENT_LOCATION = 'Settlement Location'[source]#
gridstatus.spp.MARKETPLACE_BASE_URL = 'https://portal.spp.org'[source]#
gridstatus.spp.OPERATING_RESERVES = 'operating-reserves'[source]#
gridstatus.spp.process_gen_mix(df: pandas.DataFrame, detailed: bool = False) pandas.DataFrame[source]#

Parse SPP generation mix data from https://marketplace.spp.org/pages/generation-mix-historical

Parameters:
  • df (pd.DataFrame) – raw data

  • detailed (bool) – whether to combine market and self columns

Returns:

processed data

Return type:

pd.DataFrame

gridstatus.spp.QUERY_RTM5_HUBS_URL = 'https://pricecontourmap.spp.org/arcgis/rest/services/MarketMaps/RTBM_FeatureData/MapServer/1/query'[source]#
gridstatus.spp.QUERY_RTM5_INTERFACES_URL = 'https://pricecontourmap.spp.org/arcgis/rest/services/MarketMaps/RTBM_FeatureData/MapServer/2/query'[source]#
gridstatus.spp.RELIABILITY_LEVELS = ['Normal Operations', 'Weather Advisory', 'Resource Advisory', 'Conservative Operations...[source]#
gridstatus.spp.RELIABILITY_LEVELS_ALIASES[source]#
gridstatus.spp.RTBM_BINDING_CONSTRAINTS = 'rtbm-binding-constraints'[source]#
gridstatus.spp.RTBM_LMP_BY_BUS = 'rtbm-lmp-by-bus'[source]#
gridstatus.spp.RTBM_MCP = 'rtbm-mcp'[source]#
class gridstatus.spp.SPP[source]#

Bases: gridstatus.base.ISOBase

Southwest Power Pool (SPP)

Attributes

default_timezone

‘US/Central’

interconnection_homepage

https://www.spp.org/engineering/generator-interconnection/

iso_id

‘spp’

location_types

None

markets

None

name

‘Southwest Power Pool’

status_homepage

https://www.spp.org/markets-operations/current-grid-conditions/

Methods

get_as_prices_real_time_5_min(→ pandas.DataFrame)

Provides Marginal Clearing Price information by Reserve Zone for each

get_binding_constraints_day_ahead_hourly(...)

Get Day-Ahead Binding Constraints

get_binding_constraints_real_time_5_min(→ pandas.DataFrame)

Get Real-Time Binding Constraints

get_capacity_of_generation_on_outage(→ pandas.DataFrame)

Get Capacity of Generation on Outage.

get_capacity_of_generation_on_outage_annual(...)

Get VER Curtailments for a year. Starting 2014.

get_day_ahead_operating_reserve_prices(→ pandas.DataFrame)

Provides Marginal Clearing Price information by Reserve Zone for each

get_fuel_mix(→ pandas.DataFrame)

Get fuel mix

get_hourly_load(→ pandas.DataFrame)

Get Hourly Load

get_hourly_load_annual(→ pandas.DataFrame)

Get Hourly Load for a year. Starting 2011.

get_interconnection_queue(→ pandas.DataFrame)

Get interconnection queue

get_lmp_day_ahead_hourly(→ pandas.DataFrame)

Get day ahead hourly LMP data

get_lmp_real_time_5_min_by_bus(→ pandas.DataFrame)

Get LMP data by bus for the Real-Time 5 Minute Market

get_lmp_real_time_5_min_by_location(→ pandas.DataFrame)

Get LMP data by location for the Real-Time 5 Minute Market

get_lmp_real_time_weis(→ pandas.DataFrame)

Get LMP data for real time WEIS

get_load(→ pandas.DataFrame)

Returns load for last 24hrs in 5 minute intervals

get_load_forecast(→ pandas.DataFrame)

Returns load forecast for next 7 days in hourly intervals

get_load_forecast_mid_term(→ pandas.DataFrame | None)

Returns load forecast for +7 days in hourly intervals. Includes actual load

get_load_forecast_short_term(→ pandas.DataFrame | None)

5-minute load forecast data for the SPP footprint (system-wide) for +/- 10

get_market_clearing_day_ahead(→ pandas.DataFrame)

Get Market Clearing Day Ahead

get_market_clearing_real_time(→ pandas.DataFrame)

Get Market Clearing Real Time

get_operating_reserves(→ pandas.DataFrame)

get_raw_interconnection_queue(→ BinaryIO)

get_solar_and_wind_forecast_mid_term(...)

Returns solar and wind generation forecast for +7 days in hourly intervals.

get_solar_and_wind_forecast_short_term(...)

Returns solar and wind generation forecast for +4 hours in 5 minute intervals.

get_ver_curtailments(→ pandas.DataFrame)

Get VER Curtailments

get_ver_curtailments_annual(→ pandas.DataFrame)

Get VER Curtailments for a year. Starting 2014.

now()

get_as_prices_real_time_5_min(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False, use_daily_files: bool = False) pandas.DataFrame[source]#

Provides Marginal Clearing Price information by Reserve Zone for each Real-Time 5-minute Market solution.

Parameters:
  • date – date to get data for. Supports “latest” for most recent interval.

  • end – end date

  • verbose – print url

  • use_daily_files – if True, use daily files instead of 5 minute files.

Returns:

Real-Time 5-minute Marginal Clearing Prices

Return type:

pd.DataFrame

get_binding_constraints_day_ahead_hourly(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get Day-Ahead Binding Constraints

Parameters:
  • date – date to get data for. Supports “latest” for most recently available data.

  • end – end date

  • verbose – print url

Returns:

Day-Ahead Binding Constraints

Return type:

pd.DataFrame

get_binding_constraints_real_time_5_min(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get Real-Time Binding Constraints

Parameters:
  • date – date to get data for. Supports “latest” for most recent interval.

  • end – end date

  • verbose – print url

Returns:

Real-Time Binding Constraints

Return type:

pd.DataFrame

get_capacity_of_generation_on_outage(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get Capacity of Generation on Outage.

Published daily at 8am CT for next 7 days

Parameters:
  • date – start date

  • end – end date

get_capacity_of_generation_on_outage_annual(year: int, verbose: bool = True) pandas.DataFrame[source]#

Get VER Curtailments for a year. Starting 2014. Recent data use get_capacity_of_generation_on_outage

Parameters:
  • year – year to get data for

  • verbose – print url

Returns:

VER Curtailments

Return type:

pd.DataFrame

get_day_ahead_operating_reserve_prices(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Provides Marginal Clearing Price information by Reserve Zone for each Day-Ahead Market solution for each Operating Day. Posting is updated each day after the DA Market results are posted. Available at https://portal.spp.org/pages/da-mcp#

Parameters:
  • date – date to get data for

  • end – end date

  • verbose – print url

Returns:

Day Ahead Marginal Clearing Prices

Return type:

pd.DataFrame

get_fuel_mix(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], detailed: bool = False, verbose: bool = False) pandas.DataFrame[source]#

Get fuel mix

Parameters:
  • date – supports today and latest

  • detailed – if True, breaks out self scheduled and market scheduled

Note

if today, returns last 2 hours of data. maybe include previous day

Returns:

fuel mix

Return type:

pd.DataFrame

get_hourly_load(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get Hourly Load

Supports recent data. For historical annual data use get_hourly_load_annual

Parameters:
  • date – start date

  • end – end date

Returns:

Hourly Load

Return type:

pd.DataFrame

get_hourly_load_annual(year: int, verbose: bool = True) pandas.DataFrame[source]#

Get Hourly Load for a year. Starting 2011. For recent data use get_hourly_load

Parameters:
  • year – year to get data for

  • verbose – print url

Returns:

Hourly Load

Return type:

pd.DataFrame

get_interconnection_queue(verbose: bool = False) pandas.DataFrame[source]#

Get interconnection queue

Returns:

Interconnection queue

Return type:

pandas.DataFrame

get_lmp_day_ahead_hourly(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, location_type: str = LOCATION_TYPE_ALL, verbose: bool = False) pandas.DataFrame[source]#

Get day ahead hourly LMP data

Supported Location Types:
  • Hub

  • Interface

  • ALL

get_lmp_real_time_5_min_by_bus(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get LMP data by bus for the Real-Time 5 Minute Market

Parameters:
  • date – date to get data for

  • end – end date

  • verbose – print url

NOTE: does not take a location_type argument because it always returns LOCATION_TYPE_BUS.

get_lmp_real_time_5_min_by_location(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, location_type: str = LOCATION_TYPE_ALL, verbose: bool = False, use_daily_files: bool = False) pandas.DataFrame[source]#

Get LMP data by location for the Real-Time 5 Minute Market

Parameters:
  • date – date to get data for

  • end – end date

  • location_type – location type to get data for. Options are: - ALL (LOCATION_TYPE_ALL) - Hub (LOCATION_TYPE_HUB) - Interface (LOCATION_TYPE_INTERFACE) - Settlement Location (LOCATION_TYPE_SETTLEMENT_LOCATION)

  • verbose – print url

  • use_daily_files – if True, use daily files instead of 5 minute files.

get_lmp_real_time_weis(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get LMP data for real time WEIS

Parameters:
  • date – date to get data for. if end is not provided, will get data for 5 minute interval that date is in.

  • end – end date

  • verbose – print url

get_load(date: str | pandas.Timestamp, verbose: bool = False) pandas.DataFrame[source]#

Returns load for last 24hrs in 5 minute intervals

get_load_forecast(date: str | pandas.Timestamp, forecast_type: str = 'MID_TERM', verbose: bool = False) pandas.DataFrame[source]#

Returns load forecast for next 7 days in hourly intervals

Parameters:

forecast_type (str) – MID_TERM is hourly for next 7 days or SHORT_TERM is every five minutes for a few hours

Returns:

forecast for current day

Return type:

pd.DataFrame

get_load_forecast_mid_term(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame | None[source]#

Returns load forecast for +7 days in hourly intervals. Includes actual load for the past 24 hours. Data from https://portal.spp.org/pages/mtlf-vs-actual

Parameters:
  • date (pd.Timestamp|str) – date to get data for. Supports “latest” and “today”

  • verbose (bool) – print info

Returns:

forecast as dataframe.

Return type:

pd.DataFrame

get_load_forecast_short_term(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False, drop_null_forecast_rows: bool = True) pandas.DataFrame | None[source]#

5-minute load forecast data for the SPP footprint (system-wide) for +/- 10 minutes. Also includes actual load.

Data from https://portal.spp.org/pages/stlf-vs-actual

Parameters:
  • date (pd.Timestamp|str) – date to get data for. Supports “latest” and “today”

  • verbose (bool) – print info

  • end (pd.Timestamp|str) – end date

  • drop_null_forecast_rows (bool) – if True, drop rows with null forecast values

Returns:

forecast as dataframe.

Return type:

pd.DataFrame

get_market_clearing_day_ahead(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get Market Clearing Day Ahead

Parameters:
  • date – start date

  • end – end date

Returns:

Market Clearing Day Ahead

Return type:

pd.DataFrame

get_market_clearing_real_time(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get Market Clearing Real Time

Parameters:
  • date – start date

  • end – end date

Returns:

Market Clearing Real Time

Return type:

pd.DataFrame

get_operating_reserves(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#
get_raw_interconnection_queue(verbose: bool = False) BinaryIO[source]#
get_solar_and_wind_forecast_mid_term(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame | None[source]#

Returns solar and wind generation forecast for +7 days in hourly intervals.

Data from https://portal.spp.org/pages/midterm-resource-forecast.

Parameters:
  • date (pd.Timestamp|str) – date to get data for. Supports “latest” and “today”

  • verbose (bool) – print info

Returns:

forecast as dataframe.

Return type:

pd.DataFrame

get_solar_and_wind_forecast_short_term(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame | None[source]#

Returns solar and wind generation forecast for +4 hours in 5 minute intervals. Include actuals for past day in 5 minute intervals.

Data from https://portal.spp.org/pages/shortterm-resource-forecast

Parameters:
  • date (pd.Timestamp|str) – date to get data for. Supports “latest” and “today”

  • verbose (bool) – print info

Returns:

forecast as dataframe.

Return type:

pd.DataFrame

get_ver_curtailments(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) pandas.DataFrame[source]#

Get VER Curtailments

Supports recent data. For historical annual data use get_ver_curtailments_annual

Parameters:
  • date – start date

  • end – end date

get_ver_curtailments_annual(year: int, verbose: bool = True) pandas.DataFrame[source]#

Get VER Curtailments for a year. Starting 2014. Recent data use get_ver_curtailments

Parameters:
  • year – year to get data for

  • verbose – print url

Returns:

VER Curtailments

Return type:

pd.DataFrame

static now()[source]#
gridstatus.spp.STATUS_STOP_WORDS = ['as', 'at', 'ct', 'eea', 'of', 'on'][source]#