Spp
========================

.. py:module:: gridstatus.spp


Module Contents
---------------

Classes Summary
~~~~~~~~~~~~~~~

.. autoapisummary::

   gridstatus.spp.SPP




Functions
~~~~~~~~~

.. autoapisummary::
   :nosignatures:

   gridstatus.spp.add_interval
   gridstatus.spp.process_gen_mix



Attributes Summary
~~~~~~~~~~~~~~~~~~~

.. autoapisummary::

   gridstatus.spp.BASE_LOAD_FORECAST_MID_TERM_URL
   gridstatus.spp.BASE_LOAD_FORECAST_SHORT_TERM_URL
   gridstatus.spp.BASE_SOLAR_AND_WIND_MID_TERM_URL
   gridstatus.spp.BASE_SOLAR_AND_WIND_SHORT_TERM_URL
   gridstatus.spp.DA_BINDING_CONSTRAINTS
   gridstatus.spp.FILE_BROWSER_API_URL
   gridstatus.spp.FILE_BROWSER_DOWNLOAD_URL
   gridstatus.spp.FS_DAM_LMP_BY_LOCATION
   gridstatus.spp.FS_RTBM_LMP_BY_LOCATION
   gridstatus.spp.LAST_UPDATED_KEYWORDS
   gridstatus.spp.LMP_BY_SETTLEMENT_LOCATION_WEIS
   gridstatus.spp.LMP_HUBS_AND_INTERFACES
   gridstatus.spp.LOCATION_TYPE_ALL
   gridstatus.spp.LOCATION_TYPE_BUS
   gridstatus.spp.LOCATION_TYPE_HUB
   gridstatus.spp.LOCATION_TYPE_INTERFACE
   gridstatus.spp.LOCATION_TYPE_SETTLEMENT_LOCATION
   gridstatus.spp.MARKETPLACE_BASE_URL
   gridstatus.spp.OPERATING_RESERVES
   gridstatus.spp.QUERY_RTM5_HUBS_URL
   gridstatus.spp.QUERY_RTM5_INTERFACES_URL
   gridstatus.spp.RELIABILITY_LEVELS
   gridstatus.spp.RELIABILITY_LEVELS_ALIASES
   gridstatus.spp.RTBM_BINDING_CONSTRAINTS
   gridstatus.spp.RTBM_LMP_BY_BUS
   gridstatus.spp.RTBM_MCP
   gridstatus.spp.STATUS_STOP_WORDS


Contents
~~~~~~~~~~~~~~~~~~~
.. py:function:: add_interval(df: pandas.DataFrame, interval_min: int) -> pandas.DataFrame

   Adds Interval Start and Interval End columns to df


.. py:data:: BASE_LOAD_FORECAST_MID_TERM_URL
   :value: 'https://portal.spp.org/file-browser-api/download/mtlf-vs-actual?path='


.. py:data:: BASE_LOAD_FORECAST_SHORT_TERM_URL
   :value: 'https://portal.spp.org/file-browser-api/download/stlf-vs-actual?path='


.. py:data:: BASE_SOLAR_AND_WIND_MID_TERM_URL
   :value: 'https://portal.spp.org/file-browser-api/download/midterm-resource-forecast?path='


.. py:data:: BASE_SOLAR_AND_WIND_SHORT_TERM_URL
   :value: 'https://portal.spp.org/file-browser-api/download/shortterm-resource-forecast?path='


.. py:data:: DA_BINDING_CONSTRAINTS
   :value: 'da-binding-constraints'


.. py:data:: FILE_BROWSER_API_URL
   :value: 'https://portal.spp.org/file-browser-api/'


.. py:data:: FILE_BROWSER_DOWNLOAD_URL
   :value: 'https://portal.spp.org/file-browser-api/download'


.. py:data:: FS_DAM_LMP_BY_LOCATION
   :value: 'da-lmp-by-location'


.. py:data:: FS_RTBM_LMP_BY_LOCATION
   :value: 'rtbm-lmp-by-location'


.. py:data:: LAST_UPDATED_KEYWORDS
   :value: ['last updated', 'as of']


.. py:data:: LMP_BY_SETTLEMENT_LOCATION_WEIS
   :value: 'lmp-by-settlement-location-weis'


.. py:data:: LMP_HUBS_AND_INTERFACES

.. py:data:: LOCATION_TYPE_ALL
   :value: 'ALL'


.. py:data:: LOCATION_TYPE_BUS
   :value: 'Bus'


.. py:data:: LOCATION_TYPE_HUB
   :value: 'Hub'


.. py:data:: LOCATION_TYPE_INTERFACE
   :value: 'Interface'


.. py:data:: LOCATION_TYPE_SETTLEMENT_LOCATION
   :value: 'Settlement Location'


