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

.. py:module:: gridstatus.spp


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

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

.. autoapisummary::

   gridstatus.spp.BAAEnum
   gridstatus.spp.SPP




Functions
~~~~~~~~~

.. autoapisummary::
   :nosignatures:

   gridstatus.spp.add_interval
   gridstatus.spp.fill_baa_column
   gridstatus.spp.process_gen_mix



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

.. autoapisummary::

   gridstatus.spp.BAA_LOAD_THRESHOLD_MW
   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.HOURLY_LOAD_WIDE_FORMAT_END_DATE
   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:: BAA_LOAD_THRESHOLD_MW
   :value: 5000


.. py:class:: BAAEnum

   Bases: :py:obj:`enum.StrEnum`

   Enum where members are also (and must be) strings

   Initialize self.  See help(type(self)) for accurate signature.


   **Attributes**

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

      * - **SPP**
        - 'SPP'
      * - **SWPW**
        - 'SWPW'



.. 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:function:: fill_baa_column(df, load_col)

   Fill missing BAA values based on load magnitude.

   If the BAA column doesn't exist, creates it. If it exists but has NaN values,
   fills only the missing entries. Uses BAA_LOAD_THRESHOLD_MW to distinguish
   between SWPW (small loads) and SPP (large loads).

   :param df: DataFrame with a load column to use for BAA inference.
   :param load_col: Name of the column containing load values.

   :returns: The DataFrame with BAA column filled in-place.


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


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


.. py:data:: HOURLY_LOAD_WIDE_FORMAT_END_DATE

.. 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_fuel_mix_by_baa
      gridstatus.spp.SPP.get_fuel_mix_by_baa_detailed
      gridstatus.spp.SPP.get_fuel_mix_detailed
      gridstatus.spp.SPP.get_hourly_load
      gridstatus.spp.SPP.get_hourly_load_annual
      gridstatus.spp.SPP.get_hourly_load_historical
      gridstatus.spp.SPP.get_interchange_real_time
      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_by_baa
      gridstatus.spp.SPP.get_load_by_baa_hourly
      gridstatus.spp.SPP.get_load_forecast
      gridstatus.spp.SPP.get_load_forecast_by_baa
      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.get_ver_curtailments_by_baa
      gridstatus.spp.SPP.get_ver_curtailments_by_baa_annual
      gridstatus.spp.SPP.get_west_interchange_real_time
      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], end: pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Get combined fuel mix summed across SPP and SWPW BAAs

      :param date: "latest", "today", a timestamp, or a date range tuple
      :param end: optional end date for range queries

      :returns: fuel mix summed across both BAAs
      :rtype: pd.DataFrame


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

      Get fuel mix for both SPP and SWPW BAAs with a BAA column

      :param date: "latest", "today", a timestamp, or a date range tuple
      :param end: optional end date for range queries

      :returns: fuel mix with BAA column differentiating SPP and SWPW
      :rtype: pd.DataFrame


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

      Get detailed fuel mix for both SPP and SWPW BAAs with a BAA column

      Breaks out self scheduled and market scheduled generation.

      :param date: "latest", "today", a timestamp, or a date range tuple
      :param end: optional end date for range queries

      :returns: detailed fuel mix with BAA column
      :rtype: pd.DataFrame


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

      Get combined detailed fuel mix summed across SPP and SWPW BAAs

      Breaks out self scheduled and market scheduled generation.

      :param date: "latest", "today", a timestamp, or a date range tuple
      :param end: optional end date for range queries

      :returns: detailed fuel mix summed across both BAAs
      :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 in the long format (on or after 2026-03-24).

      :param date: start date (must be on or after 2026-03-24)
      :param end: end date

      :returns:

                Hourly Load with columns Time, Interval Start,
                    Interval End, Balancing Area Name, Control Zone Name,
                    Forecast Area Type, 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_hourly_load_historical(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 in the legacy wide format (before 2026-03-24).

      Deprecated: SPP changed the hourly load data format on 2026-03-24.
      Use get_hourly_load for data on or after 2026-03-24.

      :param date: start date (must be before 2026-03-24)
      :param end: end date

      :returns: Hourly Load in wide format
      :rtype: pd.DataFrame


   .. py:method:: get_interchange_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 real-time interchange (tie flow) data.

      For "latest" and "today", returns ~2 days of 1-minute interchange data
      from the real-time endpoint.

      For historical dates, downloads monthly CSV files from the historical
      tie flow archive.

      Data from:
      - Real-time: https://portal.spp.org/pages/integrated-marketplace-interchange-trend
      - Historical: https://portal.spp.org/pages/historical-tie-flow

      :param date: supports "latest", "today", or a historical date/date range
      :param end: end date for historical range queries
      :param verbose: print info

      :returns: interchange data
      :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, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Returns total RTO load in 5 minute intervals from STLF data.


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

      Returns actual load by BAA from short-term load forecast data.


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

      Returns hourly actual load by BAA from mid-term load forecast data.


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

      Returns total RTO load forecast in hourly intervals from MTLF data.


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

      Returns hourly load forecast by BAA from MTLF data.


   .. 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 summed across BAAs.

      Supports recent data. For historical annual data use
      get_ver_curtailments_annual. For data broken down by BAA use
      get_ver_curtailments_by_baa.

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


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

      Get VER Curtailments summed across BAAs for a year. Starting 2014.

      Recent data use get_ver_curtailments. For data broken down by BAA use
      get_ver_curtailments_by_baa_annual.

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

      :returns: VER Curtailments
      :rtype: pd.DataFrame


   .. py:method:: get_ver_curtailments_by_baa(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 broken down by BAA.

      Supports recent data. For historical annual data use
      get_ver_curtailments_by_baa_annual.

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


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

      Get VER Curtailments broken down by BAA for a year. Starting 2014.

      Recent data use get_ver_curtailments_by_baa.

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

      :returns: VER Curtailments
      :rtype: pd.DataFrame


   .. py:method:: get_west_interchange_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 real-time interchange (tie flow) data for SPP West (SWPW).

      For "latest" and "today", returns ~2 days of 1-minute interchange data
      from the real-time endpoint.

      For historical dates, downloads monthly CSV files from the historical
      tie flow archive.

      Data from:
      - Real-time: https://portal.spp.org/pages/integrated-marketplace-interchange-trend
      - Historical: https://portal.spp.org/pages/historical-tie-flow

      :param date: supports "latest", "today", or a historical date/date range
      :param end: end date for historical range queries
      :param verbose: print info

      :returns: interchange data
      :rtype: pd.DataFrame


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



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


