battery_optimizer.de.ev.battery_optimization#

Classes

EVDEBatteryOptimizer(*args, request_id[, ...])

class battery_optimizer.de.ev.battery_optimization.EVDEBatteryOptimizer(*args, 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, elastic_min_power_constraints_kw=None)#

Bases: EVDERequest, DEBatteryOptimizer

Parameters:
add_use_case_specific_constraints()#

Add use case specific constraints to the dataframe.

Args:

df (pd.DataFrame): DataFrame containing the optimization data.

Returns:

pd.DataFrame: DataFrame with added use case specific constraints.

create_charge_unavailability_constraints(problem, variables)#
Parameters:
  • problem (LpProblem)

  • variables (DataFrame)

create_discharge_unavailability_constraints(problem, variables)#
Parameters:
  • problem (LpProblem)

  • variables (DataFrame)

create_minimum_charging_power_constraints(problem, variables, conflict_timestamps=None)#
Parameters:
  • problem (LpProblem)

  • variables (DataFrame)

  • conflict_timestamps (set | None)

create_minimum_discharging_power_constraints(problem, variables, conflict_timestamps=None)#
Parameters:
  • problem (LpProblem)

  • variables (DataFrame)

  • conflict_timestamps (set | None)

get_objective_pnl(variables, problem_solved=False, markets=None)#

Computes the objective function for the optimization problem. The objective function is the sum of the commodity revenue from energy products delivery to the grid, minus the commodity cost for charging from the grid, and the penalty for imbalance.

Parameters:

variables (DataFrame)

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

model_post_init(context, /)#

We need to both initialize private attributes and call the user-defined model_post_init method.

Parameters:
Return type:

None