Gridstatus ==================== .. py:module:: gridstatus Subpackages ----------- .. toctree:: :titlesonly: :maxdepth: 3 tests/index.rst Submodules ---------- .. toctree:: :titlesonly: :maxdepth: 1 base/index.rst caiso/index.rst decorators/index.rst ercot/index.rst isone/index.rst miso/index.rst nyiso/index.rst pjm/index.rst spp/index.rst test/index.rst utils/index.rst version/index.rst Package Contents ---------------- Classes Summary ~~~~~~~~~~~~~~~ .. autoapisummary:: gridstatus.CAISO gridstatus.Ercot gridstatus.ISONE gridstatus.Markets gridstatus.MISO gridstatus.NYISO gridstatus.PJM gridstatus.SPP Exceptions Summary ~~~~~~~~~~~~~~~~~~ .. autoapisummary:: `gridstatus.NotSupported` Functions ~~~~~~~~~ .. autoapisummary:: :nosignatures: gridstatus.get_interconnection_queues gridstatus.get_iso gridstatus.list_isos gridstatus.load_folder Contents ~~~~~~~~~~~~~~~~~~~ .. py:class:: CAISO Bases: :py:obj:`gridstatus.base.ISOBase` California Independent System Operator (CAISO) **Attributes** .. list-table:: :widths: 15 85 :header-rows: 0 * - **default_timezone** - US/Pacific * - **interconnection_homepage** - https://rimspub.caiso.com/rimsui/logon.do * - **iso_id** - caiso * - **markets** - None * - **name** - California ISO * - **status_homepage** - https://www.caiso.com/TodaysOutlook/Pages/default.aspx * - **trading_hub_locations** - ['TH_NP15_GEN-APND', 'TH_SP15_GEN-APND', 'TH_ZP26_GEN-APND'] **Methods** .. autoapisummary:: :nosignatures: gridstatus.CAISO.get_as_prices gridstatus.CAISO.get_as_procurement gridstatus.CAISO.get_curtailment gridstatus.CAISO.get_fuel_mix gridstatus.CAISO.get_gas_prices gridstatus.CAISO.get_ghg_allowance gridstatus.CAISO.get_interconnection_queue gridstatus.CAISO.get_lmp gridstatus.CAISO.get_load gridstatus.CAISO.get_load_forecast gridstatus.CAISO.get_pnodes gridstatus.CAISO.get_stats gridstatus.CAISO.get_status gridstatus.CAISO.get_storage .. py:method:: get_as_prices(date, end=None, sleep=4, verbose=False) Return AS prices for a given date for each region Arguments: date: date to return data end: last date of range to return data. if None, returns only date. Defaults to None. verbose: print out url being fetched. Defaults to False. Returns: dataframe of AS prices .. py:method:: get_as_procurement(date, end=None, market='DAM', sleep=4, verbose=False) Get ancillary services procurement data from CAISO. Arguments: date: date to return data end: last date of range to return data. if None, returns only date. Defaults to None. market: DAM or RTM. Defaults to DAM. Returns: dataframe of ancillary services data .. py:method:: get_curtailment(date, verbose=False) Return curtailment data for a given date Notes: * requires java to be installed in order to run * Data available from June 30, 2016 to present Arguments: date: date to return data end: last date of range to return data. if None, returns only date. Defaults to None. verbose: print out url being fetched. Defaults to False. Returns: dataframe of curtailment data .. py:method:: get_fuel_mix(date, end=None, verbose=False) Get fuel mix in 5 minute intervals for a provided day Arguments: date (datetime or str): "latest", "today", or an object that can be parsed as a datetime for the day to return data. start (datetime or str): start of date range to return. alias for `date` parameter. Only specify one of `date` or `start`. end (datetime or str): "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. verbose (bool): print verbose output. Defaults to False. Returns: pd.Dataframe: dataframe with columns: Time and columns for each fuel type .. py:method:: get_gas_prices(date, end=None, fuel_region_id='ALL', sleep=4, verbose=False) Return gas prices at a previous date Arguments: date: date to return data end: last date of range to return data. if None, returns only date. Defaults to None. fuel_region_id(str, or list): single fuel region id or list of fuel region ids to return data for. Defaults to ALL, which returns all fuel regions. Returns: dataframe of gas prices .. py:method:: get_ghg_allowance(date, end=None, sleep=4, verbose=False) Return ghg allowance at a previous date Arguments: date: date to return data end: last date of range to return data. if None, returns only date. Defaults to None. .. py:method:: get_interconnection_queue(verbose=False) .. py:method:: get_lmp(date, market: str, locations: list = None, sleep: int = 5, end=None, verbose=False) Get day ahead LMP pricing starting at supplied date for a list of locations. Arguments: date: date to return data market: market to return from. supports: locations(list): list of locations to get data from. If no locations are provided, defaults to NP15, SP15, and ZP26, which are the trading hub locations. For a list of locations, call CAISO.get_pnodes() sleep(int): number of seconds to sleep before returning to avoid hitting rate limit in regular usage. Defaults to 5 seconds. Returns dataframe of pricing data .. py:method:: get_load(date, end=None, verbose=False) Return load at a previous date in 5 minute intervals .. py:method:: get_load_forecast(date, end=None, sleep=4, verbose=False) Returns load forecast for a previous date in 1 hour intervals Arguments: date(datetime, pd.Timestamp, or str): day to return. if string, format should be YYYYMMDD e.g 20200623 sleep(int): number of seconds to sleep before returning to avoid hitting rate limit in regular usage. Defaults to 5 seconds. .. py:method:: get_pnodes() .. py:method:: get_stats(verbose=False) .. py:method:: get_status(date='latest', verbose=False) -> str Get Current Status of the Grid. Only date="latest" is supported Known possible values: Normal, Restricted Maintenance Operations, Flex Alert .. py:method:: get_storage(date, verbose=False) Return storage charging or discharging for today in 5 minute intervals Negative means charging, positive means discharging Arguments: date: date to return data .. 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_URL_FORMAT** - https://www.ercot.com/content/cdr/html/{timestamp}_actual_loads_of_forecast_zones.html * - **BASE** - https://www.ercot.com/api/1/services/read/dashboards * - **default_timezone** - US/Central * - **interconnection_homepage** - http://mis.ercot.com/misapp/GetReports.do?reportTypeId=15933 * - **iso_id** - ercot * - **LOAD_HISTORICAL_MAX_DAYS** - 14 * - **name** - Electric Reliability Council of Texas * - **status_homepage** - https://www.ercot.com/gridmktinfo/dashboards/gridconditions **Methods** .. autoapisummary:: :nosignatures: gridstatus.Ercot.get_as_prices gridstatus.Ercot.get_fuel_mix gridstatus.Ercot.get_interconnection_queue gridstatus.Ercot.get_load gridstatus.Ercot.get_load_forecast gridstatus.Ercot.get_rtm_spp gridstatus.Ercot.get_status .. py:method:: get_as_prices(date, verbose=False) Get ancillary service clearing prices in hourly intervals in Day Ahead Market Arguments: date(datetime or str): date of delivery for AS services verbose(bool): print verbose output. Defaults to False. Returns: pd.Dataframe: dataframe with prices for "Non-Spinning Reserves", "Regulation Up", "Regulation Down", "Responsive Reserves", .. py:method:: get_fuel_mix(date, verbose=False) Get fuel mix 5 minute intervals Arguments: date(datetime or str): "latest", "today". historical data currently not supported verbose(bool): print verbose output. Defaults to False. Returns: pd.Dataframe: dataframe with columns: Time and columns for each fuel type (solar and wind) .. py:method:: get_interconnection_queue(verbose=False) Get interconnection queue for ERCOT Monthly historical data available here: http: // mis.ercot.com/misapp/GetReports.do?reportTypeId = 15933 & reportTitle = GIS % 20Report & showHTMLView = &mimicKey .. py:method:: get_load(date, verbose=False) .. py:method:: get_load_forecast(date, verbose=False) Returns load forecast Currently only supports today's forecast .. py:method:: get_rtm_spp(year) Get Historical RTM Settlement Point Prices(SPPs) for each of the Hubs and Load Zones Arguments: year(int): year to get data for Source: https: // www.ercot.com/mp/data-products/data-product-details?id = NP6-785-ER .. py:method:: get_status(date, verbose=False) Returns status of grid .. py:function:: get_interconnection_queues() Get interconnection queue data for all ISOs .. py:function:: get_iso(iso_id) Get an ISO by its id .. py:class:: ISONE Bases: :py:obj:`gridstatus.base.ISOBase` ISO New England (ISONE) **Attributes** .. list-table:: :widths: 15 85 :header-rows: 0 * - **default_timezone** - US/Eastern * - **hubs** - None * - **interconnection_homepage** - https://irtt.iso-ne.com/reports/external * - **interfaces** - None * - **iso_id** - isone * - **markets** - None * - **name** - ISO New England * - **status_homepage** - https://www.iso-ne.com/markets-operations/system-forecast-status/current-system-status * - **zones** - None **Methods** .. autoapisummary:: :nosignatures: gridstatus.ISONE.get_fuel_mix gridstatus.ISONE.get_interconnection_queue gridstatus.ISONE.get_lmp gridstatus.ISONE.get_load gridstatus.ISONE.get_load_forecast gridstatus.ISONE.get_status .. 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: pd.DataFrame -- interconnection queue .. 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, 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_status(date, verbose=False) Get latest status for ISO NE .. py:function:: list_isos() List available ISOs .. py:function:: load_folder(path, time_zone=None, verbose=True) Load a single dataframe for same schema csv files in a folder Arguments: path {str} -- path to folder time_zone {str} -- time zone to localize to timestamps. By default returns as UTC Returns: pd.DataFrame -- dataframe of all files .. py:class:: Markets Bases: :py:obj:`enum.Enum` Names of LMP Markets **Attributes** .. list-table:: :widths: 15 85 :header-rows: 0 * - **DAY_AHEAD_HOURLY** - DAY_AHEAD_HOURLY * - **REAL_TIME_15_MIN** - REAL_TIME_15_MIN * - **REAL_TIME_5_MIN** - REAL_TIME_5_MIN * - **REAL_TIME_HOURLY** - REAL_TIME_HOURLY **Methods** .. autoapisummary:: :nosignatures: gridstatus.Markets.__contains__ .. py:method:: __contains__(item) .. py:class:: MISO Bases: :py:obj:`gridstatus.base.ISOBase` Midcontinent Independent System Operator (MISO) **Attributes** .. list-table:: :widths: 15 85 :header-rows: 0 * - **BASE** - https://api.misoenergy.org/MISORTWDDataBroker/DataBrokerServices.asmx * - **default_timezone** - US/Central * - **hubs** - ['ILLINOIS.HUB', 'INDIANA.HUB', 'LOUISIANA.HUB', 'MICHIGAN.HUB', 'MINN.HUB', 'MS.HUB', 'TEXAS.HUB', 'ARKANSAS.HUB'] * - **interconnection_homepage** - https://www.misoenergy.org/planning/generator-interconnection/GI_Queue/ * - **iso_id** - miso * - **markets** - None * - **name** - Midcontinent ISO **Methods** .. autoapisummary:: :nosignatures: gridstatus.MISO.get_fuel_mix gridstatus.MISO.get_interconnection_queue gridstatus.MISO.get_lmp gridstatus.MISO.get_load gridstatus.MISO.get_load_forecast .. py:method:: get_fuel_mix(date, verbose=False) Get fuel mix in 5 minute intervals for a provided day Arguments: date (datetime or str): "latest", "today", or an object that can be parsed as a datetime for the day to return data. start (datetime or str): start of date range to return. alias for `date` parameter. Only specify one of `date` or `start`. end (datetime or str): "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. verbose (bool): print verbose output. Defaults to False. Returns: pd.Dataframe: dataframe with columns: Time and columns for each fuel type .. py:method:: get_interconnection_queue(verbose=False) Get the interconnection queue Returns: pd.DataFrame -- Interconnection queue .. py:method:: get_lmp(date, market: str, locations: list = None, verbose=False) Supported Markets: REAL_TIME_5_MIN (FiveMinLMP) DAY_AHEAD_HOURLY (DayAheadExPostLMP) .. py:method:: get_load(date, verbose=False) .. py:method:: get_load_forecast(date, verbose=False) .. 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_capacity_prices gridstatus.NYISO.get_fuel_mix gridstatus.NYISO.get_generators gridstatus.NYISO.get_interconnection_queue gridstatus.NYISO.get_lmp gridstatus.NYISO.get_load gridstatus.NYISO.get_load_forecast gridstatus.NYISO.get_loads gridstatus.NYISO.get_status .. py:method:: get_capacity_prices(date=None, verbose=False) Pull the most recent capacity market report's market clearing prices Parameters: date (pd.Timestamp): date that will be used to pull latest capacity report (will refer to month and year) verbose (bool): print out requested url Returns: pd.DataFrame: a dataframe of monthly capacity prices (all three auctions) for each of the four capacity localities within NYISO .. py:method:: get_fuel_mix(date, end=None, verbose=False) Get fuel mix in 5 minute intervals for a provided day Arguments: date (datetime or str): "latest", "today", or an object that can be parsed as a datetime for the day to return data. start (datetime or str): start of date range to return. alias for `date` parameter. Only specify one of `date` or `start`. end (datetime or str): "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. verbose (bool): print verbose output. Defaults to False. Returns: pd.Dataframe: dataframe with columns: Time and columns for each fuel type .. py:method:: get_generators(verbose=False) Get a list of generators in NYISO When possible return capacity and fuel type information Parameters: verbose (bool): print out requested url Returns: pd.DataFrame: a dataframe of generators and locations **Possible Columns** * Generator Name * PTID * Subzone * Zone * Latitude * Longitude * Owner, Operator, and / or Billing Organization * Station Unit * Town * County * State * In-Service Date * Name Plate Rating (V) MW * 2022 CRIS MW Summer * 2022 CRIS MW Winter * 2022 Capability MW Summer * 2022 Capability MW Winter * Is Dual Fuel * Unit Type * Fuel Type 1 * Fuel Type 2 * 2021 Net Energy GWh * Notes * Generator Type .. py:method:: get_interconnection_queue(verbose=False) Return NYISO interconnection queue Additional Non-NYISO queue info: https://www3.dps.ny.gov/W/PSCWeb.nsf/All/286D2C179E9A5A8385257FBF003F1F7E?OpenDocument Returns: pd.DataFrame: Interconnection queue containing, active, withdrawn, and completed project .. py:method:: get_lmp(date, end=None, market: str = None, locations: list = None, location_type: str = None, verbose=False) Supported Markets: REAL_TIME_5_MIN, DAY_AHEAD_HOURLY Supported Location Types: "zone", "generator" .. py:method:: get_load(date, end=None, verbose=False) Returns load at a previous date in 5 minute intervals .. py:method:: get_load_forecast(date, end=None, verbose=False) Get load forecast for a date in 1 hour intervals .. py:method:: get_loads(verbose=False) Get a list of loads in NYISO Parameters: verbose (bool): print out requested url Returns: pd.DataFrame: a dataframe of loads and locations .. py:method:: get_status(date, end=None, verbose=False) .. py:class:: PJM Bases: :py:obj:`gridstatus.base.ISOBase` PJM **Attributes** .. list-table:: :widths: 15 85 :header-rows: 0 * - **default_timezone** - US/Eastern * - **hub_node_ids** - ['51217', '116013751', '35010337', '34497151', '34497127', '34497125', '33092315', '33092313', '33092311', '4669664', '51288', '51287'] * - **interconnection_queue_homepage** - https://www.pjm.com/planning/services-requests/interconnection-queues.aspx * - **iso_id** - pjm * - **location_types** - ['ZONE', 'LOAD', 'GEN', 'AGGREGATE', 'INTERFACE', 'EXT', 'HUB', 'EHV', 'TIE', 'RESIDUAL_METERED_EDC'] * - **markets** - None * - **name** - PJM **Methods** .. autoapisummary:: :nosignatures: gridstatus.PJM.get_fuel_mix gridstatus.PJM.get_interconnection_queue gridstatus.PJM.get_lmp gridstatus.PJM.get_load gridstatus.PJM.get_load_forecast gridstatus.PJM.get_pnode_ids .. py:method:: get_fuel_mix(date, end=None, verbose=False) Get fuel mix for a date or date range in hourly intervals .. py:method:: get_interconnection_queue() .. py:method:: get_lmp(date, market: str, end=None, locations='hubs', location_type=None, verbose=False) Returns LMP at a previous date Notes: * If start date is prior to the PJM archive date, all data must be downloaded before location filtering can be performed due to limitations of PJM API. The archive date is 186 days (~6 months) before today for the 5 minute real time market and 731 days (~2 years) before today for the Hourly Real Time and Day Ahead Hourly markets. Node type filter can be performed for Real Time Hourly and Day Ahead Hourly markets. * If location_type is provided, it is filtered after data is retrieved for Real Time 5 Minute market regardless of the date. This is due to PJM api limitations Args: date (str or datetime.date): date to get LMPs for end (str or datetime.date): end date to get LMPs for market (str): Supported Markets: REAL_TIME_5_MIN, REAL_TIME_HOURLY, DAY_AHEAD_HOURLY locations (list, optional): list of pnodeid to get LMPs for. Defaults to "hubs". Use get_pnode_ids() to get a list of possible pnode ids. If "all", will return data from all p nodes (warning there are over 10,000 unique pnodes, so expect millions or billions of rows!) location_type (str, optional): 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_load(date, end=None, verbose=False) Returns load at a previous date at 5 minute intervals Args: date (str or datetime.date): date to get load for. must be in last 30 days .. py:method:: get_load_forecast(date, verbose=False) Get forecast for today in hourly intervals. Updates every Every half hour on the quarter E.g. 1:15 and 1:45 .. py:method:: get_pnode_ids() .. py: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 * - **name** - Southwest Power Pool * - **status_homepage** - https://www.spp.org/markets-operations/current-grid-conditions/ **Methods** .. autoapisummary:: :nosignatures: gridstatus.SPP.get_fuel_mix gridstatus.SPP.get_interconnection_queue gridstatus.SPP.get_load gridstatus.SPP.get_load_forecast gridstatus.SPP.get_status .. py:method:: get_fuel_mix(date, verbose=False) Get fuel mix in 5 minute intervals for a provided day Arguments: date (datetime or str): "latest", "today", or an object that can be parsed as a datetime for the day to return data. start (datetime or str): start of date range to return. alias for `date` parameter. Only specify one of `date` or `start`. end (datetime or str): "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. verbose (bool): print verbose output. Defaults to False. Returns: pd.Dataframe: dataframe with columns: Time and columns for each fuel type .. py:method:: get_interconnection_queue(verbose=False) Get interconnection queue Returns: pd.DataFrame: Interconnection queue .. py:method:: get_load(date, verbose=False) Returns load for last 24hrs in 5 minute intervals .. py:method:: get_load_forecast(date, forecast_type='MID_TERM', verbose=False) type (str): MID_TERM is hourly for next 7 days or SHORT_TERM is every five minutes for a few hours .. py:method:: get_status(date=None, verbose=False)