Gridstatus
====================

.. py:module:: gridstatus


Subpackages
-----------
.. toctree::
   :titlesonly:
   :maxdepth: 3

   ercot_api/index.rst
   tests/index.rst


Submodules
----------
.. toctree::
   :titlesonly:
   :maxdepth: 1

   base/index.rst
   caiso/index.rst
   decorators/index.rst
   eia/index.rst
   ercot/index.rst
   ercot_60d_utils/index.rst
   gs_logging/index.rst
   ieso/index.rst
   isone/index.rst
   lmp_config/index.rst
   miso/index.rst
   nyiso/index.rst
   pjm/index.rst
   spp/index.rst
   test/index.rst
   utils/index.rst
   version/index.rst
   viz/index.rst


Package Contents
----------------

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

.. autoapisummary::

   gridstatus.CAISO
   gridstatus.Ercot
   gridstatus.IESO
   gridstatus.ISONE
   gridstatus.Markets
   gridstatus.MISO
   gridstatus.NYISO
   gridstatus.PJM
   gridstatus.SPP



Exceptions Summary
~~~~~~~~~~~~~~~~~~

.. autoapisummary::

   `gridstatus.NotSupported`



Functions
~~~~~~~~~

.. autoapisummary::
   :nosignatures:

   gridstatus.get_iso
   gridstatus.list_isos
   gridstatus.load_folder



Contents
~~~~~~~~~~~~~~~~~~~
.. py:class:: CAISO

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

   California Independent System Operator (CAISO)


   **Attributes**

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

      * - **default_timezone**
        - US/Pacific
      * - **interconnection_homepage**
        - https://rimspub.caiso.com/rimsui/logon.do
      * - **iso_id**
        - caiso
      * - **markets**
        - None
      * - **name**
        - California ISO
      * - **status_homepage**
        - https://www.caiso.com/TodaysOutlook/Pages/default.aspx
      * - **trading_hub_locations**
        - ['TH_NP15_GEN-APND', 'TH_SP15_GEN-APND', 'TH_ZP26_GEN-APND']


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.CAISO.get_as_prices
      gridstatus.CAISO.get_as_procurement
      gridstatus.CAISO.get_curtailed_non_operational_generator_report
      gridstatus.CAISO.get_curtailment
      gridstatus.CAISO.get_fuel_mix
      gridstatus.CAISO.get_gas_prices
      gridstatus.CAISO.get_ghg_allowance
      gridstatus.CAISO.get_interconnection_queue
      gridstatus.CAISO.get_lmp
      gridstatus.CAISO.get_load
      gridstatus.CAISO.get_load_forecast
      gridstatus.CAISO.get_oasis_dataset
      gridstatus.CAISO.get_pnodes
      gridstatus.CAISO.get_raw_interconnection_queue
      gridstatus.CAISO.get_stats
      gridstatus.CAISO.get_status
      gridstatus.CAISO.get_storage
      gridstatus.CAISO.list_oasis_datasets

   .. py:method:: get_as_prices(date, end=None, market='DAM', sleep=4, verbose=False)

      Return AS prices for a given date for each region

      :param date: date to return data
      :type date: datetime.date, str
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: datetime.date, str
      :param market: DAM or HASP. Defaults to DAM.
      :type market: str
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame of AS prices
      :rtype: pandas.DataFrame


   .. py:method:: get_as_procurement(date, end=None, market='DAM', sleep=4, verbose=False)

      Get ancillary services procurement data from CAISO.

      :param date: date to return data
      :type date: datetime.date, str
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: datetime.date, str
      :param market: DAM or RTM. Defaults to DAM.

      :returns: A DataFrame of ancillary services data
      :rtype: pandas.DataFrame


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

      Return curtailed non-operational generator report for a given date.
          Earliest available date is June 17, 2021.


      :param date: date to return data
      :type date: datetime.date, str
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: datetime.date, str
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame of curtailed non-operational generator report

                column glossary:
                http://www.caiso.com/market/Pages/OutageManagement/Curtailed-OperationalGeneratorReportGlossary.aspx

                if requesting multiple days, may want to run
                following to remove outages that get reported across multiple days:
                ```df.drop_duplicates(
                    subset=["OUTAGE MRID", "CURTAILMENT START DATE TIME"], keep="last")```
      :rtype: pandas.DataFrame


   .. py:method:: get_curtailment(date, verbose=False)

      Return curtailment data for a given date

      .. rubric:: Notes

      * requires java to be installed in order to run
      * Data available from June 30, 2016 to present

      :param date: date to return data
      :type date: datetime.date, str
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: datetime.date, str
      :param verbose: print out url being fetched. Defaults to False.

      :returns: A DataFrame of curtailment data
      :rtype: pandas.DataFrame


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

      Get fuel mix in 5 minute intervals for a provided day

      :param date: "latest", "today", or an object
                   that can be parsed as a datetime for the day to return data.
      :type date: datetime.date, str
      :param start: start of date range to return.
                    alias for `date` parameter.
                    Only specify one of `date` or `start`.
      :type start: datetime.date, str
      :param end: "today" or an object that can be parsed
                  as a datetime for the day to return data.
                  Only used if requesting a range of dates.
      :type end: datetime.date, str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with columns - 'Time' and columns                 for each fuel type.
      :rtype: pandas.DataFrame


   .. py:method:: get_gas_prices(date, end=None, fuel_region_id='ALL', sleep=4, verbose=False)

      Return gas prices at a previous date

      :param date: date to return data
      :type date: datetime.date, str
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: datetime.date, str
      :param fuel_region_id: single fuel region id or list of fuel
                             region ids to return data for. Defaults to ALL, which returns
                             all fuel regions.
      :type fuel_region_id: str, or list

      :returns: A DataFrame of gas prices
      :rtype: pandas.DataFrame


   .. py:method:: get_ghg_allowance(date, end=None, sleep=4, verbose=False)

      Return ghg allowance at a previous date

      :param date: date to return data
      :type date: datetime.date, str
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: datetime.date, str


   .. py:method:: get_interconnection_queue(verbose=False)


   .. py:method:: get_lmp(date, market: str, locations: list = None, sleep: int = 5, end=None, verbose=False)

      Get LMP pricing starting at supplied date for a list of locations.

      :param date: date to return data
      :type date: datetime.date, str
      :param market: market to return from. supports:
      :param locations: list of locations to get data from.
                        If no locations are provided, defaults to NP15,
                        SP15, and ZP26, which are the trading hub locations.
                        USE "ALL_AP_NODES" for all Aggregate Pricing Node.
                        Use "ALL" to get all nodes. For a list of locations,
                        call ``CAISO.get_pnodes()``
      :type locations: list
      :param sleep: number of seconds to sleep before returning to
                    avoid hitting rate limit in regular usage. Defaults to 5 seconds.
      :type sleep: int

      :returns: A DataFrame of pricing data
      :rtype: pandas.DataFrame


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

      Return load at a previous date in 5 minute intervals


   .. py:method:: get_load_forecast(date, end=None, sleep=4, verbose=False)

      Returns load forecast for a previous date in 1 hour intervals

      :param date: day to return.
                   If string, format should be YYYYMMDD e.g 20200623
      :type date: datetime.date, pd.Timestamp, str
      :param sleep: number of seconds to sleep before returning to avoid
                    hitting rate limit in regular usage. Defaults to 5 seconds.
      :type sleep: int


   .. py:method:: get_oasis_dataset(dataset, date, end=None, params=None, raw_data=True, sleep=5, verbose=False)

      Return data from OASIS for a given dataset

      :param dataset: dataset to return data for. See CAISO.list_oasis_datasets
                      for supported datasets
      :type dataset: str
      :param date: date to return data
      :type date: datetime.date, str
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: datetime.date, str
      :param params: dictionary of parameters to pass to dataset.
                     See CAISO.list_oasis_datasets for supported parameters
      :type params: dict
      :param raw_data: return raw data from OASIS. Defaults to True.
      :type raw_data: bool, optional
      :param sleep: number of seconds to sleep between
                    requests. Defaults to 5.
      :type sleep: int, optional
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame of OASIS data
      :rtype: pandas.DataFrame


   .. py:method:: get_pnodes(verbose=False)


   .. py:method:: get_raw_interconnection_queue(verbose)


   .. py:method:: get_stats(verbose=False)


   .. py:method:: get_status(date='latest', verbose=False) -> str

      Get Current Status of the Grid. Only date="latest" is supported

      Known possible values: Normal, Restricted Maintenance Operations, Flex Alert


   .. py:method:: get_storage(date, verbose=False)

      Return storage charging or discharging for today in 5 minute intervals

      Negative means charging, positive means discharging

      :param date: date to return data
      :type date: datetime.date, str


   .. py:method:: list_oasis_datasets(dataset=None)



