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

.. py:module:: gridstatus


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

   aeso/index.rst
   caiso/index.rst
   ercot_api/index.rst
   isone_api/index.rst


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

   base/index.rst
   decorators/index.rst
   eia/index.rst
   eia_constants/index.rst
   ercot/index.rst
   ercot_60d_utils/index.rst
   ercot_constants/index.rst
   gs_logging/index.rst
   ieso/index.rst
   ieso_constants/index.rst
   isone/index.rst
   lmp_config/index.rst
   miso/index.rst
   miso_api/index.rst
   nyiso/index.rst
   pjm/index.rst
   pjm_constants/index.rst
   spp/index.rst
   test/index.rst
   utils/index.rst
   version/index.rst
   viz/index.rst


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

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

.. autoapisummary::

   gridstatus.AESO
   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:: AESO(api_key: str | None = None)

   API client for Alberta Electric System Operator (AESO) data.

   Handles authentication and provides methods to access various AESO datasets
   including supply and demand, market data, and operational information.

   Initialize the AESO API client.

   :param api_key: AESO API key. If not provided, will try to get from AESO_API_KEY environment variable.


   **Attributes**

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

      * - **api_key**
        - None
      * - **base_url**
        - 'https://apimgw.aeso.ca/public'
      * - **default_headers**
        - None
      * - **default_timezone**
        - 'US/Mountain'
      * - **HISTORICAL_FORECAST_EARLIEST**
        - None
      * - **HISTORICAL_FORECAST_LATEST**
        - None
      * - **MAX_NAVIGATION_ATTEMPTS**
        - 100
      * - **REQUEST_TIMEOUT**
        - (10, 120)


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.AESO.get_asset_list
      gridstatus.AESO.get_daily_average_pool_price
      gridstatus.AESO.get_forecast_pool_price
      gridstatus.AESO.get_fuel_mix
      gridstatus.AESO.get_generator_outages_hourly
      gridstatus.AESO.get_interchange
      gridstatus.AESO.get_load
      gridstatus.AESO.get_load_forecast
      gridstatus.AESO.get_pool_price
      gridstatus.AESO.get_reserves
      gridstatus.AESO.get_solar_10_min
      gridstatus.AESO.get_solar_forecast_12_hour
      gridstatus.AESO.get_solar_forecast_7_day
      gridstatus.AESO.get_solar_hourly
      gridstatus.AESO.get_supply_and_demand
      gridstatus.AESO.get_system_marginal_price
      gridstatus.AESO.get_transmission_outages
      gridstatus.AESO.get_unit_status
      gridstatus.AESO.get_wind_10_min
      gridstatus.AESO.get_wind_forecast_12_hour
      gridstatus.AESO.get_wind_forecast_7_day
      gridstatus.AESO.get_wind_hourly

   .. py:method:: get_asset_list(asset_id: str | None = None, pool_participant_id: str | None = None, operating_status: str | None = None, asset_type: str | None = None) -> pandas.DataFrame

      Get list of assets in the AESO system.

      :param asset_id: Filter by specific asset ID
      :param pool_participant_id: Filter by pool participant ID
      :param operating_status: Filter by operating status
      :param asset_type: Filter by asset type

      :returns: DataFrame containing asset information


   .. py:method:: get_daily_average_pool_price(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 daily average pool price data with on-peak and off-peak breakdowns.

      On-peak hours are defined as hours ending 8 through 23 (inclusive).
      Off-peak hours are all other hours.

      :returns: DataFrame containing daily average price data


   .. py:method:: get_forecast_pool_price(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 pool price data.

      :returns: DataFrame containing pool price data


   .. py:method:: get_fuel_mix() -> pandas.DataFrame

      Get current generation by fuel type.

      :returns: DataFrame containing generation data by fuel type, with each fuel type as a column
                containing its net generation value


   .. py:method:: get_generator_outages_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 hourly generator outage data.

      :param date: Start date for the data. Can be "latest" to get current data.
      :param end: End date for the data. If not provided, will get 24 months of data.
      :param verbose: Whether to print verbose output.

      :returns: DataFrame containing generator outage data


   .. py:method:: get_interchange() -> pandas.DataFrame

      Get current interchange flows with neighboring regions.

      :returns: DataFrame containing interchange data with separate columns for each region's flow
                and a net interchange flow column


   .. py:method:: get_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 current load data.

      :returns: DataFrame containing load 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

      Get load forecast data.

      The AESO publishes load forecasts daily at 7am Mountain Time. The forecast covers
      the next 13 days. The publish time is determined as follows:

      - For historical data: 7am on the day of the interval if interval is after 7am,
        otherwise 7am the previous day
      - For future data: 7am today (if after 7am) or 7am yesterday (if before 7am)

      :returns: DataFrame containing load forecast data with publish times.


   .. py:method:: get_pool_price(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 pool price data.

      :returns: DataFrame containing pool price data


   .. py:method:: get_reserves() -> pandas.DataFrame

      Get current reserve data.

      :returns: DataFrame containing reserve information


   .. py:method:: get_solar_10_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 actual solar generation data with 10-minute intervals.

      :returns: DataFrame containing actual solar generation data with 10-minute intervals


   .. py:method:: get_solar_forecast_12_hour(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 12-hour solar forecast data.

      :returns: DataFrame containing 12-hour solar forecast data with min, most likely, and max values


   .. py:method:: get_solar_forecast_7_day(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 7-day solar forecast data.

      :returns: DataFrame containing 7-day solar forecast data with min, most likely, and max values


   .. py:method:: get_solar_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 actual solar generation data with hourly intervals.

      :returns: DataFrame containing actual solar generation data with hourly intervals


   .. py:method:: get_supply_and_demand() -> pandas.DataFrame

      Get current supply and demand summary data.

      :returns: DataFrame containing current supply and demand information


   .. py:method:: get_system_marginal_price(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 system marginal price data.

      :returns: DataFrame containing system marginal price data with minutely intervals


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

      Get transmission outages data.

      :param date: Start date for the data. Can be "latest" to get current data.
      :param end: End date for the data. If not provided, will get data for the specified date.

      :returns: DataFrame containing transmission outage data


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

      Get current unit status data for all assets in the AESO system.

      :returns:

                - Time: Timestamp of the data
                - Asset: Asset identifier
                - Fuel Type: Type of fuel used
                - Sub Fuel Type: Sub-category of fuel type
                - Maximum Capability: Maximum generation capability in MW
                - Net Generation: Current net generation in MW
                - Dispatched Contingency Reserve: Amount of contingency reserve dispatched in MW
      :rtype: DataFrame containing unit status data with columns


   .. py:method:: get_wind_10_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 actual wind generation data with 10-minute intervals.

      :returns: DataFrame containing actual wind generation data with 10-minute intervals


   .. py:method:: get_wind_forecast_12_hour(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 12-hour wind forecast data.

      :returns: DataFrame containing 12-hour wind forecast data with min, most likely, and max values


   .. py:method:: get_wind_forecast_7_day(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 7-day wind forecast data.

      :returns: DataFrame containing 7-day wind forecast data with min, most likely, and max values


   .. py:method:: get_wind_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 actual wind generation data with hourly intervals.

      :returns: DataFrame containing actual wind generation data with hourly intervals



.. 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_caiso_renewables_report
      gridstatus.CAISO.get_curtailed_non_operational_generator_report
      gridstatus.CAISO.get_curtailment
      gridstatus.CAISO.get_curtailment_legacy
      gridstatus.CAISO.get_fuel_mix
      gridstatus.CAISO.get_fuel_regions
      gridstatus.CAISO.get_gas_prices
      gridstatus.CAISO.get_ghg_allowance
      gridstatus.CAISO.get_interconnection_queue
      gridstatus.CAISO.get_intertie_constraint_shadow_prices_real_time_5_min
      gridstatus.CAISO.get_interval_nomogram_branch_shadow_prices_real_time_5_min
      gridstatus.CAISO.get_lmp
      gridstatus.CAISO.get_lmp_hasp_15_min
      gridstatus.CAISO.get_lmp_scheduling_point_tie_day_ahead_hourly
      gridstatus.CAISO.get_lmp_scheduling_point_tie_real_time_15_min
      gridstatus.CAISO.get_lmp_scheduling_point_tie_real_time_5_min
      gridstatus.CAISO.get_load
      gridstatus.CAISO.get_load_forecast
      gridstatus.CAISO.get_load_forecast_15_min
      gridstatus.CAISO.get_load_forecast_5_min
      gridstatus.CAISO.get_load_forecast_day_ahead
      gridstatus.CAISO.get_load_forecast_seven_day_ahead
      gridstatus.CAISO.get_load_forecast_two_day_ahead
      gridstatus.CAISO.get_load_hourly
      gridstatus.CAISO.get_nomogram_branch_shadow_price_forecast_15_min
      gridstatus.CAISO.get_nomogram_branch_shadow_prices_day_ahead_hourly
      gridstatus.CAISO.get_nomogram_branch_shadow_prices_hasp_hourly
      gridstatus.CAISO.get_oasis_dataset
      gridstatus.CAISO.get_pnodes
      gridstatus.CAISO.get_raw_interconnection_queue
      gridstatus.CAISO.get_renewables_forecast_dam
      gridstatus.CAISO.get_renewables_forecast_hasp
      gridstatus.CAISO.get_renewables_forecast_rtd
      gridstatus.CAISO.get_renewables_forecast_rtpd
      gridstatus.CAISO.get_renewables_hourly
      gridstatus.CAISO.get_seven_day_resource_adequacy_outlook
      gridstatus.CAISO.get_stats
      gridstatus.CAISO.get_status
      gridstatus.CAISO.get_storage
      gridstatus.CAISO.get_storage_awards_fmm
      gridstatus.CAISO.get_storage_awards_ifm
      gridstatus.CAISO.get_storage_awards_rtd
      gridstatus.CAISO.get_storage_energy_awards_ruc
      gridstatus.CAISO.get_storage_energy_bids_fmm
      gridstatus.CAISO.get_storage_energy_bids_ifm
      gridstatus.CAISO.get_storage_soc_fmm
      gridstatus.CAISO.get_storage_soc_hourly
      gridstatus.CAISO.get_storage_soc_rtd
      gridstatus.CAISO.get_system_load_and_resource_schedules_day_ahead
      gridstatus.CAISO.get_system_load_and_resource_schedules_hasp
      gridstatus.CAISO.get_system_load_and_resource_schedules_real_time_5_min
      gridstatus.CAISO.get_system_load_and_resource_schedules_ruc
      gridstatus.CAISO.get_tie_flows_real_time
      gridstatus.CAISO.get_tie_flows_real_time_15_min
      gridstatus.CAISO.list_oasis_datasets

   .. py:method:: get_as_prices(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, market: str = 'DAM', sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      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: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, market: str = 'DAM', sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      Get ancillary services procurement data from CAISO.

      :param date: date to return data
      :type date: str | pd.Timestamp
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: str | pd.Timestamp | None, optional
      :param market: DAM or RTM. Defaults to "DAM".
      :type market: str, optional
      :param sleep: number of seconds to sleep between requests. Defaults to 4.
      :type sleep: int, optional
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

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


   .. py:method:: get_caiso_renewables_report(date: pandas.Timestamp) -> dict[str, pandas.DataFrame]

      Fetches the CAISO daily renewable report for a given date and extracts data from
      all the charts into wide dataframes.


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

      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: str, pd.Timestamp
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: str, pd.Timestamp, optional
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame of curtailed non-operational generator report
      :rtype: pandas.DataFrame

      .. rubric:: Notes

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

      If requesting multiple days, you may want to run the following
      to remove outages that get reported across multiple days::

          df.drop_duplicates(
              subset=["OUTAGE MRID", "CURTAILMENT START DATE TIME"],
              keep="last",
          )


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

      Return curtailment data for a given 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 verbose: print out url being fetched. Defaults to False.

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


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

      Return curtailment data for a given date.

      .. note::

         Data available from June 30, 2016 to May 31, 2025. For current data,
         please use ``get_curtailment``.

      :param date: Date to return data.
      :param verbose: Print out url being fetched. Defaults to False.

      :returns: A DataFrame of curtailment data.


   .. py:method:: get_fuel_mix(date: str | pandas.Timestamp, start: str | pandas.Timestamp | None = None, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      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.
      :param start: Start of date range to return. Alias for ``date`` parameter.
                    Only specify one of ``date`` or ``start``.
      :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.
      :param verbose: Print verbose output. Defaults to False.

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


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

      Retrieves the (mostly static) list of fuel regions with associated data.
      This file can be joined to the gas prices on Fuel Region Id


   .. py:method:: get_gas_prices(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, fuel_region_id: str | list = 'ALL', sleep: int = 4, verbose: bool = 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: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, sleep: int = 4, verbose: bool = 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: bool = False) -> pandas.DataFrame

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

      Get 5-min intertie constraint shadow prices from CAISO.

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

      :returns: A DataFrame with the intertie constraint shadow prices
      :rtype: pandas.DataFrame


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

      Get 5-min nomogram/branch shadow prices from CAISO.

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

      :returns: A DataFrame with the shadow prices
      :rtype: pandas.DataFrame


   .. py:method:: get_lmp(date: str | pandas.Timestamp, market: str, locations: list = None, sleep: int = 5, end: str | pandas.Timestamp = None, verbose: bool = 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_lmp_hasp_15_min(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Get LMP HASP 15-min data from CAISO.

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

      :returns: A DataFrame of LMP HASP 15-min data
      :rtype: pandas.DataFrame


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

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

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

      Get LMP scheduling point tie combination 5-min data from CAISO.

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

      :returns: A DataFrame of LMP scheduling point tie combination 5-min data
      :rtype: pandas.DataFrame


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

      Return load at a previous date in 5 minute intervals


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

   .. py:method:: get_load_forecast_15_min(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      Returns 15-minute load forecast from the Real-Time Pre-Dispatch Market

      :param date: day to return
      :type date: str | pd.Timestamp
      :param end: end of date range to return.
                  If None, returns only date. Defaults to None.
      :type end: str | pd.Timestamp, optional
      :param sleep: seconds to sleep before returning to avoid rate limit. Defaults to 4.
      :type sleep: int
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: DataFrame with load forecast data
      :rtype: pd.DataFrame


   .. py:method:: get_load_forecast_5_min(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      Returns 5-minute load forecast from the Real-Time Market

      :param date: day to return
      :type date: str | pd.Timestamp
      :param end: end of date range to return.
                  If None, returns only date. Defaults to None.
      :type end: str | pd.Timestamp, optional
      :param sleep: seconds to sleep before returning to avoid rate limit. Defaults to 4.
      :type sleep: int
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: DataFrame with load forecast data
      :rtype: pd.DataFrame


   .. py:method:: get_load_forecast_day_ahead(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      Returns hourly day-ahead load forecast

      :param date: day to return
      :type date: str | pd.Timestamp
      :param end: end of date range to return data.
                  If None, returns only date. Defaults to None.
      :type end: str | pd.Timestamp, optional
      :param sleep: seconds to sleep before returning to avoid rate limit. Defaults to 4.
      :type sleep: int
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: DataFrame with load forecast data
      :rtype: pd.DataFrame


   .. py:method:: get_load_forecast_seven_day_ahead(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      Returns hourly seven-day-ahead load forecast

      :param date: day to return
      :type date: str | pd.Timestamp
      :param end: end of date range to return data.
                  If None, returns only date. Defaults to None.
      :type end: str | pd.Timestamp, optional
      :param sleep: seconds to sleep before returning to avoid rate limit. Defaults to 4.
      :type sleep: int
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: DataFrame with load forecast data
      :rtype: pd.DataFrame


   .. py:method:: get_load_forecast_two_day_ahead(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      Returns hourly two-day-ahead load forecast

      :param date: day to return
      :type date: str | pd.Timestamp
      :param end: end of date range to return data.
                  If None, returns only date. Defaults to None.
      :type end: str | pd.Timestamp, optional
      :param sleep: seconds to sleep before returning to avoid rate limit. Defaults to 4.
      :type sleep: int
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: DataFrame with load forecast data
      :rtype: pd.DataFrame


   .. py:method:: get_load_hourly(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, sleep: int = 4, verbose: bool = False) -> pandas.DataFrame

      Returns actual load values

      :param date: day to return
      :type date: str | pd.Timestamp
      :param end: end of date range to return.
                  If None, returns only date. Defaults to None.
      :type end: str | pd.Timestamp, optional
      :param sleep: seconds to sleep before returning to avoid rate limit. Defaults to 4.
      :type sleep: int
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool

      :returns: DataFrame with actual load data
      :rtype: pd.DataFrame


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

      Returns 15-minute nomogram/branch shadow price forecast from the Real-Time Pre-Dispatch Market.

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

      :returns: A DataFrame with the shadow price forecast
      :rtype: pandas.DataFrame


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

      Returns hourly day-ahead nomogram/branch shadow price forecast.

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

      :returns: A DataFrame with the shadow price forecast
      :rtype: pandas.DataFrame


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

      Returns nomogram/branch shadow price HASP hourly data from CAISO.

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

      :returns: A DataFrame with the shadow price HASP data
      :rtype: pandas.DataFrame


   .. py:method:: get_oasis_dataset(dataset: str, date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, params: dict | None = None, raw_data: bool = True, sleep: int = 5, verbose: bool = False) -> pandas.DataFrame

      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: str, pd.Timestamp
      :param end: last date of range to return data.
                  If None, returns only date. Defaults to None.
      :type end: str, pd.Timestamp, optional
      :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

      :raises ValueError: if parameter is not supported for dataset
      :raises ValueError: if parameter value is not supported for dataset

      :returns: A DataFrame of data from OASIS
      :rtype: pd.DataFrame


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

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

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

      Return DAM renewable forecast in hourly intervals

      Data at: http://oasis.caiso.com/mrioasis/logon.do  at System Demand >
      DAM Renewable Forecast


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

      Get solar and wind generation HASP hourly data from CAISO.

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

      :returns: A DataFrame of solar and wind generation HASP hourly data
      :rtype: pandas.DataFrame


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

      Get RTD renewable forecast from CAISO.

      :param date: date to return data
      :type date: str | pd.Timestamp
      :param end: last date of range to return data.
      :type end: str | pd.Timestamp | None, optional
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame of RTD renewable forecast
      :rtype: pandas.DataFrame


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

      Get RTPD renewable forecast from CAISO.

      :param date: date to return data
      :type date: str | pd.Timestamp
      :param end: last date of range to return data.
      :type end: str | pd.Timestamp | None, optional
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame of RTPD renewable forecast
      :rtype: pandas.DataFrame


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

      Get wind and solar hourly actuals from CAISO.

      :param date: date to return data
      :type date: str | pd.Timestamp
      :param end: last date of range to return data.
      :type end: str | pd.Timestamp | None, optional
      :param verbose: print out url being fetched. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame of wind and solar hourly actuals
      :rtype: pandas.DataFrame


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

      Seven-day resource adequacy outlook in 5-minute intervals.

      Source: ``/outlook/history/{{yyyymmdd}}/rtm_forecast_7day.csv`` (historical)
      or current outlook for today.

      The CSV ``Time`` column marks interval end; ``Interval Start`` is five minutes
      prior. ``Publish Time`` is midnight Pacific on the publication date encoded in
      the URL path.


   .. py:method:: get_stats(verbose: bool = False) -> dict

   .. py:method:: get_status(date: str = 'latest', verbose: bool = 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: str | pandas.Timestamp, verbose: bool = False) -> pandas.DataFrame

      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:: get_storage_awards_fmm(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Energy and ancillary services awards for storage in the FMM (15-minute).


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

      Energy and AS awards for storage in the IFM (energy at 5-minute, AS hourly).


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

      Energy awards for storage in RTD (5-minute).


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

      RUC energy awards to storage (5-minute).


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

      FMM energy bid-in capacity by price bin (15-minute).


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

      IFM energy bid-in capacity by price bin (hourly).


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

      State of charge for storage in the FMM (15-minute, standalone resources).


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

      Hourly IFM and RUC state of charge (see ``build_storage_soc_hourly``).


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

      State of charge for storage in RTD (5-minute, standalone resources).


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

      Get CAISO System Load and Resource Schedules Day-Ahead data from CAISO.


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

      Get CAISO System Load and Resource Schedules HASP data from CAISO.


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

      Get CAISO System Load and Resource Schedules Real Time data from CAISO.


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

      Get CAISO System Load and Resource Schedules RUC data from CAISO.


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

      Return real time tie flow data.

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

      :returns: A DataFrame of real time tie flow data
      :rtype: pd.DataFrame


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

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

      List all available OASIS datasets and their parameters.

      :param dataset: dataset to return data for. If None, returns all datasets.
      :type dataset: str, optional



.. 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'
      * - **ESR_CORRECTION_DATES**
        - None
      * - **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'
      * - **OPERATIONS_MESSAGES_URL**
        - 'https://www.ercot.com/services/comm/mkt_notices/opsmessages'
      * - **SCED_SUPPLEMENTAL_CORRECTION_END**
        - None
      * - **SCED_SUPPLEMENTAL_CORRECTION_START**
        - None
      * - **status_homepage**
        - 'https://www.ercot.com/gridmktinfo/dashboards/gridconditions'
      * - **WAYBACK_CDX_URL**
        - 'https://web.archive.org/cdx/search/cdx'
      * - **WAYBACK_SNAP_URL**
        - 'https://web.archive.org/web/{timestamp}/{url}'


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.Ercot.ambiguous_based_on_dstflag
      gridstatus.Ercot.get_3_day_highest_price_sced
      gridstatus.Ercot.get_60_day_dam_disclosure
      gridstatus.Ercot.get_60_day_sced_disclosure
      gridstatus.Ercot.get_as_demand_curves_daily_ruc
      gridstatus.Ercot.get_as_demand_curves_dam_and_sced
      gridstatus.Ercot.get_as_demand_curves_hourly_ruc
      gridstatus.Ercot.get_as_demand_curves_weekly_ruc
      gridstatus.Ercot.get_as_deployment_factors_daily_ruc
      gridstatus.Ercot.get_as_deployment_factors_hourly_ruc
      gridstatus.Ercot.get_as_deployment_factors_projected
      gridstatus.Ercot.get_as_deployment_factors_weekly_ruc
      gridstatus.Ercot.get_as_monitor
      gridstatus.Ercot.get_as_plan
      gridstatus.Ercot.get_as_prices
      gridstatus.Ercot.get_as_reports
      gridstatus.Ercot.get_as_reports_dam
      gridstatus.Ercot.get_as_reports_sced
      gridstatus.Ercot.get_as_total_capability
      gridstatus.Ercot.get_available_seasonal_capacity_forecast
      gridstatus.Ercot.get_capacity_committed
      gridstatus.Ercot.get_capacity_forecast
      gridstatus.Ercot.get_ccp_resource_names
      gridstatus.Ercot.get_cop_adjustment_period_snapshot_60_day
      gridstatus.Ercot.get_dam_asdc_aggregated
      gridstatus.Ercot.get_dam_price_corrections
      gridstatus.Ercot.get_dam_spp
      gridstatus.Ercot.get_dam_system_lambda
      gridstatus.Ercot.get_dam_total_as_sold
      gridstatus.Ercot.get_dam_total_energy_purchased
      gridstatus.Ercot.get_dam_total_energy_sold
      gridstatus.Ercot.get_energy_storage_resources
      gridstatus.Ercot.get_fuel_mix
      gridstatus.Ercot.get_fuel_mix_detailed
      gridstatus.Ercot.get_highest_price_as_offer_selected
      gridstatus.Ercot.get_highest_price_as_offer_selected_dam
      gridstatus.Ercot.get_highest_price_as_offer_selected_sced
      gridstatus.Ercot.get_hourly_load_post_settlements
      gridstatus.Ercot.get_hourly_resource_outage_capacity
      gridstatus.Ercot.get_hub_name_dc_ties
      gridstatus.Ercot.get_indicative_lmp_by_settlement_point
      gridstatus.Ercot.get_indicative_mcpc_rtd
      gridstatus.Ercot.get_interconnection_queue
      gridstatus.Ercot.get_lmp
      gridstatus.Ercot.get_lmp_by_bus_dam
      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_load_forecast_by_model
      gridstatus.Ercot.get_mcpc_dam
      gridstatus.Ercot.get_mcpc_dam_price_corrections
      gridstatus.Ercot.get_mcpc_real_time_15_min
      gridstatus.Ercot.get_mcpc_sced
      gridstatus.Ercot.get_noie_mapping
      gridstatus.Ercot.get_operations_messages
      gridstatus.Ercot.get_raw_interconnection_queue
      gridstatus.Ercot.get_real_time_adders
      gridstatus.Ercot.get_real_time_adders_and_reserves
      gridstatus.Ercot.get_real_time_system_conditions
      gridstatus.Ercot.get_reported_outages
      gridstatus.Ercot.get_resource_node_to_unit
      gridstatus.Ercot.get_rtm_price_corrections
      gridstatus.Ercot.get_rtm_spp
      gridstatus.Ercot.get_sara
      gridstatus.Ercot.get_sced_system_lambda
      gridstatus.Ercot.get_settlement_points_electrical_bus_mapping
      gridstatus.Ercot.get_shadow_prices_dam
      gridstatus.Ercot.get_short_term_system_adequacy
      gridstatus.Ercot.get_solar_actual_and_forecast_by_geographical_region_hourly
      gridstatus.Ercot.get_solar_actual_and_forecast_hourly
      gridstatus.Ercot.get_spp
      gridstatus.Ercot.get_status
      gridstatus.Ercot.get_system_as_capacity_monitor
      gridstatus.Ercot.get_system_wide_actual_load
      gridstatus.Ercot.get_temperature_forecast_by_weather_zone
      gridstatus.Ercot.get_unplanned_resource_outages
      gridstatus.Ercot.get_wind_actual_and_forecast_by_geographical_region_hourly
      gridstatus.Ercot.get_wind_actual_and_forecast_hourly
      gridstatus.Ercot.parse_doc
      gridstatus.Ercot.read_doc
      gridstatus.Ercot.read_docs

   .. py:method:: ambiguous_based_on_dstflag(df: pandas.DataFrame) -> pandas.Series

   .. py:method:: get_3_day_highest_price_sced(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 the bid price and name of the Load Resource submitting the
      highest-priced bid selected or dispatched by SCED for the given
      operating day.

      Published daily, three days after the applicable operating day.

      https://www.ercot.com/mp/data-products/data-product-details?id=np3-257-ex

      :param date: operating day to fetch data for.
      :param end: optional end operating day for date range queries.
      :param verbose: print verbose output.

      :returns: Interval Start, Interval End,
                SCED Timestamp, QSE, DME, Load Resource,
                Highest Price Dispatched by SCED, Proxy Extension.
      :rtype: pandas.DataFrame with columns


   .. py:method:: get_60_day_dam_disclosure(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, process: bool = False, verbose: bool = False, output_format: gridstatus.ercot_60d_utils.CurveOutputFormat | str = CurveOutputFormat.LIST) -> dict

      Get 60 day DAM Disclosure data. Returns a dict with keys

      - "dam_gen_resource"
      - "dam_gen_resource_as_offers"
      - "dam_load_resource"
      - "dam_load_resource_as_offers"
      - "dam_energy_only_offer_awards"
      - "dam_energy_only_offers"
      - "dam_ptp_obligation_bid_awards"
      - "dam_ptp_obligation_bids"
      - "dam_energy_bid_awards"
      - "dam_energy_bids"
      - "dam_ptp_obligation_option"
      - "dam_ptp_obligation_option_awards"
      - "dam_esr" (when available, starting 2025-12-06)
      - "dam_esr_as_offers" (when available, starting 2025-12-06)

      and values as pandas.DataFrame objects

      The date passed in should be the report date. Since reports are delayed by 60
      days, the passed date should not be fewer than 60 days in the past.

      :param output_format: CurveOutputFormat.LIST (default) returns Python
                            list-of-lists per curve cell. CurveOutputFormat.PG_ARRAY_AS_STRING returns
                            PG array strings, using ~3x less peak memory.


   .. py:method:: get_60_day_sced_disclosure(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, process: bool = False, verbose: bool = False, output_format: gridstatus.ercot_60d_utils.CurveOutputFormat | str = CurveOutputFormat.LIST) -> dict

      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
      :param output_format: CurveOutputFormat.LIST (default) returns Python
                            list-of-lists per curve cell. CurveOutputFormat.PG_ARRAY_AS_STRING returns
                            PG array strings, using ~3x less peak memory.

      :returns:

                dictionary with keys "sced_load_resource", "sced_gen_resource",
                    "sced_smne", and (when available) "sced_esr", "sced_eoc_updates",
                    "sced_resource_as_offers", mapping to pandas.DataFrame objects
      :rtype: dict


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

      Get Daily RUC Ancillary Service Demand Curves


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

      Get Ancillary Service Demand Curves


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

      Get Hourly RUC Ancillary Service Demand Curves


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

      Get Weekly RUC Ancillary Service Demand Curves


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

      Get Daily RUC Ancillary Service Deployment Factors


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

      Get Hourly RUC Ancillary Service Deployment Factors


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

      Get Projected Ancillary Service Deployment Factors


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

      Get Weekly RUC Ancillary Service Deployment Factors

      Retrieves ancillary service deployment factors used by the Weekly
      Reliability Unit Commitment (WRUC) process for each hour in the RUC
      Study Period.

      :param date: Date to retrieve data for. Can be a string or pandas Timestamp.
      :param end: Optional end date for date range queries.
      :param verbose: If True, print verbose output.

      :returns: Interval Start, Interval End, RUC Timestamp,
                AS Type, and AS Deployment Factors.
      :rtype: DataFrame with columns


   .. py:method:: get_as_monitor(date: str = 'latest', verbose: bool = False) -> pandas.DataFrame

      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_plan(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

      Ancillary Service requirements by type and quantity for each hour of the
      current day plus the next 6 days

      :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 ECRS, NSPIN, REGDN, REGUP, RRS
      :rtype: pandas.DataFrame


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

      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: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], verbose: bool = False) -> pandas.DataFrame

      Get Ancillary Services Reports.

      Published with a 2 day delay around 3am central


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

      Get Day-Ahead Market Ancillary Services Reports.

      Published with a 2 day delay around 3am central.

      Contains cleared, self-arranged, and bid curve data for each AS product.

      :param date: date to fetch reports for
      :param verbose: print verbose output

      :returns: A DataFrame with DAM ancillary services reports
      :rtype: pandas.DataFrame


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

      Get 2-Day SCED Ancillary Service Disclosure Reports.

      Published with a 2 day delay around 3am central.

      Contains offer curves (MW offered and price) for each AS product
      at each SCED timestamp.

      Output columns: SCED Timestamp, AS Type, Offer Curve

      :param date: date to fetch reports for
      :param verbose: print verbose output

      :returns: A DataFrame with SCED ancillary services offers
      :rtype: pandas.DataFrame


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

      Get Total Capability of Resources Available to Provide Ancillary Service


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

      Retrieves the forecasted demand (Load Forecast) and the forecasted available
      seasonal capacity (Available Capacity) for the next 6 days.

      Data is ephemeral and does not support past days.


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

      Retrieves the actual committed capacity (the amount of power available from
      generating units that were on-line or providing operating reserves).

      Data is ephemeral and does not support past days.


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

      Retrieves the forecasted committed capacity (Committed Capacity) and the
      forecasted available capacity (Available Capacity) for the current day.

      Data is ephemeral and does not support past days.


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

   .. py:method:: get_cop_adjustment_period_snapshot_60_day(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_dam_asdc_aggregated(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Get DAM Aggregated Ancillary Service Offer Curve (NP4-19-CD).

      The DAM Aggregated Ancillary Service Demand/Offer Curve contains the
      aggregated offer curve (price/quantity pairs) per ancillary service
      type for each hour of the next day's delivery, published once per DAM
      run. ``date`` and ``end`` are interpreted as delivery dates; the DAM
      runs the day before, so the underlying file is located by shifting the
      posted-date filter back by one day.

      https://www.ercot.com/mp/data-products/data-product-details?id=np4-19-cd


   .. py:method:: get_dam_price_corrections(dam_type: str, verbose: bool = False) -> pandas.DataFrame

      Get DAM Price Corrections

      :param dam_type: 'DAM_SPP', 'DAM_EBLMP'
      :type dam_type: str


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

      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_dam_system_lambda(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 Market System Lambda

      File is typically published around 12:30 pm for the day ahead

      https://www.ercot.com/mp/data-products/data-product-details?id=NP4-523-CD

      :param date: date to get data for
      :type date: str, datetime
      :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 with day-ahead market system lambda data
      :rtype: pandas.DataFrame


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

      Get DAM Total Ancillary Services Sold


   .. py:method:: get_dam_total_energy_purchased(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 DAM Total Energy Purchased

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

      :returns: A DataFrame with DAM total energy purchased data
      :rtype: pandas.DataFrame


   .. py:method:: get_dam_total_energy_sold(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 DAM Total Energy Sold

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

      :returns: A DataFrame with DAM total energy sold data
      :rtype: pandas.DataFrame


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

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


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

      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_fuel_mix_detailed(date: str | datetime.datetime | pandas.Timestamp, verbose: bool = False) -> pandas.DataFrame

      The fuel mix with gen, hsl, and seasonal capacity for each fuel type.


   .. py:method:: get_highest_price_as_offer_selected(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 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_highest_price_as_offer_selected_dam(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 the offer price and the name of the Entity submitting
      the offer for the highest-priced Ancillary Service (AS) Offer
      selected in the Day-Ahead Market (DAM).

      Published with 3 day delay

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

      :returns:

                A DataFrame with columns:
                    - Interval Start
                    - Interval End
                    - QSE
                    - DME
                    - Resource Name
                    - AS Type
                    - Block Indicator
                    - Offered Price
                    - Total Offered Quantity
                    - Offered Quantities
      :rtype: pandas.DataFrame


   .. py:method:: get_highest_price_as_offer_selected_sced(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 the offer price and the name of the Entity submitting
      the offer for the highest-priced Ancillary Service (AS) Offer
      selected in the Real-Time Market (SCED).

      Published with 3 day delay

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

      :returns:

                A DataFrame with columns:
                    - SCED Timestamp
                    - QSE
                    - DME
                    - Resource Name
                    - AS Type
                    - Offered Price
                    - Total Offered Quantity
                    - Offered Quantities
      :rtype: pandas.DataFrame


   .. py:method:: get_hourly_load_post_settlements(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 historical hourly load data from ERCOT's load archives.

      Downloads zip files from https://www.ercot.com/gridinfo/load/load_hist
      and parses the historical load data by weather zones.

      :param date: Year to download data for, or "latest" for most recent data
      :type date: str, datetime
      :param end: End date for range, or None for single date
      :type end: str, datetime
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: pandas.DataFrame


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

      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, pd.Timestamp
      :param end: end time to download. Defaults to None.
      :type end: str, pd.Timestamp, 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_hub_name_dc_ties(date: str | pandas.Timestamp | None = None, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

   .. py:method:: get_indicative_lmp_by_settlement_point(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_indicative_mcpc_rtd(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Get RTD Indicative Real-Time Market Clearing Prices for Capacity


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

      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: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, location_type: str = SETTLEMENT_POINT_LOCATION_TYPE, verbose: bool = False) -> pandas.DataFrame

      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. Defaults to "settlement point"



   .. py:method:: get_lmp_by_bus_dam(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 Market (DAM) LMPs by Electrical Bus

      Returns hourly Locational Marginal Prices per electrical bus from the
      Day-Ahead Market.

      https://www.ercot.com/mp/data-products/data-product-details?id=NP4-183-CD

      :param date: date to get data for. Supports "latest",
                   "today", or a specific date.
      :type date: str, datetime
      :param end: end date for a date range query.
                  If None, returns 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 with day-ahead LMPs by electrical bus
      :rtype: pandas.DataFrame


   .. py:method:: get_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 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: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], verbose: bool = False) -> pandas.DataFrame

      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: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], verbose: bool = False) -> pandas.DataFrame

      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: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, forecast_type: ERCOTSevenDayLoadForecastReport = ERCOTSevenDayLoadForecastReport.BY_FORECAST_ZONE, verbose: bool = False) -> pandas.DataFrame

      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_load_forecast_by_model(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 Seven-Day Load Forecast by Model and Weather Zone.

      Forecasted hourly demand by Model and Weather Zone as reported by ERCOT.
      Released every hour for the current day and the next 7.

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

      :returns: A DataFrame with load forecast by model data
      :rtype: pandas.DataFrame

      Source:
          https://www.ercot.com/mp/data-products/data-product-details?id=NP3-565-CD


   .. py:method:: get_mcpc_dam(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 Prices for Capacity (MCPC) from the Day-Ahead Market

      Returns hourly MCPC per ancillary service type in long format.

      https://www.ercot.com/mp/data-products/data-product-details?id=NP4-188-CD

      :param date: date to get data for. Supports "latest",
                   "today", or a specific date.
      :type date: str, datetime
      :param end: end date for a date range query.
                  If None, returns 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 with columns: Interval Start,
                    Interval End, AS Type, MCPC
      :rtype: pandas.DataFrame


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

      Get Market Clearing Price for Capacity (MCPC) corrections for DAM.

      MCPC (Market Clearing Price for Capacity) corrections contain
      ancillary service prices at the system level.

      :returns:

                DataFrame with columns:
                    - Price Correction Time
                    - Interval Start
                    - Interval End
                    - AS Type
                    - MCPC Original
                    - MCPC Corrected
      :rtype: pd.DataFrame


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

      Get Market Clearing Prices for Capacity by 15-minute interval


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

      Get Market Clearing Prices for Capacity by SCED interval


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

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

      Get operations messages from the ERCOT control room.

      When called without date arguments, scrapes the live page at
      https://www.ercot.com/services/comm/mkt_notices/opsmessages
      which shows a rolling window of recent messages (~one month).

      When called with a date (and optional end), fetches historical
      snapshots from the Wayback Machine covering the requested range,
      deduplicates, and filters to the requested window.

      :param date: Start date for historical query, or None for latest.
      :param end: End date for historical query. Defaults to date + 1 month.
      :param verbose: Print verbose output.

      :returns: pandas.DataFrame with columns Time, Notice, Type, Status.


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

   .. py:method:: get_real_time_adders(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 ORDC and Reliability Deployment
      Price Adders and Reserves by SCED Interval produced by SCED every five minutes.

      :param date: date to get data for
      :param end: end date to get data for. If None, defaults to date + 1 day
      :param verbose: print verbose output. Defaults to False.

      :returns: A DataFrame with ORDC price adders data
      :rtype: pandas.DataFrame


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

      Get Real-Time ORDC and Reliability Deployment Price Adders and
          Reserves by SCED Interval

      At: https://www.ercot.com/mp/data-products/data-product-details?id=NP6-323-CD

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

      :returns: A DataFrame with ORDC data
      :rtype: pandas.DataFrame

      NOTE: data only goes back 5 days


   .. py:method:: get_real_time_system_conditions(date: str = 'latest', verbose: bool = False) -> pandas.DataFrame

      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_reported_outages(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, verbose: bool = False) -> pandas.DataFrame

      Retrieves the 5-minute data behind this dashboard:
      https://www.ercot.com/gridmktinfo/dashboards/generationoutages

      Data available at
      https://www.ercot.com/api/1/services/read/dashboards/generation-outages.json

      This data is ephemeral in that there is only one file available that is
      constantly updated. There is no historical data.


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

   .. py:method:: get_rtm_price_corrections(rtm_type: str, verbose: bool = False) -> pandas.DataFrame

      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: int, verbose: bool = False) -> pandas.DataFrame

      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: str = 'https://www.ercot.com/files/docs/2023/05/05/SARA_Summer2023_Revised.xlsx', verbose: bool = False) -> pandas.DataFrame

      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: 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 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_settlement_points_electrical_bus_mapping(date: str | pandas.Timestamp | None = None, end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

   .. py:method:: get_shadow_prices_dam(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 Market Shadow Prices

      Returns shadow prices for binding transmission constraints from the
      Day-Ahead Market.

      https://www.ercot.com/mp/data-products/data-product-details?id=NP4-191-CD

      :param date: date to get data for. Supports "latest",
                   "today", or a specific date.
      :type date: str, datetime
      :param end: end date for a date range query.
                  If None, returns 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 with day-ahead market shadow prices
      :rtype: pandas.DataFrame


   .. py:method:: get_short_term_system_adequacy(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 Short Term System Adequacy published between date and end.

      :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 system adequacy data
      :rtype: pandas.DataFrame


   .. py:method:: get_solar_actual_and_forecast_by_geographical_region_hourly(date: str | datetime.date, end: str | datetime.date = None, verbose: bool = False)

      Get Hourly Solar Report by geographical region

      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_solar_actual_and_forecast_hourly(date: str | datetime.date, end: str | datetime.date = None, verbose: bool = False)

      Get Hourly Solar Report.

      :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_spp(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, market: str = None, locations: list = 'ALL', location_type: str = 'ALL', verbose: bool = False) -> pandas.DataFrame

      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: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], verbose: bool = False) -> pandas.DataFrame

      Returns status of grid


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

      Get System Ancillary Service Capacity Monitor.

      Fetches real-time ancillary service capacity data from
      https://www.ercot.com/api/1/services/read/dashboards/ancillary-service-capacity-monitor.json

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

      :returns: A DataFrame with system AS capacity monitor data
      :rtype: pandas.DataFrame


   .. py:method:: get_system_wide_actual_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 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_temperature_forecast_by_weather_zone(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 temperature forecast by weather zone in hourly intervals. Published
      once a day at 5 am central.

      :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 temperature forecast data
      :rtype: pandas.DataFrame


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

      Get Unplanned Resource Outages.

      Data published at ~5am central on the 3rd day after the day of interest. Since
      the date argument is the publish date, if you want to get data for a specific
      date, pass in the date of interest - 3 days.

      :param date: publish date of the report
      :type date: str, datetime
      :param end: end date to download. Defaults to None.
      :type end: str, datetime, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

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


   .. py:method:: get_wind_actual_and_forecast_by_geographical_region_hourly(date: str | datetime.date, end: str | datetime.date = None, verbose: bool = False)

      Get Hourly Wind Report by geographical region

      :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_wind_actual_and_forecast_hourly(date: str | datetime.date, end: str | datetime.date = None, verbose: bool = 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:: parse_doc(doc: pandas.DataFrame, dst_ambiguous_default: str = 'infer', verbose: bool = False, nonexistent: str = 'raise') -> pandas.DataFrame

   .. py:method:: read_doc(doc: Document, parse: bool = True, verbose: bool = False, request_kwargs: dict | None = None, read_csv_kwargs: dict | None = None) -> pandas.DataFrame

   .. py:method:: read_docs(docs: list[Document], parse: bool = True, empty_df: pandas.DataFrame | None = None, verbose: bool = False, request_kwargs: dict | None = None) -> pandas.DataFrame


.. py:function:: get_iso(iso_id: str) -> gridstatus.base.ISOBase

   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_forecast_surplus_baseload_generation
      gridstatus.IESO.get_fuel_mix
      gridstatus.IESO.get_generator_report_hourly
      gridstatus.IESO.get_hoep_historical_hourly
      gridstatus.IESO.get_hoep_real_time_hourly
      gridstatus.IESO.get_in_service_transmission_limits
      gridstatus.IESO.get_intertie_actual_schedule_flow_hourly
      gridstatus.IESO.get_intertie_flow_5_min
      gridstatus.IESO.get_intertie_limits_day_ahead_hourly
      gridstatus.IESO.get_intertie_limits_real_time_5_min
      gridstatus.IESO.get_lmp_day_ahead_hourly
      gridstatus.IESO.get_lmp_day_ahead_hourly_intertie
      gridstatus.IESO.get_lmp_day_ahead_hourly_ontario_zonal
      gridstatus.IESO.get_lmp_day_ahead_hourly_virtual_zonal
      gridstatus.IESO.get_lmp_day_ahead_operating_reserves
      gridstatus.IESO.get_lmp_predispatch_hourly
      gridstatus.IESO.get_lmp_predispatch_hourly_intertie
      gridstatus.IESO.get_lmp_predispatch_hourly_ontario_zonal
      gridstatus.IESO.get_lmp_predispatch_hourly_virtual_zonal
      gridstatus.IESO.get_lmp_real_time_5_min
      gridstatus.IESO.get_lmp_real_time_5_min_intertie
      gridstatus.IESO.get_lmp_real_time_5_min_ontario_zonal
      gridstatus.IESO.get_lmp_real_time_5_min_virtual_zonal
      gridstatus.IESO.get_lmp_real_time_operating_reserves
      gridstatus.IESO.get_load
      gridstatus.IESO.get_load_forecast
      gridstatus.IESO.get_load_zonal_5_min
      gridstatus.IESO.get_load_zonal_hourly
      gridstatus.IESO.get_mcp_historical_5_min
      gridstatus.IESO.get_mcp_real_time_5_min
      gridstatus.IESO.get_outage_transmission_limits
      gridstatus.IESO.get_real_time_totals
      gridstatus.IESO.get_resource_adequacy_report
      gridstatus.IESO.get_resource_adequacy_report_by_last_modified
      gridstatus.IESO.get_shadow_prices_day_ahead_hourly
      gridstatus.IESO.get_shadow_prices_real_time_5_min
      gridstatus.IESO.get_solar_embedded_forecast
      gridstatus.IESO.get_solar_market_participant_forecast
      gridstatus.IESO.get_transmission_outages_planned
      gridstatus.IESO.get_wind_embedded_forecast
      gridstatus.IESO.get_wind_market_participant_forecast
      gridstatus.IESO.get_yearly_intertie_actual_schedule_flow_hourly
      gridstatus.IESO.get_zonal_load_forecast

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

      Get forecast surplus baseload generation.

      :param date: The publish date to get data for. The forecast will be for the day after this date.
      :param end: The end date to get data for. If None, only get data for the start date.
      :param verbose: Whether to print verbose output.

      :returns:     - Interval Start: The start of the interval
                    - Interval End: The end of the interval
                    - Publish Time: The time the forecast was published
                    - Surplus Baseload MW: The forecast surplus baseload generation in MW
                    - Surplus State: The state of the surplus baseload generation
                    - Action: The action taken for the surplus baseload generation
                    - Export Forecast MW: The forecast export in MW
                    - Minimum Generation Status: The minimum generation status
      :rtype: DataFrame with columns


   .. py:method:: get_fuel_mix(date: str | datetime.date | datetime.datetime, end: datetime.date | datetime.datetime | None = None, verbose: bool = 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: str | datetime.date | datetime.datetime, end: datetime.date | datetime.datetime | None = None, verbose: bool = 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_hoep_historical_hourly(date: str | datetime.date | datetime.datetime, end: datetime.date | datetime.datetime | None = None, verbose: bool = False)

   .. py:method:: get_hoep_real_time_hourly(date: str | datetime.date | datetime.datetime, end: datetime.date | datetime.datetime | None = None, verbose: bool = False) -> pandas.DataFrame

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

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

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

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

      Get day-ahead intertie scheduling limits.

      This returns hourly data showing import and export limits for each
      of Ontario's intertie zones used in the day-ahead market.

      :param date: Date or date range to get data for, or "latest"
      :param end: End date for date range (optional)
      :param verbose: Whether to print verbose output

      :returns: DataFrame with columns for interval start/end and import/export
                limits for each intertie zone


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

      Get real-time intertie scheduling limits.

      This returns 5-minute interval data showing import and export limits
      for each of Ontario's intertie zones.

      :param date: Date or date range to get data for, or "latest"
      :param end: End date for date range (optional)
      :param verbose: Whether to print verbose output

      :returns: DataFrame with columns for interval start/end and import/export
                limits for each intertie zone


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

      Get day-ahead LMP data.
      :param date: The date to get the data for.
      :param end: The end date to get the data for.
      :param verbose: Whether to print verbose output.

      :returns: DataFrame with LMP data.


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

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

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

      Get day-ahead zonal virtual LMP data.
      :param date: The date to get the data for.
      :param end: The end date to get the data for.
      :param verbose: Whether to print verbose output.

      :returns: DataFrame with LMP data.


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

      Get day-ahead operating reserves LMP data.

      :param date: The date to get the data for.
      :param end: The end date to get the data for.
      :param verbose: Whether to print verbose output.

      :returns: DataFrame with operating reserves LMP data.


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

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

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

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

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

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

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

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

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

   .. py:method:: get_load(date: str | datetime.date | datetime.datetime, end: datetime.date | datetime.datetime | None = None, verbose: bool = 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: str, verbose: bool = 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_load_zonal_5_min(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

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

   .. py:method:: get_mcp_historical_5_min(date: str | datetime.date | datetime.datetime, end: datetime.date | datetime.datetime | None = None, verbose: bool = False)

   .. py:method:: get_mcp_real_time_5_min()

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

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

   .. py:method:: get_resource_adequacy_report(date: str | datetime.date | datetime.datetime, end: datetime.date | datetime.datetime | None = None, vintage: Literal['all', 'latest'] = 'latest', last_modified: str | datetime.date | datetime.datetime | None = None) -> pandas.DataFrame

      Retrieve and parse the Resource Adequacy Report for a given date.

      :param date: The date for which to get the report
      :type date: str | datetime.date | datetime.datetime
      :param end: The end date for the range of reports to get
      :type end: datetime.date | datetime.datetime | None
      :param vintage: The version of the report to get
      :type vintage: Literal["all", "latest"]
      :param last_modified: The last modified time after which to get report(s)
      :type last_modified: str | datetime.date | datetime.datetime | None

      :returns: The Resource Adequacy Report df for the given date
      :rtype: pd.DataFrame


   .. py:method:: get_resource_adequacy_report_by_last_modified(last_modified: str | datetime.date | datetime.datetime) -> pandas.DataFrame

      Retrieve and parse Resource Adequacy Reports modified after last_modified time.
      This method bypasses date iteration and gets all files across all dates.
      This is useful for ETL systems that want to get all new files at once.

      :param last_modified: The last modified time after which to get report(s)
      :param vintage: The version of the report to get

      :returns: The Resource Adequacy Report df with all files modified after last_modified
      :rtype: pd.DataFrame


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

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

   .. py:method:: get_solar_embedded_forecast(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: pandas.Timestamp | None = None, vintage: Literal['latest', 'all'] = 'latest', verbose: bool = False) -> pandas.DataFrame

   .. py:method:: get_solar_market_participant_forecast(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: pandas.Timestamp | None = None, vintage: Literal['latest', 'all'] = 'latest', verbose: bool = False) -> pandas.DataFrame

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

   .. py:method:: get_wind_embedded_forecast(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: pandas.Timestamp | None = None, vintage: Literal['latest', 'all'] = 'latest', verbose: bool = False) -> pandas.DataFrame

   .. py:method:: get_wind_market_participant_forecast(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: pandas.Timestamp | None = None, vintage: Literal['latest', 'all'] = 'latest', verbose: bool = False) -> pandas.DataFrame

   .. py:method:: get_yearly_intertie_actual_schedule_flow_hourly(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: pandas.Timestamp | None = None, verbose: bool = False, vintage: Literal['all', 'latest'] = 'latest', last_modified: str | datetime.date | datetime.datetime | None = None) -> pandas.DataFrame

      Get yearly intertie actual schedule flow hourly. Since this is a yearly file
      it is updated less frequency than the daily files. These can be retrieved via
      the get_intertie_schedule_flow_hourly method.
      :param date: The date to get the data for.
      :param end: The end date to get the data for.
      :param verbose: Whether to print verbose output.
      :param vintage: Whether to get the latest version or all versions of the report.
      :param last_modified: Only return reports modified after this date.

      :returns: DataFrame with hourly intertie schedule flow data.


   .. py:method:: get_zonal_load_forecast(date: str | datetime.date | tuple[datetime.date, datetime.date], end: datetime.date | datetime.datetime | None = None, verbose: bool = 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'
      * - **lmp_real_time_intervals**
        - ['00-04', '04-08', '08-12', '12-16', '16-20', '20-24']
      * - **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_reserve_zone_prices_designations_real_time_5_min_final
      gridstatus.ISONE.get_solar_forecast
      gridstatus.ISONE.get_status
      gridstatus.ISONE.get_wind_forecast

   .. 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_reserve_zone_prices_designations_real_time_5_min_final(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | None = None, verbose: bool = False)

      Return final five-minute reserve zone requirements, prices, and designations

      Published and sometimes updated in the days following the operating day.

      :param date: Date to query. Supports "latest" and "today"
      :param end: End date for date range queries
      :param verbose: Enable verbose logging

      :returns: Interval Start, Interval End, Reserve Zone ID,
                Reserve Zone Name, Ten Min Spin Requirement, Ten Min Requirement,
                Total Requirement, TMSR Designated MW, TMNSR Designated MW,
                TMOR Designated MW, TMSR Clearing Price, TMR Clearing Price,
                Total Reserve Clearing Price
      :rtype: DataFrame with columns


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

      Return solar forecast published on a specific date

      Forecast is published for 7 days and generated daily by 10 am.
      https://www.iso-ne.com/isoexpress/web/reports/operations/-/tree/seven-day-solar-power-forecast


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

      Get latest status for ISO NE


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

      Return wind forecast published on a specific date

      Forecast is published for 7 days and generated daily by 10 am.
      https://www.iso-ne.com/isoexpress/web/reports/operations/-/tree/seven-day-wind-power-forecast



.. py:function:: list_isos() -> pandas.DataFrame

   List available ISOs


.. py:function:: load_folder(path: str, time_zone: str | None = None, verbose: bool = True) -> pandas.DataFrame

   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.StrEnum`

   Names of LMP Markets

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


   **Attributes**

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

      * - **DAY_AHEAD_HOURLY**
        - 'DAY_AHEAD_HOURLY'
      * - **DAY_AHEAD_HOURLY_EX_ANTE**
        - 'DAY_AHEAD_HOURLY_EX_ANTE'
      * - **DAY_AHEAD_HOURLY_EX_POST**
        - 'DAY_AHEAD_HOURLY_EX_POST'
      * - **REAL_TIME_15_MIN**
        - 'REAL_TIME_15_MIN'
      * - **REAL_TIME_5_MIN**
        - 'REAL_TIME_5_MIN'
      * - **REAL_TIME_5_MIN_EX_ANTE**
        - 'REAL_TIME_5_MIN_EX_ANTE'
      * - **REAL_TIME_5_MIN_EX_POST_FINAL**
        - 'REAL_TIME_5_MIN_EX_POST_FINAL'
      * - **REAL_TIME_5_MIN_EX_POST_PRELIM**
        - 'REAL_TIME_5_MIN_EX_POST_PRELIM'
      * - **REAL_TIME_5_MIN_FINAL**
        - 'REAL_TIME_5_MIN_FINAL'
      * - **REAL_TIME_HOURLY**
        - 'REAL_TIME_HOURLY'
      * - **REAL_TIME_HOURLY_EX_POST_FINAL**
        - 'REAL_TIME_HOURLY_EX_POST_FINAL'
      * - **REAL_TIME_HOURLY_EX_POST_PRELIM**
        - 'REAL_TIME_HOURLY_EX_POST_PRELIM'
      * - **REAL_TIME_HOURLY_FINAL**
        - 'REAL_TIME_HOURLY_FINAL'
      * - **REAL_TIME_HOURLY_PRELIM**
        - 'REAL_TIME_HOURLY_PRELIM'
      * - **REAL_TIME_SCED**
        - 'REAL_TIME_SCED'


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.Markets.__contains__

   .. py:method:: __contains__(item)

      Return bool(key in self).



.. py:class:: MISO

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

   Midcontinent Independent System Operator (MISO)


   **Attributes**

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

      * - **default_timezone**
        - 'EST'
      * - **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'
      * - **solar_and_wind_forecast_cols**
        - ['Interval Start', 'Interval End', 'Publish Time', 'North', 'Central', 'South', 'MISO']
      * - **solar_and_wind_forecast_region_cols**
        - ['North', 'Central', 'South', 'MISO']


   **Methods**

   .. autoapisummary::
      :nosignatures:

      gridstatus.MISO.get_binding_constraint_overrides_real_time_5_min
      gridstatus.MISO.get_binding_constraints_day_ahead_hourly
      gridstatus.MISO.get_binding_constraints_day_ahead_yearly_historical
      gridstatus.MISO.get_binding_constraints_real_time_5_min
      gridstatus.MISO.get_binding_constraints_real_time_intraday
      gridstatus.MISO.get_binding_constraints_real_time_yearly_historical
      gridstatus.MISO.get_binding_constraints_supplemental
      gridstatus.MISO.get_fuel_mix
      gridstatus.MISO.get_generation_outages_estimated
      gridstatus.MISO.get_generation_outages_forecast
      gridstatus.MISO.get_historical_zonal_load_hourly
      gridstatus.MISO.get_interchange_5_min
      gridstatus.MISO.get_interconnection_queue
      gridstatus.MISO.get_lmp
      gridstatus.MISO.get_lmp_real_time_5_min_final
      gridstatus.MISO.get_load
      gridstatus.MISO.get_load_forecast
      gridstatus.MISO.get_look_ahead_hourly
      gridstatus.MISO.get_multiday_operating_margin
      gridstatus.MISO.get_multiday_operating_margin_regional
      gridstatus.MISO.get_raw_interconnection_queue
      gridstatus.MISO.get_reserve_product_binding_constraints_day_ahead_hourly
      gridstatus.MISO.get_reserve_product_binding_constraints_real_time_5_min
      gridstatus.MISO.get_solar_forecast
      gridstatus.MISO.get_subregional_power_balance_constraints_day_ahead_hourly
      gridstatus.MISO.get_subregional_power_balance_constraints_real_time_5_min
      gridstatus.MISO.get_wind_forecast
      gridstatus.MISO.get_zonal_load_hourly

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

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

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

      Get the day-ahead binding constraints data from MISO for a given year.

      :param year: Year
      :type year: int
      :param verbose: Verbosity. Defaults to False.
      :type verbose: bool, optional

      :returns: Historical day-ahead binding constraints data
      :rtype: pandas.DataFrame


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

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

      Get real-time binding constraints data from MISO's intraday API.

      This provides active real-time constraint data updated every 5 minutes.
      Only supports "latest" data.

      :param date: Must be "latest".
      :param end: Not used.
      :param verbose: If True, prints additional information during data retrieval.

      :returns: DataFrame with real-time binding constraint data.


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

      Get the real-time binding constraints data from MISO for a given year.

      :param year: Year
      :type year: int
      :param verbose: Verbosity. Defaults to False.
      :type verbose: bool, optional

      :returns: Historical real-time binding constraints data
      :rtype: pandas.DataFrame


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

      Get the supplemental binding constraints data from MISO.

      Source URL: https://www.misoenergy.org/markets-and-operations/real-time--market-data/market-reports/#nt=%2FMarketReportType%3ADay-Ahead%2FMarketReportName%3ABinding Constraints Supplemental (xls)&t=10&p=0&s=MarketReportPublished&sd=desc

      :param date: Start date
      :type date: str | pd.Timestamp
      :param end: End date. Defaults to None.
      :type end: str | pd.Timestamp, optional
      :param verbose: Verbosity. Defaults to False.
      :type verbose: bool, optional

      :returns: Supplemental binding constraints data
      :rtype: pandas.DataFrame


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

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

      :param date: "latest", "today", "yesterday", 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_generation_outages_estimated(date: str | pandas.Timestamp, end: str | pandas.Timestamp = None, verbose: bool = False) -> pandas.DataFrame

      Get the estimated generation outages published on the date for the past 30
      days. NOTE: since these are estimates, they change with each file published.


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

      Get the forecasted generation outages published on the date for the next
      seven days.


   .. py:method:: get_historical_zonal_load_hourly(year: int) -> pandas.DataFrame

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

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

      Get the interconnection queue

      :returns: Interconnection queue
      :rtype: pandas.DataFrame


   .. py:method:: get_lmp(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, market: str = Markets.REAL_TIME_5_MIN, locations: list = 'ALL', verbose: bool = False) -> pandas.DataFrame

      Supported Markets:
          - ``REAL_TIME_5_MIN`` - (Prelim ExPost 5 Minute)
          - ``DAY_AHEAD_HOURLY`` - (ExPost Day Ahead Hourly)
          - ``REAL_TIME_HOURLY_FINAL`` - (Final ExPost Real Time Hourly)
          - ``REAL_TIME_HOURLY_PRELIM`` - (Prelim ExPost Real Time Hourly)
              Only 4 days of data available, with the most recent being yesterday.


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

      Retrieves real time final lmp data that includes price corrections to the
      preliminary real time data.

      Data from: https://www.misoenergy.org/markets-and-operations/real-time--market-data/market-reports/#nt=%2FMarketReportType%3AHistorical%20LMP%2FMarketReportName%3AWeekly%20Real-Time%205-Min%20LMP%20(zip)&t=10&p=0&s=MarketReportPublished&sd=desc


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

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

      https://docs.misoenergy.org/marketreports/YYYYMMDD_df_al.xls


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

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

      Get the multiday operating margin forecast.

      This data comes from the Multiday Operating Margin Forecast (MOMF) report
      published daily by MISO. The operating margin represents the difference
      between available resources and system obligations.

      :param date: The date to retrieve data for.
      :param end: Optional end date for a date range.
      :param verbose: If True, prints additional information during data retrieval.

      :returns: DataFrame with system-wide operating margin forecast data including
                committed/uncommitted resources, renewable forecasts, load projections,
                and operating margin calculations.


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

      Get the multiday operating margin forecast for all regions.

      This data comes from the Multiday Operating Margin Forecast (MOMF) report
      published daily by MISO. The operating margin represents the difference
      between available resources and system obligations for each region.

      :param date: The date to retrieve data for.
      :param end: Optional end date for a date range.
      :param verbose: If True, prints additional information during data retrieval.

      :returns: DataFrame with regional operating margin forecast data for all regions
                (NORTH, CENTRAL, NORTH+CENTRAL, SOUTH) including committed/uncommitted
                resources, renewable forecasts, load projections, and regional metrics.


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

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

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

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

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

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

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

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

      https://docs.misoenergy.org/marketreports/YYYYMMDD_df_al.xls



.. 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_as_prices_day_ahead_hourly
      gridstatus.NYISO.get_as_prices_real_time_5_min
      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_interface_limits_and_flows_5_min
      gridstatus.NYISO.get_lake_erie_circulation_day_ahead
      gridstatus.NYISO.get_lake_erie_circulation_real_time
      gridstatus.NYISO.get_limiting_constraints_day_ahead
      gridstatus.NYISO.get_limiting_constraints_real_time
      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
      gridstatus.NYISO.get_zonal_load_forecast

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

      Pull the most recent ancillary service 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


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

      Pull the most recent ancillary service 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


   .. py:method:: get_btm_solar(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 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 "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: 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_capacity_prices(date: pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      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

      :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: 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_generators(verbose: bool = False) -> pandas.DataFrame

      Get a list of generators in NYISO. When possible return capacity and fuel type information

      :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
                * 2024 CRIS MW Summer
                * 2024 CRIS MW Winter
                * 2024 Capability MW Summer
                * 2024 Capability MW Winter
                * Is Dual Fuel
                * Unit Type
                * Fuel Type 1
                * Fuel Type 2
                * 2023 Net Energy GWh
                * Notes
                * Generator Type
      :rtype: pandas.DataFrame


   .. py:method:: get_interconnection_queue() -> pandas.DataFrame

      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_interface_limits_and_flows_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 interface limits and flows for a date


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

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

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

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

   .. py:method:: get_lmp(date: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp], end: str | pandas.Timestamp | tuple[pandas.Timestamp, pandas.Timestamp] | None = None, market: gridstatus.base.Markets | None = None, locations: list | None = None, location_type: NYISOLocationType | None = None, verbose: bool = False) -> pandas.DataFrame

      Supported Markets:
          - ``REAL_TIME_5_MIN`` (RTC)
          - ``REAL_TIME_15_MIN`` (RTD)
          - ``REAL_TIME_HOURLY`` (Real-time hourly LMP)
          - ``DAY_AHEAD_HOURLY``

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

      NOTE: the generator data contains the single Reference Bus location type.

      REAL_TIME_5_MIN is the Real Time Dispatch (RTD) market.
      REAL_TIME_15_MIN is the Real Time Commitment (RTC) market.
      REAL_TIME_HOURLY is the real-time hourly LMP 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: 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 load at a previous date in 5 minute intervals for
        each zone and total load

      :param date: Date to get load for. Can be "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: 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 load forecast for a date in 1 hour intervals


   .. py:method:: get_loads() -> pandas.DataFrame

      Get a list of loads in NYISO

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


   .. py:method:: get_raw_interconnection_queue() -> BinaryIO

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

      Get zonal load forecast for a date in 1 hour intervals



.. py:class:: PJM(api_key: str | None = None, retries: int = DEFAULT_RETRIES)

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

   PJM

   :param api_key: PJM API key. Alternatively, can be set
                   in PJM_API_KEY environment variable. Register for an API key
                   at https://www.pjm.com/
   :type api_key: str, optional


   **Attributes**

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

      * - **api_key**
        - None
      * - **AS_MARKET_RESULTS_GRANULARITY_CHANGE_DATE**
        - '2022-09-01'
      * - **AS_MARKET_RESULTS_START_DATE**
        - '2013-06-14'
      * - **default_timezone**
        - 'US/Eastern'
      * - **FTR_OPTION_PATHS_MONTHLY_URL**
        - 'https://www.pjm.com/pjmfiles/pub/account/auction-user-info/downloads/option-paths.csv'
      * - **FTR_SOURCE_SINK_MONTHLY_NON_PROMPT_URL**
        - 'https://www.pjm.com/pjmfiles/pub/account/auction-user-info/downloads/ftr-source-sink-nonprompt.csv'
      * - **FTR_SOURCE_SINK_MONTHLY_PROMPT_URL**
        - 'https://www.pjm.com/pjmfiles/pub/account/auction-user-info/downloads/ftr-source-sink-prompt.csv'
      * - **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'
      * - **load_forecast_5_min_endpoint_name**
        - 'very_short_load_frcst'
      * - **load_forecast_endpoint_name**
        - 'load_frcstd_7_day'
      * - **load_forecast_historical_endpoint_name**
        - 'load_frcstd_hist'
      * - **locale_abbreviated_to_full**
        - None
      * - **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')
      * - **retries**
        - 3
      * - **service_type_abbreviated_to_full**
        - None
      * - **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_actual_and_scheduled_interchange_summary
      gridstatus.PJM.get_actual_operational_statistics
      gridstatus.PJM.get_area_control_error
      gridstatus.PJM.get_as_market_results_real_time_hourly
      gridstatus.PJM.get_cleared_virtuals_daily
      gridstatus.PJM.get_dam_as_market_results
      gridstatus.PJM.get_day_ahead_demand_bids
      gridstatus.PJM.get_dispatched_reserves_prelim
      gridstatus.PJM.get_dispatched_reserves_verified
      gridstatus.PJM.get_emergency_postings
      gridstatus.PJM.get_forecasted_generation_outages
      gridstatus.PJM.get_ftr_option_paths_monthly
      gridstatus.PJM.get_ftr_source_sink_monthly_non_prompt
      gridstatus.PJM.get_ftr_source_sink_monthly_prompt
      gridstatus.PJM.get_fuel_mix
      gridstatus.PJM.get_gen_outages_by_type
      gridstatus.PJM.get_generation_capacity_daily
      gridstatus.PJM.get_hourly_net_exports_by_state
      gridstatus.PJM.get_hourly_transfer_limits_and_flows
      gridstatus.PJM.get_inc_and_dec_bids_day_ahead_hourly
      gridstatus.PJM.get_instantaneous_dispatch_rates
      gridstatus.PJM.get_interconnection_queue
      gridstatus.PJM.get_interface_flows_and_limits_day_ahead
      gridstatus.PJM.get_it_sced_lmp_5_min
      gridstatus.PJM.get_lmp
      gridstatus.PJM.get_lmp_real_time_unverified_hourly
      gridstatus.PJM.get_load
      gridstatus.PJM.get_load_forecast
      gridstatus.PJM.get_load_forecast_5_min
      gridstatus.PJM.get_load_forecast_historical
      gridstatus.PJM.get_load_metered_hourly
      gridstatus.PJM.get_marginal_emission_rates_5_min
      gridstatus.PJM.get_marginal_value_day_ahead_hourly
      gridstatus.PJM.get_marginal_value_real_time_5_min
      gridstatus.PJM.get_operational_reserves
      gridstatus.PJM.get_pai_intervals_5_min
      gridstatus.PJM.get_pnode_ids
      gridstatus.PJM.get_pricing_nodes
      gridstatus.PJM.get_projected_area_statistics_at_peak
      gridstatus.PJM.get_projected_peak_tie_flow
      gridstatus.PJM.get_projected_rto_statistics_at_peak
      gridstatus.PJM.get_raw_interconnection_queue
      gridstatus.PJM.get_real_time_as_market_results
      gridstatus.PJM.get_regulation_market_monthly
      gridstatus.PJM.get_regulation_prices_5_min
      gridstatus.PJM.get_reserve_subzone_buses
      gridstatus.PJM.get_reserve_subzone_resources
      gridstatus.PJM.get_scheduled_interchange_real_time
      gridstatus.PJM.get_settlements_verified_lmp_5_min
      gridstatus.PJM.get_settlements_verified_lmp_hourly
      gridstatus.PJM.get_solar_forecast_5_min
      gridstatus.PJM.get_solar_forecast_hourly
      gridstatus.PJM.get_solar_generation_5_min
      gridstatus.PJM.get_solar_generation_by_area
      gridstatus.PJM.get_sync_reserve_events
      gridstatus.PJM.get_tie_flows_5_min
      gridstatus.PJM.get_transfer_interface_information_5_min
      gridstatus.PJM.get_transmission_constraints_day_ahead_hourly
      gridstatus.PJM.get_transmission_limits
      gridstatus.PJM.get_voltage_limits
      gridstatus.PJM.get_weight_average_aggregation_definition
      gridstatus.PJM.get_wind_forecast_5_min
      gridstatus.PJM.get_wind_forecast_hourly
      gridstatus.PJM.get_wind_generation_by_area
      gridstatus.PJM.get_wind_generation_instantaneous
      gridstatus.PJM.to_local_datetime

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

      Retrieves the actual and scheduled interchange summary data from:
      https://dataminer2.pjm.com/feed/actual_and_scheduled_interchange_summary/definition


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

      Retrieves the actual operational statistics data from:
      https://dataminer2.pjm.com/feed/ops_sum_prev_period/definition


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

      Retrieves the area control error data from:
      https://dataminer2.pjm.com/feed/area_control_error/definition


   .. py:method:: get_as_market_results_real_time_hourly(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False)

      Retrieves hourly real-time ancillary service market results prior to 2022-09-01.

      This method queries historical data before the granularity changed from hourly
      to 5-minute intervals. For data on or after September 1, 2022, use
      get_real_time_as_market_results().

      :param date: Start date. Must be between 2013-06-14 and 2022-08-31.
      :param end: End date. Must be before 2022-09-01.
      :param verbose: Print verbose output.

      :returns: DataFrame with hourly AS market results.


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

      Retrieves the daily cleared virtual transactions data from:
      https://dataminer2.pjm.com/feed/day_inc_dec_utc/definition


   .. py:method:: get_dam_as_market_results(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False)

      Retrieves the day-ahead ancillary service market results from :
      https://dataminer2.pjm.com/feed/da_reserve_market_results/definition
      Data is published daily.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with day-ahead ancillary service
                market results.
      :rtype: pandas.DataFrame


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

      Retrieves the day ahead demand bids data from:
      https://dataminer2.pjm.com/feed/hrl_dmd_bids/definition


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

      Retrieves the dispatched reserves preliminary data from:
      https://dataminer2.pjm.com/feed/dispatched_reserves/definition


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

      Retrieves the dispatched reserves verified data from:
      https://dataminer2.pjm.com/feed/rt_dispatch_reserves/definition


   .. py:method:: get_emergency_postings(url: str | None = None) -> pandas.DataFrame

      Retrieves PJM emergency procedure postings by triggering the public
      "Export To XML" button on the guest dashboard.

      Two-step flow (no credentials required):
        1. GET the guest dashboard to obtain a session cookie and JSF ViewState.
        2. POST ``frmButtons:lnkDownload`` to download the XML export.

      The XML contains Publish Time, Canceled Time, proper UTC start/end
      timestamps, and individual Region elements (one DataFrame row per
      message-region pair).


   .. py:method:: get_forecasted_generation_outages(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False)

      Retrieves the forecasted generation outages for the next 90 days from:

      https://dataminer2.pjm.com/feed/frcstd_gen_outages/definition


   .. py:method:: get_ftr_option_paths_monthly(date: str | pandas.Timestamp = 'latest', end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Gets the monthly FTR option paths data from PJM.

      Contains valid source-sink pairs for FTR options in PJM monthly
      auctions. Only ``date="latest"`` is supported.

      Source:
      https://www.pjm.com/pjmfiles/pub/account/auction-user-info/downloads/option-paths.csv

      :param date: Only "latest" is supported. Defaults to "latest".
      :type date: str
      :param end: Not supported. Defaults to None.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns:

                DataFrame with columns: Publish Date, Source Node,
                    Source PNODE ID, Sink Node, Sink PNODE ID
      :rtype: pd.DataFrame


   .. py:method:: get_ftr_source_sink_monthly_non_prompt(date: str | pandas.Timestamp = 'latest', end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Gets the monthly FTR source/sink data for non-prompt months from PJM.

      Contains valid source/sinks for obligations in the non-prompt month
      FTR auction. Only ``date="latest"`` is supported.

      Source:
      https://www.pjm.com/pjmfiles/pub/account/auction-user-info/downloads/ftr-source-sink-nonprompt.csv

      :param date: Only "latest" is supported. Defaults to "latest".
      :type date: str
      :param end: Not supported. Defaults to None.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns:

                DataFrame with columns: Publish Date, Obligation Name,
                    PNODE ID
      :rtype: pd.DataFrame


   .. py:method:: get_ftr_source_sink_monthly_prompt(date: str | pandas.Timestamp = 'latest', end: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Gets the monthly FTR source/sink data for the prompt month from PJM.

      Contains valid source/sinks for obligations in the prompt month
      FTR auction. Only ``date="latest"`` is supported.

      Source:
      https://www.pjm.com/pjmfiles/pub/account/auction-user-info/downloads/ftr-source-sink-prompt.csv

      :param date: Only "latest" is supported. Defaults to "latest".
      :type date: str
      :param end: Not supported. Defaults to None.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns:

                DataFrame with columns: Publish Date, Obligation Name,
                    PNODE ID
      :rtype: pd.DataFrame


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

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


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

      Retrieves the generation outage data
      From: https://dataminer2.pjm.com/feed/gen_outages_by_type/definition


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

      Retrieves the daily generation capacity data from:
      https://dataminer2.pjm.com/feed/day_gen_capacity/definition


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

      Retrieves the hourly net exports by state data from:
      https://dataminer2.pjm.com/feed/state_net_interchange/definition


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

      Retrieves the hourly transfer limits and flows data from:
      https://dataminer2.pjm.com/feed/transfer_limits_and_flows/definition


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

      Retrieves the hourly day-ahead increment and decrement bids data from:
      https://dataminer2.pjm.com/feed/hrl_da_incs_decs/definition

      Note: This data has a 4-month publication delay.


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

      Retrieves the instantaneous dispatch rate data from:
      https://dataminer2.pjm.com/feed/inst_dispatch_rate/definition


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

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

      Retrieves the interface flows and limit day ahead data from:
      https://dataminer2.pjm.com/feed/da_interface_flows_and_limits/definition


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

      Get 5 minute LMPs from the Integrated Forward Market (IFM)


   .. py:method:: get_lmp(date: str | pandas.Timestamp, market: str, end: str | pandas.Timestamp | None = None, locations: str = 'hubs', location_type: str | None = None, verbose: bool = False) -> pandas.DataFrame

      Returns LMP at a previous date.

      .. note::

         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.
         
         Returns ``Location Id``, ``Location Name``, ``Location Short Name``.

      :param date: Date to get LMPs for.
      :param end: End date to get LMPs for.
      :param market: Supported Markets: REAL_TIME_5_MIN, REAL_TIME_HOURLY,
                     DAY_AHEAD_HOURLY.
      :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 of rows!).
      :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'.


   .. py:method:: get_lmp_real_time_unverified_hourly(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, locations: str | None = None, location_type: str | None = None, verbose: bool = False) -> pandas.DataFrame

      Get real-time unverified hourly LMPs


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

      Returns load at a previous date at 5 minute intervals.

      :param date: Date to get load for. Must be in last 30 days.

      :returns: Load data time series. Columns include 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.


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

      Load forecast made today extending for six days in hourly intervals.

      Today's forecast updates every every half hour on the quarter E.g. 1:15 and 1:45


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

      Load forecast made today extending for 2 hours in 5 minute intervals.


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

      Historical load forecast in hourly intervals. Historical forecasts include all
      vintages of the forecast but has fewer regions than the current forecast.


   .. py:method:: get_load_metered_hourly(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False)

      Retrieves the hourly metered load data from:

      https://dataminer2.pjm.com/feed/hrl_load_metered/definition


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

      Retrieves the 5-minute marginal emission rates data from PJM.

      PJM estimates marginal emissions every five minutes for load zones across the grid.
      These estimates include CO₂, SO₂, and NOₓ, expressed in lbs/MWh. The calculation
      reflects the physical costs of power flows, capturing the impact of congestion on
      nodal emissions. When imports are marginal at a node, PJM assigns them zero emissions
      because the fuel source is unknown.

      Source: https://dataminer2.pjm.com/feed/fivemin_marginal_emissions/definition

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with 5-minute marginal emission rates data.
      :rtype: pandas.DataFrame


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

      Retrieves the marginal value data from:
      https://dataminer2.pjm.com/feed/da_marginal_value/definition


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

      Retrieves the marginal value data from:
      https://dataminer2.pjm.com/feed/rt_marginal_value/definition


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

      Retrieves the reserve market quantities in Megawatts from:
      https://dataminer2.pjm.com/feed/operational_reserves/definition
      Only available in past 15 days.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns:

                A DataFrame with reserve market quantities
                    in 15 second intervals.
      :rtype: pandas.DataFrame


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

      Retrieves the 5-minute Performance Assessment Intervals (PAI) data from PJM.

      This dataset contains information on the status of Performance Assessment Intervals
      (PAIs) across PJM and subzones, updated every 5 minutes. Performance during these
      PAIs is used by PJM to determine potential penalties, or compensation, for capacity
      obligations. This dataset has 3 potential responses in the Performance Assessment
      Interval column: "No PAI", "PAI in Active Subzone", and "PAI in RTO and Active Subzone".

      Source: https://dataminer2.pjm.com/feed/fivemin_pai_interval/definition

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with 5-minute PAI intervals data.
      :rtype: pandas.DataFrame


   .. py:method:: get_pnode_ids() -> pandas.DataFrame

   .. py:method:: get_pricing_nodes(as_of: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Retrieves the pricing nodes data from:
      https://dataminer2.pjm.com/feed/pnode/definition


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

      Area projected data for the peak of the day

      https://dataminer2.pjm.com/feed/ops_sum_frcst_peak_area/definition


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

      Retrieves the projected peak tie flow data from:
      https://dataminer2.pjm.com/feed/ops_sum_prjctd_tie_flow/definition


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

      RTO-wide projected data for the peak of the day

      https://dataminer2.pjm.com/feed/ops_sum_frcst_peak_rto/definition


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

   .. py:method:: get_real_time_as_market_results(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False)

      Retrieves the real-time ancillary service market results from :
      https://dataminer2.pjm.com/feed/reserve_market_results/definition
      Data for the previous day is published daily on business days,
      typically between 11am and 12pm market time.

      Data granularity changed on Sep 1, 2022 so when querying data,
      start and end dates must both be before or both after that date.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with real-time ancillary service
                market results.
      :rtype: pandas.DataFrame


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

      Retrieves the PJM Regulation Market Monthly data from:
      https://dataminer2.pjm.com/feed/reg_market_results/definition


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

      Retrieves 5-minute regulation pricing data from:
      https://api.pjm.com/api/v1/reg_prices


   .. py:method:: get_reserve_subzone_buses(as_of: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Retrieves the reserve subzone buses data from:
      https://dataminer2.pjm.com/feed/sync_pri_reserves_buses_list/definition


   .. py:method:: get_reserve_subzone_resources(as_of: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Retrieves the reserve subzone resources data from:
      https://dataminer2.pjm.com/feed/sync_pri_reserves_resources_list/definition


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

      Retrieves the scheduled interchange real time data from:
      https://dataminer2.pjm.com/feed/rt_scheduled_interchange/definition


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

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

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

      Retrieves the 5-min solar forecast including behind the meter solar forecast.
      From: https://dataminer2.pjm.com/feed/five_min_solar_power_forecast/definition
      Only available in past 30 days

      :param date: Start datetime for data
      :type date: str | pd.Timestamp
      :param end: End datetime for data. Defaults to None.
      :type end: str | pd.Timestamp | None, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with the solar forecast data.
      :rtype: pd.DataFrame


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

      Retrieves the hourly solar forecast including behind the meter solar forecast.
      From: https://dataminer2.pjm.com/feed/hourly_solar_power_forecast/definition
      Only available in past 30 days

      :param date: Start datetime for data
      :type date: str | pd.Timestamp
      :param end: End datetime for data. Defaults to None.
      :type end: str | pd.Timestamp | None, optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with the solar forecast data.
      :rtype: pd.DataFrame


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

      Retrieves the 5 min solar generation data from:
      https://dataminer2.pjm.com/feed/five_min_solar_generation/definition
      Only available in past 30 days.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with 5 minute solar generation data.
      :rtype: pandas.DataFrame


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

      Retrieves the current solar generation information from:
      https://dataminer2.pjm.com/feed/solar_gen/definition
      Data is published daily around 7am market time.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with solar generation information.
      :rtype: pandas.DataFrame


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

      Retrieves the synchronized reserve events data from:
      https://dataminer2.pjm.com/feed/sync_reserve_events/definition


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

      Retrieves the PJM Tie Flows 5 Minute data from:
      https://dataminer2.pjm.com/feed/tie_flows/definition


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

      Retrieves the transfer interface information from:
      https://dataminer2.pjm.com/feed/transfer_interface_infor/definition
      Only available in past 30 days.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with transfer interface information
                in 5 minute intervals.
      :rtype: pandas.DataFrame


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

      Retrieves the transmission constraints data from:
      https://dataminer2.pjm.com/feed/da_transconstraints/definition


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

      Retrieves the current transmission limit information from:
      https://dataminer2.pjm.com/feed/transfer_interface_infor/definition
      Only available in past 30 days. Data is published only when constraints
      exist for that five minute interval.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with transmission limit information
                in 5 minute intervals, when data is available.
      :rtype: pandas.DataFrame


   .. py:method:: get_voltage_limits(verbose: bool = False) -> str

      Downloads the raw voltage limits CSV file from EDART.

      The URL returns a ZIP file containing the CSV. This method extracts and returns
      the CSV content as a string.

      Source: https://edart.pjm.com/reports/voltagelimits.csv

      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: The CSV content as a string.
      :rtype: str

      :raises NoDataFoundException: If the server returns a rate limit message.


   .. py:method:: get_weight_average_aggregation_definition(as_of: str | pandas.Timestamp | None = None, verbose: bool = False) -> pandas.DataFrame

      Retrieves the weight average aggregation definition data from:
      https://dataminer2.pjm.com/feed/agg_definitions/definition


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

      Retrieves the 5-min wind forecast
      From: https://dataminer2.pjm.com/feed/five_min_wind_power_forecast/definition
      Only available in past 30 days

      :param date: Start datetime for data
      :type date: str | pd.Timestamp
      :param end: End datetime for data. Defaults to None.
      :type end: Optional[str  |  pd.Timestamp], optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with the wind forecast data.
      :rtype: pd.DataFrame


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

      Retrieves the hourly wind forecast
      From: https://dataminer2.pjm.com/feed/hourly_wind_power_forecast/definition
      Only available in past 30 days

      :param date: Start datetime for data
      :type date: str | pd.Timestamp
      :param end: End datetime for data. Defaults to None.
      :type end: Optional[str  |  pd.Timestamp], optional
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with the wind forecast data.
      :rtype: pd.DataFrame


   .. py:method:: get_wind_generation_by_area(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool = False)

      Retrieves the current wind generation information from:
      https://dataminer2.pjm.com/feed/wind_gen/definition
      Data is published daily around 7am market time.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns: A DataFrame with wind generation information.
      :rtype: pandas.DataFrame


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

      Retrieves the instantaneous wind generation data from:
      https://dataminer2.pjm.com/feed/instantaneous_wind_gen/definition
      Only available in past 30 days.

      :param date: Start datetime for data
      :type date: str or pandas.Timestamp
      :param end: (str or pandas.Timestamp, optional): End datetime for data.
                  Defaults to one day past `date` if not specified.
      :param verbose: print verbose output. Defaults to False.
      :type verbose: bool, optional

      :returns:

                A DataFrame with instantaneous wind generation data
                    in 15 second intervals.
      :rtype: pandas.DataFrame


   .. py:method:: to_local_datetime(df: pandas.DataFrame, column_name: str) -> pandas.Series


.. 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_as_prices_real_time_5_min
      gridstatus.SPP.get_binding_constraints_day_ahead_hourly
      gridstatus.SPP.get_binding_constraints_real_time_5_min
      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_fuel_mix_by_baa
      gridstatus.SPP.get_fuel_mix_by_baa_detailed
      gridstatus.SPP.get_fuel_mix_detailed
      gridstatus.SPP.get_hourly_load
      gridstatus.SPP.get_hourly_load_annual
      gridstatus.SPP.get_hourly_load_historical
      gridstatus.SPP.get_interchange_real_time
      gridstatus.SPP.get_interconnection_queue
      gridstatus.SPP.get_lmp_day_ahead_hourly
      gridstatus.SPP.get_lmp_real_time_5_min_by_bus
      gridstatus.SPP.get_lmp_real_time_5_min_by_location
      gridstatus.SPP.get_lmp_real_time_weis
      gridstatus.SPP.get_load
      gridstatus.SPP.get_load_by_baa
      gridstatus.SPP.get_load_by_baa_hourly
      gridstatus.SPP.get_load_forecast
      gridstatus.SPP.get_load_forecast_by_baa
      gridstatus.SPP.get_load_forecast_mid_term
      gridstatus.SPP.get_load_forecast_short_term
      gridstatus.SPP.get_market_clearing_day_ahead
      gridstatus.SPP.get_market_clearing_real_time
      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.get_ver_curtailments_by_baa
      gridstatus.SPP.get_ver_curtailments_by_baa_annual
      gridstatus.SPP.get_west_interchange_real_time
      gridstatus.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:



