Load Components
There are two types of load data needed: (1) hourly load profiles and (2) annual load forecast. The hourly load profiles are scaled by the annual load forecast to the modeling year of interest. The model will scale up the NN load profile using linear scaling algorithms:
Scale to energy only: $load_{new}= \dfrac{energy_{new}}{energy_{old}}⋅load_{old}$
Scale to peak only: $load_{new}= \dfrac{peak_{new}}{peak_{old}⋅load_{old}}$
Scale to peak & energy*: $$load_{new}= m \cdot load_{old} + (peak_{new} - m \cdot peak_{old} )$$ where $$ m = (energy_{new} -8766 \cdot peak_{new})/(energy_{old} -8766 \cdot peak_{old}) $$
Multiple load components can be added together in Recap to build up different future loads (e.g., “BAU” vs.
“Electrification”).
Load Tab Layout in UI
- class Load
- Fields:
annual_energy_forecast (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)
annual_energy_policies (dict[str, new_modeling_toolkit.core.linkage.AllToPolicy])
annual_peak_forecast (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)
devices (dict[str, new_modeling_toolkit.core.linkage.Linkage])
emissions_policies (dict[str, new_modeling_toolkit.core.linkage.AllToPolicy])
energy_demand_subsectors (dict[str, new_modeling_toolkit.core.linkage.Linkage])
erm_policies (dict[str, new_modeling_toolkit.core.linkage.AllToPolicy])
hourly_energy_policies (dict[str, new_modeling_toolkit.core.linkage.AllToPolicy])
include (Annotated[bool, Metadata(category=FieldCategory.BUILD)])
model_year_profiles (dict[int, new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries])
prm_policies (dict[str, new_modeling_toolkit.core.linkage.AllToPolicy])
profile (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)
profile_model_years (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)
reserves (dict[str, new_modeling_toolkit.core.linkage.LoadToReserve])
td_losses_adjustment (new_modeling_toolkit.core.temporal.timeseries.NumericTimeseries | None)
zones (dict[str, new_modeling_toolkit.core.linkage.LoadToZone])
- field annual_energy_forecast: NumericTimeseries | None = None
- Constraints:
category = FieldCategory.OPERATIONS
units = hour * megawatt
excel_short_title = Forecast
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field annual_energy_policies: dict[str, AllToPolicy] [Optional]
- field annual_peak_forecast: NumericTimeseries | None = None
- Constraints:
category = FieldCategory.OPERATIONS
units = megawatt
excel_short_title = Peak
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field attr_path: str | pathlib.Path | None = PosixPath('/home/docs/checkouts/readthedocs.org/user_builds/e3-resolve/checkouts/latest/docs/source')
the path to the attributes file
- field devices: dict[str, Linkage] [Optional]
- field emissions_policies: dict[str, AllToPolicy] [Optional]
- field energy_demand_subsectors: dict[str, Linkage] [Optional]
- field erm_policies: dict[str, AllToPolicy] [Optional]
- field hourly_energy_policies: dict[str, AllToPolicy] [Optional]
- field include: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = True
Include component in system.
- Constraints:
category = FieldCategory.BUILD
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field model_year_profiles: dict[int, NumericTimeseries] = {}
Model year profiles scaled to annual peak and/or annual energy forecasts
- field prm_policies: dict[str, AllToPolicy] [Optional]
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field profile: NumericTimeseries | None = None
Weather year(s) load profile to be scaled. Must have either weather year OR model year profile, but not both.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field profile_model_years: NumericTimeseries | None = None
Model year(s) load profile to be scaled. Datetime index should include modeled years. Must have either weather year OR model year profile, but not both.
- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = Modeled Year Profile
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field reserves: dict[str, LoadToReserve] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- field scale_by_capacity: bool = False (alias 'scale_by_peak')
If true, calculate model year profiles by scaling profile to median annual peak
- field scale_by_energy: bool = False
If true, calculate model year profiles by scaling profile to mean annual energy
- field td_losses_adjustment: NumericTimeseries | None [Optional]
T&D loss adjustment to gross up to system-level loads. For example, a DER may be able to serve 8% more load (i.e., 1.08) than an equivalent bulk system resource due to T&D losses. Adjustment factor is directly multiplied against load (as opposed to 1 / (1 +
td_losses_adjustment
).- Constraints:
category = FieldCategory.OPERATIONS
units =
excel_short_title = T&D Factor
warning_bounds = (None, None)
show_year_headers = True
default_exclude = False
- field zones: dict[str, LoadToZone] = {}
- Constraints:
units =
excel_short_title =
warning_bounds = (None, None)
show_year_headers = True
linkage_order = to
default_exclude = False
- forecast_load(modeled_years: tuple[int, int], weather_years: tuple[int, int], custom_scalars: Series | None = None)
Calculate the scaling coefficient and scaling offset for the load series in order to scale them to any future between the first model year and last model year. The coefficient and offset is determine by the future peak load series and energy series, and the load scaling method defined by the user.
- Parameters:
modeled_years – tuple first model year to last model year
weather_years – tuple first weather year to last weather year (only used for profile_modeled_years)
custom_scalars – Optional series of scalars to be applied to annual energy forecast. Only used if scale_by_energy is true. Intended to ensure annual energy forecast is still true when weighted dispatch windows are applied.
Returns: Updated modeled_year_profile dict
- get_load(modeled_year: int, weather_year_timestamp: Timestamp)
Based on the model year, first find the future load series belonging to that model year. And based on the period and hour, query the specific hourly load for that hour in the model year. :param system: System.system. current power system :param modeled_year: int. model year being queried :param weather_year_timestamp: model hour being queried
Returns: int. load for the tp under query.
- resample_ts_attributes(modeled_years: tuple[int, int], weather_years: tuple[int, int], resample_weather_year_attributes=True, resample_non_weather_year_attributes=True)
Resample timeseries attributes to the default frequencies to make querying via slice_by_timepoint and slice_by_year more consistent later.
Downsample data by comparing against a “correct index” with the correct default_freq
If data start year > modeled start year, fill timeseries backward
Create a temporary timestamp for the first hour of the year after the modeled end year to make sure we have all the hours, minutes (e.g., 23:59:59) filled in in step (4)
Resample to fill in any data (particularly at end of timeseries) and drop temporary timestamp from (3)
- revalidate()
Abstract method to run additional validations after Linkage.announce_linkage_to_instances.
- static scale_load(profile: NumericTimeseries, to_peak: bool | float, to_energy: bool | float, td_losses_adjustment: float, leap_year: bool) NumericTimeseries
Scale timeseries by energy and/or median peak.
Scaling to energy assumes
to_energy
forecast value will match whether it is/is not a leap year. In other words, the energy forecast for a leap day includes an extra day’s worth of energy.- Parameters:
profile – Hourly timeseries to be scaled
to_peak – Median annual peak to be scaled to
to_energy – Mean annual energy to be scaled to
td_losses_adjustment – T&D losses adjustment (simple scalar on load profile)
leap_year – If year being scaled to is a leap year (affecting energy scaling)
- Returns:
Scaled hourly timeseries
- Return type:
new_profile