.. py:class:: Ercot

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

   Electric Reliability Council of Texas (ERCOT)


   **Attributes**

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

      * - **ACTUAL_LOADS_FORECAST_ZONES_URL_FORMAT**
        - https://www.ercot.com/content/cdr/html/{timestamp}_actual_loads_of_forecast_zones.html
      * - **ACTUAL_LOADS_WEATHER_ZONES_URL_FORMAT**
        - https://www.ercot.com/content/cdr/html/{timestamp}_actual_loads_of_weather_zones.html
      * - **BASE**
        - https://www.ercot.com/api/1/services/read/dashboards
      * - **default_timezone**
        - US/Central
      * - **interconnection_homepage**
        - http://mis.ercot.com/misapp/GetReports.do?reportTypeId=15933
      * - **iso_id**
        - ercot
      * - **LOAD_HISTORICAL_MAX_DAYS**
        - 14
      * - **location_types**
        - None
      * - **markets**
        - None
      * - **name**
        - Electric Reliability Council of Texas
      * - **status_homepage**
        - https://www.ercot.com/gridmktinfo/dashboards/gridconditions


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.Ercot.get_60_day_dam_disclosure
      gridstatus.Ercot.get_60_day_sced_disclosure
      gridstatus.Ercot.get_as_monitor
      gridstatus.Ercot.get_as_prices
      gridstatus.Ercot.get_as_reports
      gridstatus.Ercot.get_dam_price_corrections
      gridstatus.Ercot.get_dam_spp
      gridstatus.Ercot.get_energy_storage_resources
      gridstatus.Ercot.get_fuel_mix
      gridstatus.Ercot.get_highest_price_as_offer_selected
      gridstatus.Ercot.get_hourly_resource_outage_capacity
      gridstatus.Ercot.get_hourly_solar_report
      gridstatus.Ercot.get_hourly_wind_report
      gridstatus.Ercot.get_interconnection_queue
      gridstatus.Ercot.get_lmp
      gridstatus.Ercot.get_load
      gridstatus.Ercot.get_load_by_forecast_zone
      gridstatus.Ercot.get_load_by_weather_zone
      gridstatus.Ercot.get_load_forecast
      gridstatus.Ercot.get_raw_interconnection_queue
      gridstatus.Ercot.get_real_time_system_conditions
      gridstatus.Ercot.get_rtm_price_corrections
      gridstatus.Ercot.get_rtm_spp
      gridstatus.Ercot.get_sara
      gridstatus.Ercot.get_sced_system_lambda
      gridstatus.Ercot.get_spp
      gridstatus.Ercot.get_status
      gridstatus.Ercot.get_system_wide_actual_load
      gridstatus.Ercot.get_unplanned_resource_outages
      gridstatus.Ercot.parse_doc
      gridstatus.Ercot.read_doc
      gridstatus.Ercot.read_docs

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

      Get 60 day DAM Disclosure data


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

      Get 60 day SCED Disclosure data

      :param date: date to return
      :type date: datetime.date, str
      :param end: if declared, function will return
                  data as a range, from "date" to "end"
      :type end: datetime.date, str, optional
      :param process: if True, will process the data into
                      standardized format. if False, will return raw data
      :type process: bool, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns:

                dictionary with keys "sced_load_resource", "sced_gen_resource", and
                    "sced_smne", mapping to pandas.DataFrame objects
      :rtype: dict


   .. py:method:: get_as_monitor(date='latest', verbose=False)

      Get Ancillary Service Capacity Monitor.

      Parses table from
      https://www.ercot.com/content/cdr/html/as_capacity_monitor.html

      :param date: only supports "latest"
      :type date: str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with ancillary service capacity monitor data
      :rtype: pandas.DataFrame


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

      Get ancillary service clearing prices in hourly intervals in Day Ahead Market

      :param date: date of delivery for AS services
      :type date: datetime.date, str
      :param end: if declared, function will return
                  data as a range, from "date" to "end"
      :type end: datetime.date, str, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with prices for "Non-Spinning Reserves",                 "Regulation Up", "Regulation Down", "Responsive Reserves",                 "ERCOT Contingency Reserve Service"
      :rtype: pandas.DataFrame


   .. py:method:: get_as_reports(date, verbose=False)

      Get Ancillary Services Reports.

      Published with a 2 day delay around 3am central


   .. py:method:: get_dam_price_corrections(dam_type, verbose=False)

      Get RTM Price Corrections

      :param rtm_type: 'DAM_SPP', 'DAM_MCPC', 'DAM_EBLMP'
      :type rtm_type: str


   .. py:method:: get_dam_spp(year, verbose=False)

      Get Historical DAM Settlement Point Prices(SPPs)
      for each of the Hubs and Load Zones

      :param year: year to get data for.
                   Starting 2011, returns data for the entire year
      :type year: int

      Source:
          https://www.ercot.com/mp/data-products/data-product-details?id=NP4-180-ER


   .. py:method:: get_energy_storage_resources(date='latest', verbose=False)

      Get energy storage resources.
      Always returns data from previous and current day


   .. py:method:: get_fuel_mix(date, verbose=False)

      Get fuel mix 5 minute intervals

      :param date: "latest", "today",
                   and yesterday's date are supported.
      :type date: datetime.date, str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: A DataFrame with columns; Time and columns for each fuel                 type
      :rtype: pandas.DataFrame


   .. py:method:: get_highest_price_as_offer_selected(date, verbose=False)

      Get the offer price and the name of the Entity submitting
      the offer for the highest-priced Ancillary Service (AS) Offer.

      Published with 3 day delay

      :param date: date to get data for
      :type date: str, datetime
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrameq
      :rtype: pandas.DataFrame


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

      Hourly Resource Outage Capacity report sourced
      from the Outage Scheduler (OS).

      Returns outage data for for next 7 days.

      Total Resource MW doesn't include IRR, New Equipment outages,
      retirement of old equipment, seasonal
      mothballed (during the outage season),
      and mothballed.

      As such, it is a proxy for thermal outages.

      :param date: time to download. Returns last hourly report
                   before this time. Supports "latest"
      :type date: str
      :param end: end time to download. Defaults to None.
      :type end: str, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with hourly resource outage capacity data
      :rtype: pandas.DataFrame


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

      Get Hourly Solar Report.

      Posted every hour and includes System-wide and geographic regional
      hourly averaged solar power production, STPPF, PVGRPP, and COP HSL
      for On-Line PVGRs for a rolling historical 48-hour period as well
      as the system-wide and regional STPPF, PVGRPP, and COP HSL for
      On-Line PVGRs for the rolling future 168-hour period.

      :param date: date to get report for. Supports "latest" or a date string
      :type date: str
      :param end: end date for date range. Defaults to None.
      :type end: str, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with hourly solar report data
      :rtype: pandas.DataFrame


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

      Get Hourly Wind Report.

      This report is posted every hour and includes System-wide and Regional
      actual hourly averaged wind power production, STWPF, WGRPP and COP
      HSLs for On-Line WGRs for a rolling historical 48-hour period as
      well as the System-wide and Regional STWPF, WGRPP and
      COP HSLs for On-Line WGRs for the rolling future
      168-hour period. Our forecasts attempt to predict HSL,
      which is uncurtailed power generation potential.

      :param date: date to get report for. Supports "latest"
      :type date: str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with hourly wind report data
      :rtype: pandas.DataFrame


   .. py:method:: get_interconnection_queue(verbose=False)

      Get interconnection queue for ERCOT

      Monthly historical data available here:
          http://mis.ercot.com/misapp/GetReports.do?reportTypeId=15933&reportTitle=GIS%20Report&showHTMLView=&mimicKey


   .. py:method:: get_lmp(date, end=None, market: str = Markets.REAL_TIME_SCED, locations: list = 'ALL', location_type: str = 'ALL', verbose=False)

      Get LMP data for ERCOT normally produced by SCED every five minutes

      Can specify the location type to return "electrical bus"
      or "settlement point" data



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

      Get load for a date

      :param date: "latest", "today", or a date string
                   are supported.
      :type date: datetime.date, str


   .. py:method:: get_load_by_forecast_zone(date, verbose=False)

      Get hourly load for ERCOT forecast zones

      :param date: "today", or a date string
                   are supported.
      :type date: datetime.date, str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: pandas.DataFrame


   .. py:method:: get_load_by_weather_zone(date, verbose=False)

      Get hourly load for ERCOT weather zones

      :param date: "today", or a date string
                   are supported.
      :type date: datetime.date, str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: pandas.DataFrame


   .. py:method:: get_load_forecast(date, end=None, forecast_type=ERCOTSevenDayLoadForecastReport.BY_FORECAST_ZONE, verbose=False)

      Returns load forecast of specified forecast type.

      If date range provided, returns all hourly reports published within.

      Note: only limited historical data is available


      :param date: datetime to download. If `end` not provided,
                   returns last hourly report published before. if "latest",
                   returns most recent hourly report. if `end` provided,
                   returns all hourly reports published after this date
                   and before `end`.
      :type date: str, datetime
      :param end: if provided, returns all hourly reports published
                  after `date` and before `end`
      :type end: str, datetime,
      :param forecast_type: The load forecast type.
                            Enum of possible values.
      :type forecast_type: ERCOTSevenDayLoadForecastReport
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional


   .. py:method:: get_raw_interconnection_queue(verbose=False)


   .. py:method:: get_real_time_system_conditions(date='latest', verbose=False)

      Get Real-Time System Conditions.

      Parses table from
      https://www.ercot.com/content/cdr/html/real_time_system_conditions.html

      :param date: only supports "latest"
      :type date: str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with real-time system conditions
      :rtype: pandas.DataFrame


   .. py:method:: get_rtm_price_corrections(rtm_type, verbose=False)

      Get RTM Price Corrections

      :param rtm_type: 'RTM_SPP', 'RTM_SPLMP', 'RTM_EBLMP',
                       'RTM_ShadowPrice', 'RTM_SOGLMP', 'RTM_SOGPRICE'
      :type rtm_type: str


   .. py:method:: get_rtm_spp(year, verbose=False)

      Get Historical RTM Settlement Point Prices(SPPs)
          for each of the Hubs and Load Zones

      :param year: year to get data for
                   Starting 2011, returns data for the entire year
      :type year: int

      Source:
          https://www.ercot.com/mp/data-products/data-product-details?id=NP6-785-ER


   .. py:method:: get_sara(url='https://www.ercot.com/files/docs/2023/05/05/SARA_Summer2023_Revised.xlsx', verbose=False)

      Parse SARA data from url.

      Seasonal Assessment of Resource Adequacy for the ERCOT Region (SARA)

      :param url: url to download SARA data from. Defaults to
                  Summer 2023 SARA data.
      :type url: str, optional


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

      Get System lambda of each successful SCED

      Normally published every 5 minutes

      :param date: date or start time to get data for
      :type date: str, datetime, pd.Timestamp
      :param end: end time to get data for. If None,
                  return 1 day of data. Defaults to None.
      :type end: str, datetime, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame
      :rtype: pandas.DataFrame


   .. py:method:: get_spp(date, end=None, market: str = None, locations: list = 'ALL', location_type: str = 'ALL', verbose=False)

      Get SPP data for ERCOT

      Supported Markets:
          - ``REAL_TIME_15_MIN``
          - ``DAY_AHEAD_HOURLY``

      Supported Location Types:
          - ``Load Zone``
          - ``Trading Hub``
          - ``Resource Node``


   .. py:method:: get_status(date, verbose=False)

      Returns status of grid


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

      Get 15-minute system-wide actual load.

      This report is posted every hour five minutes after the hour.

      :param date: date to get data for
      :type date: str, datetime
      :param end: end time to get data for. Defaults to None.
      :type end: str, datetime, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with system actuals data
      :rtype: pandas.DataFrame


   .. py:method:: get_unplanned_resource_outages(date, verbose=False)

      Get Unplanned Resource Outages.

      Data published at ~5am central on the 3rd day after the day of interest.

      :param date: date to get data for
      :type date: str, datetime
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with unplanned resource outages
      :rtype: pandas.DataFrame


   .. py:method:: parse_doc(doc, dst_ambiguous_default='infer', verbose=False)


   .. py:method:: read_doc(doc, parse=True, verbose=False)


   .. py:method:: read_docs(docs, parse=True, empty_df=None, verbose=False)



