Added notebook to sample from predictions and load model
This commit is contained in:
454
src/policies/policy_tester.ipynb
Normal file
454
src/policies/policy_tester.ipynb
Normal file
File diff suppressed because one or more lines are too long
@@ -17,32 +17,18 @@ class Battery:
|
||||
self.power = power
|
||||
self.charge_cycles = 0
|
||||
|
||||
self.charging = False
|
||||
self.discharging = False
|
||||
|
||||
def simulate(self):
|
||||
"""
|
||||
Simulate the battery for one time step (one quarter of an hour)
|
||||
"""
|
||||
if self.charging:
|
||||
return self.charge()
|
||||
elif self.discharging:
|
||||
return self.discharge()
|
||||
return 0
|
||||
|
||||
def discharge(self):
|
||||
"""
|
||||
Discharge the battery by one time step (one quarter of an hour)
|
||||
"""
|
||||
if self.current_charge == 0:
|
||||
return 0
|
||||
self.discharging = True
|
||||
self.current_charge -= self.power / 4
|
||||
|
||||
self.charge_cycles += 1/16
|
||||
|
||||
if self.current_charge <= 0:
|
||||
self.current_charge = 0
|
||||
self.discharging = False
|
||||
self.charge_cycles += 1
|
||||
|
||||
return self.power / 4
|
||||
|
||||
@@ -52,12 +38,12 @@ class Battery:
|
||||
"""
|
||||
if self.current_charge == self.capacity:
|
||||
return 0
|
||||
self.charging = True
|
||||
self.current_charge += self.power / 4
|
||||
|
||||
self.charge_cycles += 1/16
|
||||
|
||||
if self.current_charge >= self.capacity:
|
||||
self.current_charge = self.capacity
|
||||
self.charging = False
|
||||
|
||||
return self.power / 4
|
||||
|
||||
@@ -89,7 +75,7 @@ class BaselinePolicy():
|
||||
imbalance_prices = imbalance_prices.loc[imbalance_prices['DateTime'].dt.year >= 2020]
|
||||
else:
|
||||
imbalance_prices = imbalance_prices.loc[imbalance_prices['DateTime'].dt.year == 2023]
|
||||
imbalance_prices = imbalance_prices.sort_values(by=['DateTime'])
|
||||
imbalance_prices = imbalance_prices.sort_values(by=['DateTime'], ascending=True)
|
||||
return imbalance_prices
|
||||
|
||||
def get_train_score(self, charge_treshold, discharge_treshold):
|
||||
@@ -98,42 +84,53 @@ class BaselinePolicy():
|
||||
def get_test_score(self, charge_treshold, discharge_treshold):
|
||||
return self.get_score(self.test_data, charge_treshold, discharge_treshold)
|
||||
|
||||
# if price is below treshold -> charge battery: total_profit -= charge * price
|
||||
# if price is below charging treshold (cheap charging) -> charge battery: total_profit -= charge * price
|
||||
# if price is above treshold -> discharge battery: total_profit += discharge * price
|
||||
def get_score(self, df, charge_treshold, discharge_treshold):
|
||||
self.battery.reset()
|
||||
total_profit = 0
|
||||
total_charging_cost = 0
|
||||
total_discharging_profit = 0
|
||||
mean_charging_price = 0
|
||||
mean_discharging_price = 0
|
||||
number_of_charges = 0
|
||||
number_of_discharges = 0
|
||||
|
||||
for index, row in df.iterrows():
|
||||
if self.battery.charging:
|
||||
total_profit -= self.battery.simulate() * row['Positive imbalance price']
|
||||
elif self.battery.discharging:
|
||||
total_profit += self.battery.simulate() * row['Positive imbalance price']
|
||||
else:
|
||||
if row['Positive imbalance price'] < charge_treshold:
|
||||
total_profit -= self.battery.charge() * row['Positive imbalance price']
|
||||
elif row['Positive imbalance price'] > discharge_treshold:
|
||||
total_profit += self.battery.discharge() * row['Positive imbalance price']
|
||||
if row['Positive imbalance price'] < charge_treshold:
|
||||
total_charging_cost += self.battery.charge() * row['Positive imbalance price']
|
||||
mean_charging_price += row['Positive imbalance price']
|
||||
number_of_charges += 1
|
||||
elif row['Positive imbalance price'] > discharge_treshold:
|
||||
total_discharging_profit += self.battery.discharge() * row['Positive imbalance price']
|
||||
mean_discharging_price += row['Positive imbalance price']
|
||||
number_of_discharges += 1
|
||||
|
||||
return total_profit, self.battery.charge_cycles
|
||||
return total_charging_cost, total_discharging_profit, self.battery.charge_cycles, mean_charging_price / number_of_charges, mean_discharging_price / number_of_discharges
|
||||
|
||||
def treshold_scores(self, charge_tresholds, discharge_tresholds):
|
||||
df = pd.DataFrame(columns=["Charge treshold", "Discharge treshold", "Total Profit", "Charge cycles"])
|
||||
|
||||
df = pd.DataFrame(columns=["Charge treshold", "Discharge treshold", "Charging Cost", "Discharging Profit", "Total Profit", "Charge cycles", "Mean charging price", "Mean discharging price"])
|
||||
df_test = pd.DataFrame(columns=["Charge treshold", "Discharge treshold", "Charging Cost", "Discharging Profit", "Total Profit", "Charge cycles", "Mean charging price", "Mean discharging price"])
|
||||
for charge_treshold, discharge_treshold in tqdm(itertools.product(charge_tresholds, discharge_tresholds)):
|
||||
total_profit, charge_cycles = self.get_train_score(charge_treshold, discharge_treshold)
|
||||
df = pd.concat([df, pd.DataFrame([[charge_treshold, discharge_treshold, total_profit, charge_cycles]], columns=["Charge treshold", "Discharge treshold", "Total Profit", "Charge cycles"])])
|
||||
total_charging_cost, total_discharge_profit, charge_cycles, mean_charging_price, mean_discharging_price = self.get_train_score(charge_treshold, discharge_treshold)
|
||||
df = pd.concat([df, pd.DataFrame([[charge_treshold, discharge_treshold, total_charging_cost, total_discharge_profit, total_discharge_profit - total_charging_cost, charge_cycles, mean_charging_price, mean_discharging_price]], columns=["Charge treshold", "Discharge treshold", "Charging Cost", "Discharging Profit", "Total Profit", "Charge cycles", "Mean charging price", "Mean discharging price"])])
|
||||
|
||||
total_charging_cost, total_discharge_profit, charge_cycles, mean_charging_price, mean_discharging_price = self.get_test_score(charge_treshold, discharge_treshold)
|
||||
df_test = pd.concat([df_test, pd.DataFrame([[charge_treshold, discharge_treshold, total_charging_cost, total_discharge_profit, total_discharge_profit - total_charging_cost, charge_cycles, mean_charging_price, mean_discharging_price]], columns=["Charge treshold", "Discharge treshold", "Charging Cost", "Discharging Profit", "Total Profit", "Charge cycles", "Mean charging price", "Mean discharging price"])])
|
||||
|
||||
df = df.sort_values(by=['Total Profit'], ascending=False)
|
||||
return df
|
||||
|
||||
return df, df_test
|
||||
|
||||
|
||||
battery = Battery(2, 1)
|
||||
policy = BaselinePolicy(battery)
|
||||
|
||||
# charge_tresholds = [0, 50, 100, 150, 200, 250, 300, 350]
|
||||
# discharge_tresholds = [0, 50, 100, 150, 200, 250, 300, 350]
|
||||
# df = policy.treshold_scores(charge_tresholds, discharge_tresholds)
|
||||
# print(df.to_markdown())
|
||||
charge_tresholds = np.arange(-100, 250, 50)
|
||||
discharge_tresholds = np.arange(-100, 250, 50)
|
||||
|
||||
print(policy.get_test_score(150, 100))
|
||||
df, df_test = policy.treshold_scores(charge_tresholds, discharge_tresholds)
|
||||
print(df.to_markdown())
|
||||
|
||||
print(df_test.to_markdown())
|
||||
|
||||
# print(policy.get_test_score(150, 100))
|
||||
Reference in New Issue
Block a user