battery_optimizer.de.request#

Classes

AFRRCapacityParameters(*[, ...])

AFRREnergyParameters(*[, ...])

AFRRParameters(*[, ...])

DEAsset(*[, asset_id, price_buckets, ...])

DEBatteryCommercials(*, start[, ...])

DEBatteryInitialConditions(*, initial_soe[, ...])

DEBatteryMarketed(*, start, ...[, ...])

DEPriceForecast(*, start[, intraday, ...])

DERequest(*, request_id[, country, ...])

DEStrategyOptimization(*, frequency_min, horizon)

FCRParameters(*[, delivery_duration_sec, ...])

FlexMarketsEnergyThroughput(*, start[, ...])

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:
  • delivery_duration_buffer_perc (Annotated[float, Ge(ge=1.0)])

  • max_marketable_power_factor (float)

  • prequalified_power_kW (Annotated[float | None, Ge(ge=0.0)])

  • delivery_duration_sec (int | str | Timedelta)

delivery_duration_sec: int | str | Timedelta#
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)#

Bases: AFRRParameters

Parameters:
  • delivery_duration_buffer_perc (Annotated[float, Ge(ge=1.0)])

  • max_marketable_power_factor (float)

  • prequalified_power_kW (Annotated[float | None, Ge(ge=0.0)])

  • delivery_duration_sec (int | str | Timedelta)

delivery_duration_sec: int | str | Timedelta#
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:
delivery_duration_buffer_perc: float#
max_marketable_power_factor: 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].

prequalified_power_kW: float | None#
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: [])#

Bases: Asset

Parameters:
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#
property frequency_markets#
handle_country_specific_market_already_auctioned(market)#
Parameters:

market (str)

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_epexIDA1_sell=0.01, min_revenue_per_epexDA_sell=0.01)#

Bases: BatteryCommercials

Parameters:
min_revenue_per_epexDA_sell: float#
min_revenue_per_epexIDA1_sell: 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.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:
initial_soe_high_kwh: float | None#
initial_soe_low_kwh: float | None#
last_timestamp_initial_soe_scenarios_considered: datetime | 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.DEBatteryMarketed(*, start, bought_intraday_kw, sold_intraday_kw, 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:
afrr_capacity_neg_kw: float#
afrr_capacity_pos_kw: float#
afrr_energy_neg_kw: float#
afrr_energy_pos_kw: float#
bought_epexDA_kw: float#
bought_epexIDA1_kw: float#
fcr_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].

sold_epexDA_kw: float#
sold_epexIDA1_kw: float#
class battery_optimizer.de.request.DEPriceForecast(*, start, intraday=None, intraday_sell=None, intraday_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)

  • 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)

afrr_capacity_neg: float | None#
afrr_capacity_pos: float | None#
afrr_energy_neg: float | None#
afrr_energy_pos: float | None#
epexDA: float | None#
epexDA_buy: float | None#
epexDA_sell: float | None#
epexIDA1: float | None#
epexIDA1_buy: float | None#
epexIDA1_sell: float | None#
fcr: 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=True, 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), 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), use_case=UseCase.BESS)#

Bases: Request

Parameters:
adapt_min_max_soe_kwh_to_initial_soe_scenarios()#
asset: DEAsset#
property capacity_product_variables#
property capacity_products#
check_if_prequalified_power_kW_is_set()#
country: Country#
property energy_markets#
ensure_flex_markets_energy_throughput_default()#
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].

use_case: UseCase#
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')), 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')))#

Bases: StrategyOptimization

Parameters:
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:
  • delivery_duration_sec (int | str | Timedelta)

  • delivery_duration_buffer_perc (Annotated[float, Ge(ge=1.0), Le(le=2.0)])

  • max_marketable_power_factor (float)

  • prequalified_power_kW (Annotated[float | None, Ge(ge=0.0)])

delivery_duration_buffer_perc: float#
delivery_duration_sec: int | str | Timedelta#
max_marketable_power_factor: 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].

prequalified_power_kW: float | None#
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: BaseModel

Parameters:
afrr_neg_charge_MWh_per_MW: float | None#
afrr_pos_discharge_MWh_per_MW: float | None#
fcr_charge_MWh_per_MW: float | None#
fcr_discharge_MWh_per_MW: 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].

start: datetime#