.. py:function:: get_iso(iso_id)

   Get an ISO by its id


.. py:class:: IESO

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

   Independent Electricity System Operator (IESO)


   **Attributes**

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

      * - **default_timezone**
        - EST
      * - **iso_id**
        - ieso
      * - **name**
        - Independent Electricity System Operator
      * - **status_homepage**
        - https://www.ieso.ca/en/Power-Data


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.IESO.get_fuel_mix
      gridstatus.IESO.get_generator_report_hourly
      gridstatus.IESO.get_load
      gridstatus.IESO.get_load_forecast
      gridstatus.IESO.get_zonal_load_forecast

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

      Hourly output and capability for each fuel type (summed over all generators)
      for a given date or from date to end. Variable generators (solar and wind)
      have a forecast.

      :param date: The date to get the load for
                   Can be a `datetime.date` or `datetime.datetime` object, or a string
                   with the values "today" or "latest". If `end` is None, returns
                   only data for this date.
      :type date: datetime.date | datetime.datetime | str
      :param end: End date. Defaults None
                  If provided, returns data from `date` to `end` date. The `end` can be a
                  `datetime.date` or `datetime.datetime` object.
      :type end: datetime.date | datetime.datetime, optional
      :param verbose: Print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: fuel mix
      :rtype: pd.DataFrame


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

      Hourly output for each generator for a given date or from date to end.
      Variable generators (solar and wind) have a forecast and available capacity.
      Non-variable generators have a capability.

      :param date: The date to get the load for
                   Can be a `datetime.date` or `datetime.datetime` object, or a string
                   with the values "today" or "latest". If `end` is None, returns
                   only data for this date.
      :type date: datetime.date | datetime.datetime | str
      :param end: End date. Defaults None
                  If provided, returns data from `date` to `end` date. The `end` can be a
                  `datetime.date` or `datetime.datetime` object.
      :type end: datetime.date | datetime.datetime, optional
      :param verbose: Print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: generator output and capability/available capacity
      :rtype: pd.DataFrame


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

      Get 5-minute load for the Market and Ontario for a given date or from
      date to end date.

      :param date: The date to get the load for
                   Can be a `datetime.date` or `datetime.datetime` object, or a string
                   with the values "today" or "latest". If `end` is None, returns
                   only data for this date.
      :type date: datetime.date | datetime.datetime | str
      :param end: End date. Defaults None
                  If provided, returns data from `date` to `end` date. The `end` can be a
                  `datetime.date` or `datetime.datetime` object.
      :type end: datetime.date | datetime.datetime, optional
      :param verbose: Print verbose output. Defaults to False.
      :type verbose: bool, optional
      :param frequency: Frequency of data. Defaults to "5min".
      :type frequency: str, optional

      :returns: zonal load as a wide table with columns for each zone
      :rtype: pd.DataFrame


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

      Get forecasted load for Ontario. Supports only "latest" and "today" because
      there is only one load forecast.

      :param date: Either "today" or "latest"
      :type date: str
      :param verbose: Print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: Ontario load forecast
      :rtype: pd.DataFrame


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

      Get forecasted load by forecast zone (Ontario, East, West) for a given date
      or from date to end date. This method supports future dates.

      Supports data 90 days into the past and up to 34 days into the future.

      :param date: The date to get the load for
                   Can be a `datetime.date` or `datetime.datetime` object, or a string
                   with the values "today" or "latest". If `end` is None, returns
                   only data for this date.
      :type date: datetime.date | datetime.datetime | str
      :param end: End date. Defaults None
                  If provided, returns data from `date` to `end` date. The `end` can be a
                  `datetime.date` or `datetime.datetime` object.
      :type end: datetime.date | datetime.datetime, optional
      :param verbose: Print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: forecasted load as a wide table with columns for each zone
      :rtype: pd.DataFrame



