Pjm#

Module Contents#

Classes Summary#

PJM

PJM

Attributes Summary#

DEFAULT_RETRIES

Contents#

gridstatus.pjm.DEFAULT_RETRIES = 3[source]#
class gridstatus.pjm.PJM(api_key=None, retries=DEFAULT_RETRIES)[source]#

Bases: gridstatus.base.ISOBase

PJM

Parameters:

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

Attributes

default_timezone

US/Eastern

hub_node_ids

[‘51217’, ‘116013751’, ‘35010337’, ‘34497151’, ‘34497127’, ‘34497125’, ‘33092315’, ‘33092313’, ‘33092311’, ‘4669664’, ‘51288’, ‘51287’]

interconnection_homepage

https://www.pjm.com/planning/service-requests/services-request-status

iso_id

pjm

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

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

get_dam_as_market_results

Retrieves the day-ahead ancillary service market results from :

get_forecasted_generation_outages

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

get_fuel_mix

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

get_gen_outages_by_type

Retrieves the generation outage data

get_interconnection_queue

get_lmp

Returns LMP at a previous date

get_load

Returns load at a previous date at 5 minute intervals

get_load_forecast

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

get_load_forecast_historical

Historical load forecast in hourly intervals. Historical forecasts include all

get_load_metered_hourly

Retrieves the hourly metered load data from:

get_operational_reserves

Retrieves the reserve market quantities in Megawatts from:

get_pnode_ids

get_projected_area_statistics_at_peak

Area projected data for the peak of the day

get_projected_rto_statistics_at_peak

RTO-wide projected data for the peak of the day

get_raw_interconnection_queue

get_real_time_as_market_results

Retrieves the real-time ancillary service market results from :

get_solar_forecast

Retrieves the hourly solar forecast including behind the meter solar forecast.

get_solar_generation_5_min

Retrieves the 5 min solar generation data from:

get_solar_generation_by_area

Retrieves the current solar generation information from:

get_transfer_interface_information_5_min

Retrieves the transfer interface information from:

get_transmission_limits

Retrieves the current transmission limit information from:

get_wind_forecast

Retrieves the hourly wind forecast

get_wind_generation_by_area

Retrieves the current wind generation information from:

get_wind_generation_instantaneous

Retrieves the instantaneous wind generation data from:

to_local_datetime

get_dam_as_market_results(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with day-ahead ancillary service market results.

Return type:

pandas.DataFrame

get_forecasted_generation_outages(date, end=None, verbose=False)[source]#

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

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

get_fuel_mix(date, end=None, verbose=False)[source]#

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

get_gen_outages_by_type(date, end=None, verbose=False)[source]#

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

get_interconnection_queue(verbose=False)[source]#
get_lmp(date, market: str, end=None, locations='hubs', location_type=None, verbose=False)[source]#

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

  • Return Location Id, Location Name, Location Short Name.

Parameters:
  • date (datetime.date, str) – date to get LMPs for

  • end (datetime.date, str) – 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’.

get_load(date, end=None, verbose=False)[source]#

Returns load at a previous date at 5 minute intervals

Parameters:

date (datetime.date, str) – date to get load for. must be in last 30 days

Returns:

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

  • Load columns represent PJM-wide load

  • Returns data for the following areas: AE, AEP, APS, ATSI,

BC, COMED, DAYTON, DEOK, DOM, DPL, DUQ, EKPC, JC, ME, PE, PEP, PJM MID ATLANTIC REGION, PJM RTO, PJM SOUTHERN REGION, PJM WESTERN REGION, PL, PN, PS, RECO

Return type:

pd.DataFrame

get_load_forecast(date, end=None, verbose=False)[source]#

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

get_load_forecast_historical(date, end=None, verbose=False)[source]#

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

get_load_metered_hourly(date, end=None, verbose=False)[source]#

Retrieves the hourly metered load data from:

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

get_operational_reserves(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with reserve market quantities

in 15 second intervals.

Return type:

pandas.DataFrame

get_pnode_ids()[source]#
get_projected_area_statistics_at_peak(date, end=None, verbose=False)[source]#

Area projected data for the peak of the day

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

get_projected_rto_statistics_at_peak(date, end=None, verbose=False)[source]#

RTO-wide projected data for the peak of the day

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

get_raw_interconnection_queue(verbose=False) BinaryIO[source]#
get_real_time_as_market_results(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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.

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with real-time ancillary service market results.

Return type:

pandas.DataFrame

get_solar_forecast(date, end=None, verbose=False)[source]#

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

get_solar_generation_5_min(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with 5 minute solar generation data.

Return type:

pandas.DataFrame

get_solar_generation_by_area(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with solar generation information.

Return type:

pandas.DataFrame

get_transfer_interface_information_5_min(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with transfer interface information in 5 minute intervals.

Return type:

pandas.DataFrame

get_transmission_limits(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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.

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

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

Return type:

pandas.DataFrame

get_wind_forecast(date, end=None, verbose=False)[source]#

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

get_wind_generation_by_area(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with wind generation information.

Return type:

pandas.DataFrame

get_wind_generation_instantaneous(date: str | pandas.Timestamp, end: str | pandas.Timestamp | None = None, verbose: bool | None = False)[source]#

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

Parameters:
  • date (str or pandas.Timestamp) – Start datetime for data

  • end – (str or pandas.Timestamp, optional): End datetime for data. Defaults to one day past date if not specified.

  • verbose (bool, optional) – print verbose output. Defaults to False.

Returns:

A DataFrame with instantaneous wind generation data

in 15 second intervals.

Return type:

pandas.DataFrame

to_local_datetime(df, column_name)[source]#