Yes Energy

This topic explains how the Yes Energy source works

Yes Energy

The Yes Energy Source provides data from Yes Energy. The connector takes three arguments, datatype and object ID, and aggregation. The available datatypes and objects fall into the list of categories below.

CategorySubcategory
PricesLMP
PricesAncillary Services
PricesCongestion
PricesEnergy
PricesLoss
LoadForecast
LoadActual
GenerationForecast
GenerationActual
GenerationScheduled
WeatherForecast
WeatherActual

Finding the Right Datatypes and Object IDs

The full list of available datatypes and object IDs for ERCOT and CAISO can be found in this spreadsheet. Information on additional ISOs can be found in individual spreadsheets this folder. All spreadsheets can be filtered by datatype to find corresponding object IDs. We have also found the following list of datatypes useful to get started. The data in the spreadsheet is confidential and proprietary market information provided by Yes Energy LLC.

Load Datatypes

  • LOAD_FORECAST_2DAY
  • RTLOAD (actuals)

LMP Prices Datatypes

  • DALMP
  • RTLMP
  • DARTLMP

Generation Datatypes

  • WINDDATA (actuals)
  • WIND_FORECAST
  • SOLARGEN_HOURLY (actuals)
  • SOLAR_FORECAST

Client Library

The code below shows an example of how to create the Yes Energy source in the Client Library. See the Create a Price Forecast Model tutorial for more details on Yes Energy usage within a NoTS.

yes_energy_source = project.create_source(
    title="Yes Energy",
    connector=yes_energy.YesEnergy(
        items=[yes_energy.YesEnergyItem(datatype="DALMP", object_id=10000697078)],
        stat=yes_energy.YesEnergyAggregation.AVG,
    ),
)

Vintaging with Yes Energy

Vintaging allows you to pull historical forecasts with varying as of times. This is useful for backtesting with data that would have been available when forecasts were made.

The Yes Energy source connector takes a vintaging offset argument to accomplish vintaging. The format is DD:HH:MM indicating that the forecasts to be queried should be available DD days before the forecasted time at or before HH:MM. For example an offset of "01:09:00" will query forecasts available as-of the prior day to the datetime being forecasted, at or before 09:00 local time.

Layering in the Myst Platform allows you to use the most recent Yes Energy forecast moving forward in time while using vintaged data for backtests. The client library script below builds a Yes Energy source with vintaged and non-vintaged data, time series for both signals, and a final layered time series holding both signals. The top layer will be the latest available forecasts, while the bottom layer will be the forecasts available as of the previous day at 09:00 local time.

import myst
from myst.connectors.source_connectors import yes_energy

myst.authenticate()
project = myst.Project.get(uuid="<project uuid>")

DATATYPE="LOAD_FORECAST"
ERCOT_LOAD_ZONE = 10000712973
FORECAST_VINTAGE_OFFSET = "01:09:00"

LOAD_FORECAST = yes_energy.YesEnergyItem(datatype=DATATYPE, object_id=ERCOT_LOAD_ZONE)
LOAD_FORECAST_BEFORE_DAM = yes_energy.YesEnergyItem(
    datatype=DATATYPE, 
    object_id=ERCOT_LOAD_ZONE, 
    forecast_vintage_offset=FORECAST_VINTAGE_OFFSET,
)

# Create the Yes Energy target and feature time series.
yes_energy_source = project.create_source(
    title="Yes Energy",
    connector=yes_energy.YesEnergy(
        items=[LOAD_FORECAST, LOAD_FORECAST_BEFORE_DAM],
        stat=yes_energy.YesEnergyAggregation.AVG,
    ),
)

# Create two time series for the two Yes Energy items
load_forecast_ts = yes_energy_source.create_time_series(
    title="ERCOT LOAD FORECAST",
    sample_period=myst.TimeDelta("PT1H"),
    label_indexer=f"{DATATYPE}_{ERCOT_LOAD_ZONE}",
)
load_forecast_pre_dam_ts = yes_energy_source.create_time_series(
    title="ERCOT PRE DAM LOAD FORECAST",
    sample_period=myst.TimeDelta("PT1H"),
    label_indexer=f"{DATATYPE}_{ERCOT_LOAD_ZONE}@{FORECAST_VINTAGE_OFFSET}",
)