.. py:class:: ISONE

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

   ISO New England (ISONE)


   **Attributes**

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

      * - **default_timezone**
        - US/Eastern
      * - **hubs**
        - None
      * - **interconnection_homepage**
        - https://irtt.iso-ne.com/reports/external
      * - **interfaces**
        - None
      * - **iso_id**
        - isone
      * - **markets**
        - None
      * - **name**
        - ISO New England
      * - **status_homepage**
        - https://www.iso-ne.com/markets-operations/system-forecast-status/current-system-status
      * - **zones**
        - None


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.ISONE.get_btm_solar
      gridstatus.ISONE.get_fuel_mix
      gridstatus.ISONE.get_interconnection_queue
      gridstatus.ISONE.get_lmp
      gridstatus.ISONE.get_load
      gridstatus.ISONE.get_load_forecast
      gridstatus.ISONE.get_raw_interconnection_queue
      gridstatus.ISONE.get_status

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

      Return BTM solar at a previous date in 5 minute intervals


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

      Return fuel mix at a previous date

      Provided at frequent, but irregular intervals by ISONE


   .. py:method:: get_interconnection_queue(verbose=False)

      Get the interconnection queue. Contains active and withdrawm applications.

      More information: https://www.iso-ne.com/system-planning/interconnection-service/interconnection-request-queue/


      :returns: interconnection queue
      :rtype: pandas.DataFrame


   .. py:method:: get_lmp(date, end=None, market: str = None, locations: list = None, include_id=False, verbose=False)

      Find Node ID mapping:
          https://www.iso-ne.com/markets-operations/settlements/pricing-node-tables/


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

      Return load at a previous date in 5 minute intervals


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

      Return forecast at a previous date


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

      Extract raw ISONE interconnection queue data.

      ISONE interconnection queue data is available on a webpage
      as an HTML table or you can download it as an excel file.
      Obviously an excel file would be much easier to work with however,
      the helpful generalized "Status" column (Withdrawn, Active, Commercial)
      and the "Jurisdiction" column are only available as HTML.

      Also, there is helpful detailed status information in the
      FS, SIS, OS, FAC, IA columns that are represented as <img>
      tags in the HTML.

      This function replaces the <img> tags that convey detailed
      status information as text and extracts the html as a dataframe.
      You can see the image to text mapping in the upper left hand
      corner of the ISONE Queue data page: https://irtt.iso-ne.com/reports/external.


   .. py:method:: get_status(date, verbose=False)

      Get latest status for ISO NE



