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.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.LOCATION_TYPE_ALL
   gridstatus.spp.LOCATION_TYPE_HUB
   gridstatus.spp.LOCATION_TYPE_INTERFACE
   gridstatus.spp.LOCATION_TYPE_SETTLEMENT_LOCATION
   gridstatus.spp.MARKETPLACE_BASE_URL
   gridstatus.spp.QUERY_RTM5_HUBS_URL
   gridstatus.spp.QUERY_RTM5_INTERFACES_URL
   gridstatus.spp.RELIABILITY_LEVELS
   gridstatus.spp.RELIABILITY_LEVELS_ALIASES
   gridstatus.spp.STATUS_STOP_WORDS


Contents
~~~~~~~~~~~~~~~~~~~
.. py:function:: add_interval(df, interval_min)

   Adds Interval Start and Interval End columns to df


.. py:data:: BASE_LOAD_FORECAST_MID_TERM_URL

   

.. py:data:: BASE_LOAD_FORECAST_SHORT_TERM_URL

   

.. py:data:: BASE_SOLAR_AND_WIND_MID_TERM_URL

   

.. py:data:: BASE_SOLAR_AND_WIND_SHORT_TERM_URL

   

.. 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:: LOCATION_TYPE_ALL
   :value: 'ALL'

   

.. 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:function:: process_gen_mix(df, detailed=False)

   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: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_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_interconnection_queue
      gridstatus.spp.SPP.get_lmp
      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_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_capacity_of_generation_on_outage(date, end=None, verbose=False)

      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, verbose=True)

      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, end=None, verbose=False)

      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, detailed=False, verbose=False)

      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_interconnection_queue(verbose=False)

      Get interconnection queue

      :returns: Interconnection queue
      :rtype: pandas.DataFrame


   .. py:method:: get_lmp(date, end=None, market: str = None, location_type: str = LOCATION_TYPE_ALL, verbose=False)

      Get LMP data

      Supported Markets:
          - ``REAL_TIME_5_MIN``
          - ``DAY_AHEAD_HOURLY``

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


   .. py:method:: get_lmp_real_time_weis(date, end=None, verbose=False)

      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, verbose=False)

      Returns load for last 24hrs in 5 minute intervals


   .. py:method:: get_load_forecast(date, forecast_type='MID_TERM', verbose=False)

      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, end=None, verbose=False)

      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, end=None, verbose=False)

      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

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


   .. py:method:: get_operating_reserves(date, end=None, verbose=False)


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


   .. py:method:: get_solar_and_wind_forecast_mid_term(date, end=None, verbose=False)

      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, end=None, verbose=False)

      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, end=None, verbose=False)

      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, verbose=True)

      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']

   