.. py:data:: MARKETPLACE_BASE_URL
   :value: 'https://portal.spp.org'


.. py:data:: OPERATING_RESERVES
   :value: 'operating-reserves'


.. py:function:: process_gen_mix(df: pandas.DataFrame, detailed: bool = False) -> pandas.DataFrame

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

   :param df: raw data
   :type df: pd.DataFrame
   :param detailed: whether to combine market and self columns
   :type detailed: bool

   :returns: processed data
   :rtype: pd.DataFrame


.. py:data:: QUERY_RTM5_HUBS_URL
   :value: 'https://pricecontourmap.spp.org/arcgis/rest/services/MarketMaps/RTBM_FeatureData/MapServer/1/query'


.. py:data:: QUERY_RTM5_INTERFACES_URL
   :value: 'https://pricecontourmap.spp.org/arcgis/rest/services/MarketMaps/RTBM_FeatureData/MapServer/2/query'


.. py:data:: RELIABILITY_LEVELS
   :value: ['Normal Operations', 'Weather Advisory', 'Resource Advisory', 'Conservative Operations...


.. py:data:: RELIABILITY_LEVELS_ALIASES

.. py:data:: RTBM_BINDING_CONSTRAINTS
   :value: 'rtbm-binding-constraints'


.. py:data:: RTBM_LMP_BY_BUS
   :value: 'rtbm-lmp-by-bus'


.. py:data:: RTBM_MCP
   :value: 'rtbm-mcp'


.. py:class:: SPP

   Bases: :py:obj:`gridstatus.base.ISOBase`

   Southwest Power Pool (SPP)


   **Attributes**

   .. list-table::
      :widths: 15 85
      :header-rows: 0

      * - **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**

   .. autoapisummary::
      :nosignatures:

      gridstatus.spp.SPP.get_as_prices_real_time_5_min
      gridstatus.spp.SPP.get_binding_constraints_day_ahead_hourly
      gridstatus.spp.SPP.get_binding_constraints_real_time_5_min
      gridstatus.spp.SPP.get_capacity_of_generation_on_outage
      gridstatus.spp.SPP.get_capacity_of_generation_on_outage_annual
      gridstatus.spp.SPP.get_day_ahead_operating_reserve_prices
      gridstatus.spp.SPP.get_fuel_mix
      gridstatus.spp.SPP.get_hourly_load
      gridstatus.spp.SPP.get_hourly_load_annual
      gridstatus.spp.SPP.get_interconnection_queue
      gridstatus.spp.SPP.get_lmp_day_ahead_hourly
      gridstatus.spp.SPP.get_lmp_real_time_5_min_by_bus
      gridstatus.spp.SPP.get_lmp_real_time_5_min_by_location
      gridstatus.spp.SPP.get_lmp_real_time_weis
      gridstatus.spp.SPP.get_load
      gridstatus.spp.SPP.get_load_forecast
      gridstatus.spp.SPP.get_load_forecast_mid_term
      gridstatus.spp.SPP.get_load_forecast_short_term
      gridstatus.spp.SPP.get_market_clearing_day_ahead
      gridstatus.spp.SPP.get_market_clearing_real_time
      gridstatus.spp.SPP.get_operating_reserves
      gridstatus.spp.SPP.get_raw_interconnection_queue
      gridstatus.spp.SPP.get_solar_and_wind_forecast_mid_term
      gridstatus.spp.SPP.get_solar_and_wind_forecast_short_term
      gridstatus.spp.SPP.get_ver_curtailments
      gridstatus.spp.SPP.get_ver_curtailments_annual
      gridstatus.spp.SPP.now

   .. py:method:: 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

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

      :param date: date to get data for. Supports "latest" for most recent interval.
      :param end: end date
      :param verbose: print url
      :param use_daily_files: if True, use daily files instead of 5 minute files.

      :returns: Real-Time 5-minute Marginal Clearing Prices
      :rtype: pd.DataFrame


   .. py:method:: 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

      Get Day-Ahead Binding Constraints

      :param date: date to get data for. Supports "latest" for most recently available data.
      :param end: end date
      :param verbose: print url

      :returns: Day-Ahead Binding Constraints
      :rtype: pd.DataFrame


   .. py:method:: 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

      Get Real-Time Binding Constraints

      :param date: date to get data for. Supports "latest" for most recent interval.
      :param end: end date
      :param verbose: print url

      :returns: Real-Time Binding Constraints
      :rtype: pd.DataFrame


   .. py:method:: 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

      Get Capacity of Generation on Outage.

      Published daily at 8am CT for next 7 days

      :param date: start date
      :param end: end date


   .. py:method:: get_capacity_of_generation_on_outage_annual(year: int, verbose: bool = True) -> pandas.DataFrame

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

      :param year: year to get data for
      :param verbose: print url

      :returns: VER Curtailments
      :rtype: pd.DataFrame


   .. py:method:: 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

      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#

      :param date: date to get data for
      :param end: end date
      :param verbose: print url

      :returns: Day Ahead Marginal Clearing Prices
      :rtype: pd.DataFrame


   .. py:method:: get_fuel_mix(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], detailed: bool = False, verbose: bool = False) -> pandas.DataFrame

      Get fuel mix

      :param date: supports today and latest
      :param 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
      :rtype: pd.DataFrame


   .. py:method:: 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

      Get Hourly Load

      Supports recent data. For historical annual data use get_hourly_load_annual

      :param date: start date
      :param end: end date

      :returns: Hourly Load
      :rtype: pd.DataFrame


   .. py:method:: get_hourly_load_annual(year: int, verbose: bool = True) -> pandas.DataFrame

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

      :param year: year to get data for
      :param verbose: print url

      :returns: Hourly Load
      :rtype: pd.DataFrame


   .. py:method:: get_interconnection_queue(verbose: bool = False) -> pandas.DataFrame

      Get interconnection queue

      :returns: Interconnection queue
      :rtype: pandas.DataFrame


   .. py:method:: 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

      Get day ahead hourly LMP data

      Supported Location Types:
          - ``Hub``
          - ``Interface``
          - ``ALL``


   .. py:method:: 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

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

      :param date: date to get data for
      :param end: end date
      :param verbose: print url

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


   .. py:method:: 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

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

      :param date: date to get data for
      :param end: end date
      :param 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)
      :param verbose: print url
      :param use_daily_files: if True, use daily files instead of 5 minute files.


   .. py:method:: 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

      Get LMP data for real time WEIS

      :param date: date to get data for. if end is not provided, will get data for
                   5 minute interval that date is in.
      :param end: end date
      :param verbose: print url


   .. py:method:: get_load(date: str | pandas.Timestamp, verbose: bool = False) -> pandas.DataFrame

      Returns load for last 24hrs in 5 minute intervals


   .. py:method:: get_load_forecast(date: str | pandas.Timestamp, forecast_type: str = 'MID_TERM', verbose: bool = False) -> pandas.DataFrame

      Returns load forecast for next 7 days in hourly intervals

      :param forecast_type: MID_TERM is hourly for next 7 days or SHORT_TERM is
                            every five minutes for a few hours
      :type forecast_type: str

      :returns: forecast for current day
      :rtype: pd.DataFrame


   .. py:method:: 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

      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

      :param date: date to get data for. Supports "latest" and "today"
      :type date: pd.Timestamp|str
      :param verbose: print info
      :type verbose: bool

      :returns: forecast as dataframe.
      :rtype: pd.DataFrame


   .. py:method:: 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

      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

      :param date: date to get data for. Supports "latest" and "today"
      :type date: pd.Timestamp|str
      :param verbose: print info
      :type verbose: bool
      :param end: end date
      :type end: pd.Timestamp|str
      :param drop_null_forecast_rows: if True, drop rows with null forecast values
      :type drop_null_forecast_rows: bool

      :returns: forecast as dataframe.
      :rtype: pd.DataFrame


   .. py:method:: 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

      Get Market Clearing Day Ahead

      :param date: start date
      :param end: end date

      :returns: Market Clearing Day Ahead
      :rtype: pd.DataFrame


   .. py:method:: 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

      Get Market Clearing Real Time

      :param date: start date
      :param end: end date

      :returns: Market Clearing Real Time
      :rtype: pd.DataFrame


   .. py:method:: 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

   .. py:method:: get_raw_interconnection_queue(verbose: bool = False) -> BinaryIO

   .. py:method:: 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

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

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

      :param date: date to get data for. Supports "latest" and "today"
      :type date: pd.Timestamp|str
      :param verbose: print info
      :type verbose: bool

      :returns: forecast as dataframe.
      :rtype: pd.DataFrame


   .. py:method:: 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

      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

      :param date: date to get data for. Supports "latest" and "today"
      :type date: pd.Timestamp|str
      :param verbose: print info
      :type verbose: bool

      :returns: forecast as dataframe.
      :rtype: pd.DataFrame


   .. py:method:: 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

      Get VER Curtailments

      Supports recent data. For historical annual data use get_ver_curtailments_annual

      :param date: start date
      :param end: end date


   .. py:method:: get_ver_curtailments_annual(year: int, verbose: bool = True) -> pandas.DataFrame

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

      :param year: year to get data for
      :param verbose: print url

      :returns: VER Curtailments
      :rtype: pd.DataFrame


   .. py:method:: now()
      :staticmethod:



.. py:data:: STATUS_STOP_WORDS
   :value: ['as', 'at', 'ct', 'eea', 'of', 'on']