.. py:function:: list_isos()

   List available ISOs


.. py:function:: load_folder(path, time_zone=None, verbose=True)

   Load a single DataFrame for same schema csv files in a folder

   :param path: path to folder
   :type path: str
   :param time_zone: time zone to localize to timestamps.
                     By default returns as UTC
   :type time_zone: str
   :param verbose: print verbose output. Defaults to True.
   :type verbose: bool, optional

   :returns: A DataFrame of all files
   :rtype: pandas.DataFrame


.. py:class:: Markets

   Bases: :py:obj:`enum.Enum`

   Names of LMP Markets


   **Attributes**

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

      * - **DAY_AHEAD_HOURLY**
        - DAY_AHEAD_HOURLY
      * - **REAL_TIME_15_MIN**
        - REAL_TIME_15_MIN
      * - **REAL_TIME_5_MIN**
        - REAL_TIME_5_MIN
      * - **REAL_TIME_HOURLY**
        - REAL_TIME_HOURLY
      * - **REAL_TIME_SCED**
        - REAL_TIME_SCED


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.Markets.__contains__

   .. py:method:: __contains__(item)



.. py:class:: MISO

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

   Midcontinent Independent System Operator (MISO)


   **Attributes**

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

      * - **BASE**
        - https://api.misoenergy.org/MISORTWDDataBroker/DataBrokerServices.asmx
      * - **default_timezone**
        - US/Eastern
      * - **hubs**
        - ['ILLINOIS.HUB', 'INDIANA.HUB', 'LOUISIANA.HUB', 'MICHIGAN.HUB', 'MINN.HUB', 'MS.HUB', 'TEXAS.HUB', 'ARKANSAS.HUB']
      * - **interconnection_homepage**
        - https://www.misoenergy.org/planning/generator-interconnection/GI_Queue/
      * - **iso_id**
        - miso
      * - **markets**
        - None
      * - **name**
        - Midcontinent ISO


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.MISO.get_fuel_mix
      gridstatus.MISO.get_interconnection_queue
      gridstatus.MISO.get_lmp
      gridstatus.MISO.get_load
      gridstatus.MISO.get_load_forecast
      gridstatus.MISO.get_raw_interconnection_queue

   .. py:method:: get_fuel_mix(date, verbose=False)

      Get the fuel mix for a given day for a provided MISO.

      :param date: "latest", "today", or an object
                   that can be parsed as a datetime for the day to return data.
      :type date: datetime.date, str
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: DataFrame with columns "Time", "Load", "Fuel Mix"
      :rtype: pandas.DataFrame


   .. py:method:: get_interconnection_queue(verbose=False)

      Get the interconnection queue

      :returns: Interconnection queue
      :rtype: pandas.DataFrame


   .. py:method:: get_lmp(date, market: str, locations: list = 'ALL', verbose=False)


   .. py:method:: get_load(date, verbose=False)


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


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



