battery_optimizer.de.request#
Classes
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Expected charge and discharge energy of the flex markets for a given asset, in MWh per marketed MW. |
|
SOC reservation of flex markets for a given asset. |
- class battery_optimizer.de.request.AFRRCapacityParameters(*, delivery_duration_buffer_perc=1.0, max_marketable_power_factor=1.0, prequalified_power_kW=None, delivery_duration_sec=3600.0)#
Bases:
AFRRParameters- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.AFRREnergyParameters(*, delivery_duration_buffer_perc=1.0, max_marketable_power_factor=1.0, prequalified_power_kW=None, delivery_duration_sec=900, activation_lookback_no_settlement_periods=None)#
Bases:
AFRRParameters- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.AFRRParameters(*, delivery_duration_buffer_perc=1.0, max_marketable_power_factor=1.0, prequalified_power_kW=None)#
Bases:
BaseModel- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- prevent_direct_instantiation()#
- class battery_optimizer.de.request.DEAsset(*, asset_id='Unique ID of the asset', battery_parameters, battery_initial_conditions, battery_marketed, battery_availabilities, price_forecast, price_buckets=None, strategy_optimization, asset_states=[], skipped_validations={'ensure_battery_marketed_respects_battery_parameters'}, battery_commercials=Empty DataFrame Columns: [] Index: [], flex_markets_energy_throughput=Empty DataFrame Columns: [] Index: [], flex_markets_soc_reservation=Empty DataFrame Columns: [] Index: [])#
Bases:
Asset- Parameters:
battery_parameters (BatteryParameters)
battery_initial_conditions (DEBatteryInitialConditions)
battery_marketed (list[DEBatteryMarketed] | DataFrame)
battery_availabilities (list[BatteryAvailability] | DataFrame)
price_forecast (list[DEPriceForecast] | DataFrame)
price_buckets (Dict[datetime, PriceBuckets] | None)
strategy_optimization (DEStrategyOptimization)
asset_states (list[AssetState] | DataFrame | None)
battery_commercials (list[DEBatteryCommercials] | DataFrame | None)
flex_markets_energy_throughput (list[FlexMarketsEnergyThroughput] | DataFrame | None)
flex_markets_soc_reservation (list[FlexMarketsSocReservation] | DataFrame | None)
- property all_markets#
- battery_commercials: list[DEBatteryCommercials] | DataFrame | None#
- battery_initial_conditions: DEBatteryInitialConditions#
- battery_marketed: list[DEBatteryMarketed] | DataFrame#
- property capacity_products#
- property day_ahead_products#
- property energy_products#
- flex_markets_energy_throughput: list[FlexMarketsEnergyThroughput] | DataFrame | None#
- flex_markets_soc_reservation: list[FlexMarketsSocReservation] | DataFrame | None#
- property frequency_markets#
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- price_forecast: list[DEPriceForecast] | DataFrame#
- strategy_optimization: DEStrategyOptimization#
- class battery_optimizer.de.request.DEBatteryCommercials(*, start, min_revenue_per_intraday_sell=0.01, min_revenue_per_virtual_wholesale_sell=0.01, min_revenue_per_epexIDA1_sell=0.01, min_revenue_per_epexDA_sell=0.01)#
Bases:
BatteryCommercials- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.DEBatteryInitialConditions(*, initial_soe, initial_soe_kwh=None, perform_initial_soe_checks=False, initial_soe_low_kwh=None, initial_soe_high_kwh=None, last_timestamp_initial_soe_scenarios_considered=None)#
Bases:
BatteryInitialConditions- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.DEBatteryMarketed(*, start, bought_intraday_kw, sold_intraday_kw, bought_virtual_wholesale_kw=0.0, sold_virtual_wholesale_kw=0.0, sold_epexIDA1_kw=0.0, bought_epexIDA1_kw=0.0, sold_epexDA_kw=0.0, bought_epexDA_kw=0.0, fcr_kw=0.0, afrr_capacity_pos_kw=0.0, afrr_capacity_neg_kw=0.0, afrr_energy_pos_kw=0.0, afrr_energy_neg_kw=0.0)#
Bases:
BatteryMarketed- Parameters:
start (datetime)
bought_intraday_kw (float)
sold_intraday_kw (float)
bought_virtual_wholesale_kw (float)
sold_virtual_wholesale_kw (float)
sold_epexIDA1_kw (float)
bought_epexIDA1_kw (float)
sold_epexDA_kw (float)
bought_epexDA_kw (float)
fcr_kw (float)
afrr_capacity_pos_kw (float)
afrr_capacity_neg_kw (float)
afrr_energy_pos_kw (float)
afrr_energy_neg_kw (float)
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.DEPriceForecast(*, start, intraday=None, intraday_sell=None, intraday_buy=None, virtual_wholesale=None, virtual_wholesale_sell=None, virtual_wholesale_buy=None, epexIDA1=None, epexIDA1_sell=None, epexIDA1_buy=None, epexDA=None, epexDA_sell=None, epexDA_buy=None, fcr=None, afrr_capacity_pos=None, afrr_capacity_neg=None, afrr_energy_pos=None, afrr_energy_neg=None)#
Bases:
PriceForecast- Parameters:
start (datetime)
intraday (float | None)
intraday_sell (float | None)
intraday_buy (float | None)
virtual_wholesale (float | None)
virtual_wholesale_sell (float | None)
virtual_wholesale_buy (float | None)
epexIDA1 (float | None)
epexIDA1_sell (float | None)
epexIDA1_buy (float | None)
epexDA (float | None)
epexDA_sell (float | None)
epexDA_buy (float | None)
fcr (float | None)
afrr_capacity_pos (float | None)
afrr_capacity_neg (float | None)
afrr_energy_pos (float | None)
afrr_energy_neg (float | None)
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.DERequest(*, request_id, country=Country.DE, user_id, request_creation_time, elastic_filter=False, already_auctioned_as_constants=False, asset, verbose=False, epsilon=1e-06, commercial_objective=CommercialObjective(commercial_columns=['commodity_revenue', 'commodity_cost']), multiplier_buy_sell_exceed_limit=10.0, upper_bound_risk_increment=None, imbalance=Imbalance(imbalance_cost_per_MWh=1000000.0, min_imbalance_cost_per_MWh=100000.0, imbalance_cost_shaping=True, provide_imbalance_cost_in_result=False), solve_optimization_problem_max_seconds=90.0, intraday_strategy=IntradayStrategy(name=<IntradayStrategyName.vwap: 'vwap'>, delivery_length=<IntradayDeliveryLength.quarter_hour: 'QuarterHour'>, tradeable_time_window_minutes=NaT), intraday_result_aggregation=IntradayResultAggregation(name=<IntradayResultAggregationName.minmax: 'minmax'>, no_buckets=1), objective=Objective(name=<ObjectiveName.pnl: 'pnl'>), solver_settings=SolverSettings(gapRel=0.01), do_input_for_intraday_bucketing_correct_bucket=True, elastic_soe_constraints=False, global_max_charging_power_kw=None, global_max_discharging_power_kw=None, feature_flags=FeatureFlags(return_pickled_optimizer=False, perform_check_battery_marketed_is_in_correct_unit=True), use_case=UseCase.BESS)#
Bases:
Request- Parameters:
request_id (str)
country (Country)
request_creation_time (datetime)
elastic_filter (bool)
already_auctioned_as_constants (bool)
asset (DEAsset)
verbose (bool)
epsilon (float)
commercial_objective (CommercialObjective)
multiplier_buy_sell_exceed_limit (Annotated[float, Ge(ge=0.0)])
upper_bound_risk_increment (float | dict | UpperBoundRiskIncrement | None)
imbalance (Imbalance)
solve_optimization_problem_max_seconds (float)
intraday_strategy (IntradayStrategy)
intraday_result_aggregation (IntradayResultAggregation)
objective (Objective)
solver_settings (SolverSettings)
do_input_for_intraday_bucketing_correct_bucket (bool)
elastic_soe_constraints (bool)
global_max_charging_power_kw (float | None)
global_max_discharging_power_kw (float | None)
feature_flags (FeatureFlags)
use_case (UseCase)
- adapt_min_max_soe_kwh_to_initial_soe_scenarios()#
- property capacity_product_variables#
- property capacity_products#
- check_if_prequalified_power_kW_is_set()#
- property energy_markets#
- ensure_flex_markets_energy_throughput_default()#
- ensure_flex_markets_soc_reservation_default()#
- ensure_only_one_of_soc_reservation_or_energy_throughput_is_set_per_time_stamp()#
- initialize_optional_time_series_input()#
- intraday_strategy: IntradayStrategy#
- property max_soe_kwh_initial_soe_adjusted#
- property min_soe_kwh_initial_soe_adjusted#
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.DEStrategyOptimization(*, frequency_min, horizon, markets={}, optimization_id=None, fcr_parameters=FCRParameters(delivery_duration_sec=Timedelta('0 days 00:15:00'), delivery_duration_buffer_perc=1.3333333333333333, max_marketable_power_factor=1.25, prequalified_power_kW=None), afrr_capacity_pos_parameters=AFRRCapacityParameters(delivery_duration_buffer_perc=1.0, max_marketable_power_factor=1.0, prequalified_power_kW=None, delivery_duration_sec=Timedelta('0 days 01:00:00')), afrr_capacity_neg_parameters=AFRRCapacityParameters(delivery_duration_buffer_perc=1.0, max_marketable_power_factor=1.0, prequalified_power_kW=None, delivery_duration_sec=Timedelta('0 days 01:00:00')), afrr_energy_pos_parameters=AFRREnergyParameters(delivery_duration_buffer_perc=1.0, max_marketable_power_factor=1.0, prequalified_power_kW=None, delivery_duration_sec=Timedelta('0 days 00:15:00'), activation_lookback_no_settlement_periods=None), afrr_energy_neg_parameters=AFRREnergyParameters(delivery_duration_buffer_perc=1.0, max_marketable_power_factor=1.0, prequalified_power_kW=None, delivery_duration_sec=Timedelta('0 days 00:15:00'), activation_lookback_no_settlement_periods=None))#
Bases:
StrategyOptimization- Parameters:
horizon (OptimizationHorizon)
optimization_id (str | None)
fcr_parameters (FCRParameters | None)
afrr_capacity_pos_parameters (AFRRCapacityParameters | None)
afrr_capacity_neg_parameters (AFRRCapacityParameters | None)
afrr_energy_pos_parameters (AFRREnergyParameters | None)
afrr_energy_neg_parameters (AFRREnergyParameters | None)
- afrr_capacity_neg_parameters: AFRRCapacityParameters | None#
- afrr_capacity_pos_parameters: AFRRCapacityParameters | None#
- afrr_energy_neg_parameters: AFRREnergyParameters | None#
- afrr_energy_pos_parameters: AFRREnergyParameters | None#
- fcr_parameters: FCRParameters | None#
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.FCRParameters(*, delivery_duration_sec=900, delivery_duration_buffer_perc=1.3333333333333333, max_marketable_power_factor=1.25, prequalified_power_kW=None)#
Bases:
BaseModel- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.FlexMarketsEnergyThroughput(*, start, fcr_discharge_MWh_per_MW=None, fcr_charge_MWh_per_MW=None, afrr_neg_charge_MWh_per_MW=None, afrr_pos_discharge_MWh_per_MW=None)#
Bases:
BaseModelExpected charge and discharge energy of the flex markets for a given asset, in MWh per marketed MW. These throughputs are added to the battery SoC balance and therefore adapt the SoE target of the battery at the end of each settlement period.
- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class battery_optimizer.de.request.FlexMarketsSocReservation(*, start, afrr_energy_neg_charge_soc_reservation=1.0, afrr_energy_pos_discharge_soc_reservation=1.0)#
Bases:
BaseModelSOC reservation of flex markets for a given asset. The values influence the available max soe and min soe of the battery.
- Parameters:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'ignore', 'frozen': False, 'json_encoders': {<class 'datetime.datetime'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timedeltas.Timedelta'>: <function BaseModel.<lambda>>, <class 'pandas._libs.tslibs.timestamps.Timestamp'>: <function BaseModel.<lambda>>, <class 'pandas.core.frame.DataFrame'>: <function BaseModel.<lambda>>, <class 'pandas.core.series.Series'>: <function BaseModel.<lambda>>}, 'validate_default': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].