# Create Layered Time Series
layered_time_series = project.create_time_series(title="Spliced Load Forecast", sample_period=myst.TimeDelta("PT1H"))

# The start timing ensures that this layer's data will only be used when making forecasts into the future.
layered_time_series.create_layer(
    node=load_forecast_ts,
    order=0,
    start_timing=myst.TimeDelta("PT1H"),
)
                                         
# The end timing ensures that this layer's data will only be used when backcasting, e.g. during a backtest.
layered_time_series.create_layer(
    node=load_forecast_pre_dam_ts,
    order=1,
    end_timing=myst.TimeDelta("PT0H"),
)

Previously, Yes Energy users were able to specify market timings via Yes Energy-specific aliases. These, however, are not currently supported. Below is a list of market timings aliases and their translation to vintage offsets.

ISOVINTAGENAMEVINTAGEOFFSET
AESOBID CLOSE1:10:00
CAISOPRIMARY1:09:00
CAISODELTA0:00:00
CAISOEXTENDED2:17:00
CAISOLATEST0:00:00
CAISOBID CLOSE1:10:00
CAISOORIGINAL1:17:00
ERCOTPRIMARY1:09:00
ERCOTENDOFDAY1:17:00
ERCOTEXTENDED2:17:00
ERCOTBID CLOSE1:10:00
ERCOTLATEST0:00:00
ERCOTORIGINAL1:14:00
ERCOTDELTA0:00:00
IESOLATEST0:00:00
IESOPRIMARY1:09:00
IESOBID CLOSE1:10:00
IESOORIGINAL1:17:00
MISOLATEST0:00:00
MISOPRIMARY1:09:00
MISOEXTENDED2:17:00
MISODELTA0:00:00
MISOORIGINAL1:17:00
MISOBID CLOSE1:10:00
MX-BCABID CLOSE1:11:00
MX-BCADELTA0:00:00
MX-BCAENDOFDAY1:17:00
MX-BCAEXTENDED2:17:00
MX-BCALATEST0:00:00
MX-BCAORIGINAL1:17:00
MX-BCAPRIMARY1:09:00
MX-BCSBID CLOSE1:11:00
MX-BCSDELTA0:00:00
MX-BCSENDOFDAY1:17:00
MX-BCSEXTENDED2:17:00
MX-BCSLATEST0:00:00
MX-BCSORIGINAL1:17:00
MX-BCSPRIMARY1:09:00
MX-SINBID CLOSE1:11:00
MX-SINDELTA0:00:00
MX-SINENDOFDAY1:17:00
MX-SINEXTENDED2:17:00
MX-SINLATEST0:00:00
MX-SINORIGINAL1:17:00
MX-SINPRIMARY1:09:00
NEISOPRIMARY1:09:00
NEISOBID CLOSE1:12:00
NEISOORIGINAL1:17:00
NEISODELTA0:00:00
NEISOENDOFDAY1:17:00
NEISOEXTENDED2:17:00
NEISOLATEST0:00:00
NYISOPRIMARY1:09:00
NYISODELTA0:00:00
NYISOEXTENDED2:17:00
NYISOLATEST0:00:00
NYISOBID CLOSE1:05:00
NYISOORIGINAL1:17:00
PJMISOPRIMARY1:09:00
PJMISOORIGINAL1:17:00
PJMISOBID CLOSE1:10:00
PJMISOLATEST0:00:00
PJMISOEXTENDED2:17:00
PJMISODELTA0:00:00
PJMISOICE CLOSE1:18:00
SPPORIGINAL1:17:00
SPPBID CLOSE1:10:00
SPPISOBID CLOSE1:09:30
SPPISOENDOFDAY1:17:00
SPPISOPRIMARY1:09:00
SPPISODELTA0:00:00
SPPISOLATEST0:00:00
SPPISOORIGINAL1:17:00
SPPISOEXTENDED2:17:00