.. py:exception:: NotSupported

   Bases: :py:obj:`Exception`

   Common base class for all non-exit exceptions.

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





.. py:class:: NYISO

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

   New York Independent System Operator (NYISO)


   **Attributes**

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

      * - **default_timezone**
        - US/Eastern
      * - **interconnection_homepage**
        - https://www.nyiso.com/interconnections
      * - **iso_id**
        - nyiso
      * - **markets**
        - None
      * - **name**
        - New York ISO
      * - **status_homepage**
        - https://www.nyiso.com/system-conditions


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.NYISO.get_btm_solar
      gridstatus.NYISO.get_btm_solar_forecast
      gridstatus.NYISO.get_capacity_prices
      gridstatus.NYISO.get_fuel_mix
      gridstatus.NYISO.get_generators
      gridstatus.NYISO.get_interconnection_queue
      gridstatus.NYISO.get_lmp
      gridstatus.NYISO.get_load
      gridstatus.NYISO.get_load_forecast
      gridstatus.NYISO.get_loads
      gridstatus.NYISO.get_raw_interconnection_queue
      gridstatus.NYISO.get_status

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

      Returns estimated BTM solar generation at a previous date in hourly
          intervals for system and each zone.

          Available ~8 hours after the end of the operating day.

      :param date: Date to get load for.
                   Can be "latest", "today", or a date
      :type date: str, pd.Timestamp, datetime.datetime
      :param end: End date for date range.
                  Optional.
      :type end: str, pd.Timestamp, datetime.datetime
      :param verbose: Whether to print verbose output. Optional.
      :type verbose: bool

      :returns: BTM solar data for NYISO system and each zone
      :rtype: pandas.DataFrame


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


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

      Pull the most recent capacity market report's market clearing prices

      :param date: date that will be used to pull latest capacity
                   report (will refer to month and year)
      :type date: pandas.Timestamp
      :param verbose: print out requested url. Defaults to False.
      :type verbose: bool, optional

      :returns: a DataFrame of monthly capacity prices (all three auctions) for                 each of the four capacity localities within NYISO


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


   .. py:method:: get_generators(verbose=False)

      Get a list of generators in NYISO

      When possible return capacity and fuel type information

      :param verbose: print out requested url. Defaults to False.
      :type verbose: bool, optional

      :returns: a DataFrame of generators and locations

                **Possible Columns**

                * Generator Name
                * PTID
                * Subzone
                * Zone
                * Latitude
                * Longitude
                * Owner, Operator, and / or Billing Organization
                * Station Unit
                * Town
                * County
                * State
                * In-Service Date
                * Name Plate Rating (V) MW
                * 2022 CRIS MW Summer
                * 2022 CRIS MW Winter
                * 2022 Capability MW Summer
                * 2022 Capability MW Winter
                * Is Dual Fuel
                * Unit Type
                * Fuel Type 1
                * Fuel Type 2
                * 2021 Net Energy GWh
                * Notes
                * Generator Type
      :rtype: pandas.DataFrame


   .. py:method:: get_interconnection_queue(verbose=False)

      Return NYISO interconnection queue

      Additional Non-NYISO queue info: https://www3.dps.ny.gov/W/PSCWeb.nsf/All/286D2C179E9A5A8385257FBF003F1F7E?OpenDocument

      :returns: Interconnection queue containing, active, withdrawn,                 and completed project
      :rtype: pandas.DataFrame


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

      Supported Markets:
          - ``REAL_TIME_5_MIN`` (RTC)
          - ``REAL_TIME_15_MIN`` (RTD)
          - ``DAY_AHEAD_HOURLY``

      Supported Location Types:
          - ``zone``
          - ``generator``

      REAL_TIME_5_MIN is the Real Time Dispatch (RTD) market.
      REAL_TIME_15_MIN is the Real Time Commitment (RTC) market.
      For documentation on real time dispatch and real time commitment, see:
      https://www.nyiso.com/documents/20142/1404816/RTC-RTD%20Convergence%20Study.pdf/f3843982-dd30-4c66-6c21-e101c3cb85af


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

      Returns load at a previous date in 5 minute intervals for
        each zone and total load

      :param date: Date to get load for. Can be "latest", "today", or
                   a date in the format YYYY-MM-DD
      :type date: str
      :param end: End date for date range. Optional.
      :type end: str
      :param verbose: Whether to print verbose output. Optional.
      :type verbose: bool

      :returns: Load data for NYISO and each zone
      :rtype: pandas.DataFrame


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

      Get load forecast for a date in 1 hour intervals


   .. py:method:: get_loads(verbose=False)

      Get a list of loads in NYISO

      :param verbose: print out requested url. Defaults to False.
      :type verbose: bool, optional

      :returns: a DataFrame of loads and locations
      :rtype: pandas.DataFrame


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


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



.. py:class:: PJM

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

   PJM


   **Attributes**

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

      * - **default_timezone**
        - US/Eastern
      * - **hub_node_ids**
        - ['51217', '116013751', '35010337', '34497151', '34497127', '34497125', '33092315', '33092313', '33092311', '4669664', '51288', '51287']
      * - **interconnection_homepage**
        - https://www.pjm.com/planning/service-requests/services-request-status
      * - **iso_id**
        - pjm
      * - **location_types**
        - ['ZONE', 'LOAD', 'GEN', 'AGGREGATE', 'INTERFACE', 'EXT', 'HUB', 'EHV', 'TIE', 'RESIDUAL_METERED_EDC']
      * - **markets**
        - None
      * - **name**
        - PJM
      * - **price_node_ids**
        - ['5021703', '5021704', '5021723', '5021724', '93354015', '93354017', '93354019', '34887765', '34887767', '34887769', '34887771', '34887773', '34887775', '34887777', '2156111970', '34887779', '34887781', '34887783', '34887787', '34887789', '34887791', '34887793', '74008711', '34887819', '34887821', '34887823', '2156112027', '34887845', '1439658151', '34887847', '34887849', '74008743', '34887851', '34887853', '1123180720', '34887857', '1123180722', '34887859', '1123180723', '34887861', '1123180721', '34887871', '34887873', '34887887', '34887889', '34887891', '34887893', '34887895', '1207075032', '34887897', '34887899', '34887901', '34887911', '34887913', '34887915', '34887917', '34887923', '1097732340', '34887925', '34887927', '34887929', '34887935', '34887937', '34887939', '34887941', '34887949', '34887951', '34887953', '34887955', '1552845076', '34887957', '1552845077', '34887959', '1552845078', '34887961', '34887963', '34887965', '34887967', '34887969', '34887971', '1305131304', '34887977', '1305131306', '34887993', '34887997', '34887999', '34888001', '119118151', '2156114262', '1379266905', '1379266906', '1097732449', '1292915048', '1132294512', '1132294513', '1132294514', '1132294515', '1552845186', '106856851', '2156112284', '1305131444', '119118263', '119118265', '119118267', '119118269', '119118271', '106856905', '2156110343', '40243747', '71856675', '40243749', '71856677', '40243751', '40243753', '40243755', '40243757', '40243759', '40243761', '40243763', '40243765', '40243767', '40243769', '40243771', '40243773', '40243775', '40243777', '40243779', '1248991825', '1248991826', '1248991827', '40243801', '40243803', '40243805', '40243807', '135389793', '135389819', '40243837', '1666116222', '1666116223', '1666116224', '1666116225', '40243839', '1356163765', '38367965', '38367967', '38367969', '1218915048', '1218915049', '1218915050', '1218915051', '1388614399', '2156110624', '32418611', '32418613', '32418615', '32418617', '1388614460', '1084390238', '1218915186', '1218915187', '1369011076', '1369011077', '1369011078', '1268571042', '98370477', '1084390354', '93140', '93141', '93142', '93143', '93144', '93145', '98370523', '98370525', '98370527', '98370529', '98370531', '98370533', '98370535', '1552843818', '57967665', '1552843913', '1552843915', '1552843916', '1356162213', '1356162214', '50401', '48934161', '48934163', '48934165', '48934167', '48934169', '36181299', '50488', '50489', '50490', '36181325', '2156113262', '50542', '50543', '50557', '50558', '2156113284', '50578', '50579', '50581', '50621', '50622', '87901631', '50628', '50629', '50654', '50655', '50659', '50660', '50661', '50662', '2156111333', '1048047', '1048049', '1048050', '1048051', '1048052', '21601782', '21601783', '21601784', '21601785', '21601786', '50695', '50696', '50697', '50698', '50699', '2041990671', '123901459', '123901461', '123901463', '123901465', '123901467', '50715', '50716', '50717', '50727', '50728', '50729', '50730', '2156113457', '2156113469', '50764', '2156113488', '50769', '50770', '50771', '50777', '50778', '50779', '123901537', '123901539', '123901543', '31020649', '123901545', '31020651', '31020653', '50809', '50810', '50811', '50812', '50813', '50814', '50817', '50818', '1165479564', '2156109456', '50887', '50888', '50893', '50894', '50911', '50915', '32417525', '32417527', '2156111608', '1218914041', '1218914042', '1218914043', '32417545', '32417547', '1183231801', '32417599', '32417601', '32417603', '32417605', '51019', '51020', '51021', '1348263767', '32417625', '32417627', '32417629', '32417631', '32417633', '32417635', '1379268471', '1379268472', '1379268473', '1379268474', '1379268475', '1379268476', '63381383', '63381385', '2156111770', '2156109760', '2156109763', '2156109765', '2156109768', '2156109772', '2156109777', '5021665', '5021666', '5021667', '2156111847', '93353961', '93353963', '93353965']
      * - **zone_node_ids**
        - ['1', '3', '51291', '51292', '51293', '51295', '51296', '51297', '51298', '51299', '51300', '51301', '7633629', '8394954', '8445784', '33092371', '34508503', '34964545', '37737283', '116013753', '124076095', '970242670', '1709725933']


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.PJM.get_fuel_mix
      gridstatus.PJM.get_interconnection_queue
      gridstatus.PJM.get_lmp
      gridstatus.PJM.get_load
      gridstatus.PJM.get_load_forecast
      gridstatus.PJM.get_pnode_ids
      gridstatus.PJM.get_raw_interconnection_queue

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

      Get fuel mix for a date or date range  in hourly intervals


   .. py:method:: get_interconnection_queue(verbose=False)


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

      Returns LMP at a previous date

      .. rubric:: Notes

      * If start date is prior to the PJM archive date, all data
      must be downloaded before location filtering can be performed
      due to limitations of PJM API. The archive date is
      186 days (~6 months) before today for the 5 minute real time
      market and 731 days (~2 years) before today for the Hourly
      Real Time and Day Ahead Hourly markets. Node type filter can be
      performed for Real Time Hourly and Day Ahead Hourly markets.

      * If location_type is provided, it is filtered after data
      is retrieved for Real Time 5 Minute market regardless of the
      date. This is due to PJM api limitations

      *  Return `Location Id`, `Location Name`, `Location Short Name`.

      :param date: date to get LMPs for
      :type date: datetime.date, str
      :param end: end date to get LMPs for
      :type end: datetime.date, str
      :param market: Supported Markets:
                     REAL_TIME_5_MIN, REAL_TIME_HOURLY, DAY_AHEAD_HOURLY
      :type market: str
      :param locations: list of pnodeid to get LMPs for.
                        Defaults to "hubs". Use get_pnode_ids() to get
                        a list of possible pnode ids. If "all", will
                        return data from all p nodes (warning there are
                        over 10,000 unique pnodes, so expect millions or billions of rows!)
      :type locations: list, optional
      :param location_type: If specified,
                            will only return data for nodes of this type.
                            Defaults to None. Possible location types are: 'ZONE',
                            'LOAD', 'GEN', 'AGGREGATE', 'INTERFACE', 'EXT',
                            'HUB', 'EHV', 'TIE', 'RESIDUAL_METERED_EDC'.
      :type location_type: str, optional


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

      Returns load at a previous date at 5 minute intervals

      :param date: date to get load for. must be in last 30 days
      :type date: datetime.date, str

      :returns: Load data time series. Columns: Time, Load, and all areas

                * Load columns represent PJM-wide load
                * Returns data for the following areas: AE, AEP, APS, ATSI,
                BC, COMED, DAYTON, DEOK, DOM, DPL, DUQ, EKPC, JC,
                ME, PE, PEP, PJM MID ATLANTIC REGION, PJM RTO,
                PJM SOUTHERN REGION, PJM WESTERN REGION, PL, PN, PS, RECO
      :rtype: pd.DataFrame


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

      Get forecast for today in hourly intervals.

      Updates every Every half hour on the quarter E.g. 1:15 and 1:45



   .. py:method:: get_pnode_ids()


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



.. 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.get_capacity_of_generation_on_outage
      gridstatus.SPP.get_capacity_of_generation_on_outage_annual
      gridstatus.SPP.get_day_ahead_operating_reserve_prices
      gridstatus.SPP.get_fuel_mix
      gridstatus.SPP.get_interconnection_queue
      gridstatus.SPP.get_lmp
      gridstatus.SPP.get_lmp_real_time_weis
      gridstatus.SPP.get_load
      gridstatus.SPP.get_load_forecast
      gridstatus.SPP.get_load_forecast_mid_term
      gridstatus.SPP.get_load_forecast_short_term
      gridstatus.SPP.get_operating_reserves
      gridstatus.SPP.get_raw_interconnection_queue
      gridstatus.SPP.get_solar_and_wind_forecast_mid_term
      gridstatus.SPP.get_solar_and_wind_forecast_short_term
      gridstatus.SPP.get_ver_curtailments
      gridstatus.SPP.get_ver_curtailments_annual
      gridstatus.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:



