Compare commits
	
		
			14 Commits
		
	
	
		
			060fa5bff1
			...
			0.0.7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | df2f953678 | ||
|  | 3740136d7c | ||
|  | e04e01e943 | ||
|  | 9f472b4bf4 | ||
|  | 127f005dcd | ||
|  | c5edf456c5 | ||
|  | d8ece46e14 | ||
|  | 566ebca6cd | ||
|  | c8c37b756c | ||
|  | 4f1a47d505 | ||
|  | ad9b5e6a19 | ||
|  | 33871fba77 | ||
|  | 9d143399ed | ||
|  | 72d4ce811e | 
| @@ -21,6 +21,13 @@ class EnergySystem: | |||||||
|         self.summer_week_soc = [] |         self.summer_week_soc = [] | ||||||
|         self.autumn_week_soc = [] |         self.autumn_week_soc = [] | ||||||
|         self.winter_week_soc = [] |         self.winter_week_soc = [] | ||||||
|  |         self.factory_demand = [] | ||||||
|  |         self.buy_price_kWh = [] | ||||||
|  |         self.sell_price_kWh = [] | ||||||
|  |         self.pv_generated_kWh = [] | ||||||
|  |         self.grid_need_power_kW = [] | ||||||
|  |         self.time = [] | ||||||
|  |         self.ess_rest = 0 | ||||||
|         self.granularity = 4 |         self.granularity = 4 | ||||||
|         self.season_step = self.granularity * 24 * 7 * 12 |         self.season_step = self.granularity * 24 * 7 * 12 | ||||||
|         self.season_start= self.granularity * 24 * 7 * 2 |         self.season_start= self.granularity * 24 * 7 * 2 | ||||||
| @@ -37,9 +44,12 @@ class EnergySystem: | |||||||
|         total_benefit = 0 |         total_benefit = 0 | ||||||
|         total_netto_benefit = 0 |         total_netto_benefit = 0 | ||||||
|         total_gen = 0 |         total_gen = 0 | ||||||
|  |         net_grid = 0. | ||||||
|         for index, row in data.iterrows(): |         for index, row in data.iterrows(): | ||||||
|             time = row['time'] |             time = row['time'] | ||||||
|             sunlight_intensity = row['sunlight'] |             self.time.append(time) | ||||||
|  |             # sunlight_intensity = row['sunlight'] | ||||||
|  |             pv_yield = row['PV yield[kW/kWp]'] | ||||||
|             factory_demand = row['demand'] |             factory_demand = row['demand'] | ||||||
|             electricity_price = row['buy'] |             electricity_price = row['buy'] | ||||||
|             sell_price = row['sell'] |             sell_price = row['sell'] | ||||||
| @@ -55,8 +65,13 @@ class EnergySystem: | |||||||
|                 soc = self.ess.storage / self.ess.capacity |                 soc = self.ess.storage / self.ess.capacity | ||||||
|                 self.hour_stored_2.append(soc) |                 self.hour_stored_2.append(soc) | ||||||
|  |  | ||||||
|             generated_pv_power = self.pv.capacity * sunlight_intensity  # 生成的功率,单位 kW |             generated_pv_power = self.pv.capacity * pv_yield# 生成的功率,单位 kW | ||||||
|             generated_pv_energy = generated_pv_power * time_interval * self.pv.loss  # 生成的能量,单位 kWh |             generated_pv_energy = generated_pv_power * time_interval * self.pv.loss  # 生成的能量,单位 kWh | ||||||
|  |             self.pv_generated_kWh.append(generated_pv_energy) | ||||||
|  |             self.factory_demand.append(factory_demand) | ||||||
|  |             self.buy_price_kWh.append(electricity_price) | ||||||
|  |             self.sell_price_kWh.append(sell_price) | ||||||
|  |  | ||||||
|             self.generated += generated_pv_energy |             self.generated += generated_pv_energy | ||||||
|             # pv生成的能量如果比工厂的需求要大 |             # pv生成的能量如果比工厂的需求要大 | ||||||
|             if generated_pv_energy >= factory_demand * time_interval: |             if generated_pv_energy >= factory_demand * time_interval: | ||||||
| @@ -74,6 +89,7 @@ class EnergySystem: | |||||||
|                 # 节省的能量 = 工厂需求的能量 * 时间段 |                 # 节省的能量 = 工厂需求的能量 * 时间段 | ||||||
|                 # total_energy = factory_demand * time_interval |                 # total_energy = factory_demand * time_interval | ||||||
|                 saved_energy = factory_demand * time_interval |                 saved_energy = factory_demand * time_interval | ||||||
|  |                 self.grid_need_power_kW.append(0) | ||||||
|             # pv比工厂的需求小 |             # pv比工厂的需求小 | ||||||
|             else: |             else: | ||||||
|                 # 从ess中需要的电量 = 工厂需要的电量 - pv中的电量 |                 # 从ess中需要的电量 = 工厂需要的电量 - pv中的电量 | ||||||
| @@ -89,6 +105,7 @@ class EnergySystem: | |||||||
|                     self.ess.storage -= discharging_power |                     self.ess.storage -= discharging_power | ||||||
|                     # 节省下来的能量 = pv的能量 + 放出来的能量 |                     # 节省下来的能量 = pv的能量 + 放出来的能量 | ||||||
|                     saved_energy = generated_pv_energy + discharging_power * self.ess.loss |                     saved_energy = generated_pv_energy + discharging_power * self.ess.loss | ||||||
|  |                     self.grid_need_power_kW.append(0) | ||||||
|                 else: |                 else: | ||||||
|                     # 如果存的电量不够 |                     # 如果存的电量不够 | ||||||
|                     # 需要把ess中的所有电量释放出来 |                     # 需要把ess中的所有电量释放出来 | ||||||
| @@ -105,6 +122,7 @@ class EnergySystem: | |||||||
|                     self.ess.storage = 0 |                     self.ess.storage = 0 | ||||||
|                     needed_from_grid = factory_demand * time_interval - saved_energy |                     needed_from_grid = factory_demand * time_interval - saved_energy | ||||||
|                     net_grid = min(self.grid.capacity * time_interval, needed_from_grid) * self.grid.loss |                     net_grid = min(self.grid.capacity * time_interval, needed_from_grid) * self.grid.loss | ||||||
|  |                     self.grid_need_power_kW.append(needed_from_grid * 4) | ||||||
|                     # grid_energy += net_grid |                     # grid_energy += net_grid | ||||||
|                     # total_energy += net_grid |                     # total_energy += net_grid | ||||||
|             # print(total_energy) |             # print(total_energy) | ||||||
| @@ -123,6 +141,7 @@ class EnergySystem: | |||||||
|             if index in range(week_start, week_end): |             if index in range(week_start, week_end): | ||||||
|                 self.spring_week_gen.append(generated_pv_power) |                 self.spring_week_gen.append(generated_pv_power) | ||||||
|                 self.spring_week_soc.append(self.ess.storage / self.ess.capacity) |                 self.spring_week_soc.append(self.ess.storage / self.ess.capacity) | ||||||
|  |             self.ess_rest = self.ess.storage | ||||||
|             # summer |             # summer | ||||||
|             # week_start += self.season_step |             # week_start += self.season_step | ||||||
|             # week_end += self.season_step |             # week_end += self.season_step | ||||||
|   | |||||||
							
								
								
									
										70079
									
								
								combined_data.csv
									
									
									
									
									
								
							
							
						
						
									
										70079
									
								
								combined_data.csv
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10
									
								
								config.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								config.json
									
									
									
									
									
								
							| @@ -17,12 +17,12 @@ | |||||||
|     "pv_capacities":{ |     "pv_capacities":{ | ||||||
|         "begin": 0, |         "begin": 0, | ||||||
|         "end": 50000, |         "end": 50000, | ||||||
|         "groups": 11  |         "groups":  3 | ||||||
|     }, |     }, | ||||||
|     "ess_capacities":{ |     "ess_capacities":{ | ||||||
|         "begin": 0, |         "begin": 0, | ||||||
|         "end": 100000, |         "end": 100000, | ||||||
|         "groups":  11 |         "groups":  3 | ||||||
|     }, |     }, | ||||||
|     "time_interval":{ |     "time_interval":{ | ||||||
|         "numerator": 15, |         "numerator": 15, | ||||||
| @@ -43,5 +43,11 @@ | |||||||
|         "cost": "Costs of Microgrid system [m-EUR]", |         "cost": "Costs of Microgrid system [m-EUR]", | ||||||
|         "benefit": "Financial Profit Based on Py & Ess Configuration (k-EUR / year)", |         "benefit": "Financial Profit Based on Py & Ess Configuration (k-EUR / year)", | ||||||
|         "roi": "ROI" |         "roi": "ROI" | ||||||
|  |     }, | ||||||
|  |     "data_path": { | ||||||
|  |         "pv_yield": "read_data/Serbia.csv", | ||||||
|  |         "demand": "read_data/factory_power1.csv", | ||||||
|  |         "sell": "read_data/electricity_price_data_sell.csv", | ||||||
|  |         "buy": "read_data/electricity_price_data.csv" | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -10,12 +10,12 @@ class pv_config: | |||||||
|     def get_cost_per_year(self): |     def get_cost_per_year(self): | ||||||
|         return self.capacity * self.cost_per_kW / self.lifetime |         return self.capacity * self.cost_per_kW / self.lifetime | ||||||
| class ess_config: | class ess_config: | ||||||
|     def __init__(self, capacity, cost_per_kW, lifetime, loss, charge_power, discharge_power): |     def __init__(self, capacity, cost_per_kW, lifetime, loss, charge_power, discharge_power, storage=0): | ||||||
|         self.capacity = capacity |         self.capacity = capacity | ||||||
|         self.cost_per_kW = cost_per_kW |         self.cost_per_kW = cost_per_kW | ||||||
|         self.lifetime = lifetime |         self.lifetime = lifetime | ||||||
|         self.loss = loss |         self.loss = loss | ||||||
|         self.storage = 0 |         self.storage = storage | ||||||
|         self.charge_power = charge_power |         self.charge_power = charge_power | ||||||
|         self.discharge_power = discharge_power |         self.discharge_power = discharge_power | ||||||
|     def get_cost(self): |     def get_cost(self): | ||||||
|   | |||||||
							
								
								
									
										351
									
								
								main.ipynb
									
									
									
									
									
								
							
							
						
						
									
										351
									
								
								main.ipynb
									
									
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										165
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										165
									
								
								main.py
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| #!/usr/bin/env python | #!/usr/bin/env python | ||||||
| # coding: utf-8 | # coding: utf-8 | ||||||
|  |  | ||||||
| # In[ ]: | # In[83]: | ||||||
|  |  | ||||||
|  |  | ||||||
| import os | import os | ||||||
| @@ -28,7 +28,7 @@ folder_path = 'plots' | |||||||
| clear_folder_make_ess_pv(folder_path) | clear_folder_make_ess_pv(folder_path) | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[84]: | ||||||
|  |  | ||||||
|  |  | ||||||
| import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||||||
| @@ -39,7 +39,7 @@ from EnergySystem import EnergySystem | |||||||
| from config import pv_config, grid_config, ess_config | from config import pv_config, grid_config, ess_config | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[85]: | ||||||
|  |  | ||||||
|  |  | ||||||
| import json | import json | ||||||
| @@ -53,7 +53,7 @@ with open('config.json', 'r') as f: | |||||||
|      |      | ||||||
|  |  | ||||||
| time_interval = js_data["time_interval"]["numerator"] / js_data["time_interval"]["denominator"] | time_interval = js_data["time_interval"]["numerator"] / js_data["time_interval"]["denominator"] | ||||||
| print(time_interval) | # print(time_interval) | ||||||
|  |  | ||||||
| pv_loss = js_data["pv"]["loss"] | pv_loss = js_data["pv"]["loss"] | ||||||
| pv_cost_per_kW = js_data["pv"]["cost_per_kW"] | pv_cost_per_kW = js_data["pv"]["cost_per_kW"] | ||||||
| @@ -116,7 +116,7 @@ ess_capacities = np.linspace(ess_begin, ess_end, ess_groups) | |||||||
| # overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | # overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[86]: | ||||||
|  |  | ||||||
|  |  | ||||||
| hour_demand = [] | hour_demand = [] | ||||||
| @@ -132,7 +132,7 @@ plt.savefig('plots/demand.png') | |||||||
| plt.close() | plt.close() | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[87]: | ||||||
|  |  | ||||||
|  |  | ||||||
| def draw_results(results, filename, title_benefit, annot_benefit=False, figure_size=(10, 10)): | def draw_results(results, filename, title_benefit, annot_benefit=False, figure_size=(10, 10)): | ||||||
| @@ -171,7 +171,7 @@ def draw_results(results, filename, title_benefit, annot_benefit=False, figure_s | |||||||
|     plt.savefig(filename) |     plt.savefig(filename) | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[88]: | ||||||
|  |  | ||||||
|  |  | ||||||
| def draw_roi(costs, results, filename, title_roi, days=365, annot_roi=False, figure_size=(10, 10)): | def draw_roi(costs, results, filename, title_roi, days=365, annot_roi=False, figure_size=(10, 10)): | ||||||
| @@ -184,7 +184,7 @@ def draw_roi(costs, results, filename, title_roi, days=365, annot_roi=False, fig | |||||||
|     if 0 in df.index and 0 in df.columns: |     if 0 in df.index and 0 in df.columns: | ||||||
|         df.loc[0,0] = 100 |         df.loc[0,0] = 100 | ||||||
|     df[df > 80] = 100 |     df[df > 80] = 100 | ||||||
|     print(df) |     # print(df) | ||||||
|  |  | ||||||
|     df = df.astype(float) |     df = df.astype(float) | ||||||
|     df.index = df.index / 1000 |     df.index = df.index / 1000 | ||||||
| @@ -193,7 +193,7 @@ def draw_roi(costs, results, filename, title_roi, days=365, annot_roi=False, fig | |||||||
|     df.columns = df.columns.map(int) |     df.columns = df.columns.map(int) | ||||||
|     min_value = df.min().min() |     min_value = df.min().min() | ||||||
|     max_value = df.max().max() |     max_value = df.max().max() | ||||||
|     print(max_value) |     # print(max_value) | ||||||
|     max_scale = max(abs(min_value), abs(max_value)) |     max_scale = max(abs(min_value), abs(max_value)) | ||||||
|  |  | ||||||
|     df[df.columns[-1] + 1] = df.iloc[:, -1]  |     df[df.columns[-1] + 1] = df.iloc[:, -1]  | ||||||
| @@ -219,9 +219,10 @@ def draw_roi(costs, results, filename, title_roi, days=365, annot_roi=False, fig | |||||||
|     plt.xlabel('ESS Capacity (MWh)') |     plt.xlabel('ESS Capacity (MWh)') | ||||||
|     plt.ylabel('PV Capacity (MW)') |     plt.ylabel('PV Capacity (MW)') | ||||||
|     plt.savefig(filename) |     plt.savefig(filename) | ||||||
|  |     plt.close() | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[89]: | ||||||
|  |  | ||||||
|  |  | ||||||
| def draw_cost(costs, filename, title_cost, annot_cost=False, figure_size=(10, 10)): | def draw_cost(costs, filename, title_cost, annot_cost=False, figure_size=(10, 10)): | ||||||
| @@ -253,19 +254,20 @@ def draw_cost(costs, filename, title_cost, annot_cost=False, figure_size=(10, 10 | |||||||
|     plt.xlabel('ESS Capacity (MWh)') |     plt.xlabel('ESS Capacity (MWh)') | ||||||
|     plt.ylabel('PV Capacity (MW)') |     plt.ylabel('PV Capacity (MW)') | ||||||
|     plt.savefig(filename) |     plt.savefig(filename) | ||||||
|  |     plt.close() | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[90]: | ||||||
|  |  | ||||||
|  |  | ||||||
| def draw_overload(overload_cnt, filename, title_unmet, annot_unmet=False, figure_size=(10, 10), days=365, granularity=15): | def draw_overload(overload_cnt, filename, title_unmet, annot_unmet=False, figure_size=(10, 10), days=365, granularity=15): | ||||||
|     df = overload_cnt |     df = overload_cnt | ||||||
|     print(days, granularity) |     # print(days, granularity) | ||||||
|     coef = 60 / granularity * days * 24 |     coef = 60 / granularity * days * 24 | ||||||
|     print(coef) |     # print(coef) | ||||||
|     print(df) |     # print(df) | ||||||
|     df = ( coef - df) / coef |     df = ( coef - df) / coef | ||||||
|     print(df) |     # print(df) | ||||||
|  |  | ||||||
|     df = df.astype(float) |     df = df.astype(float) | ||||||
|     df.index = df.index / 1000 |     df.index = df.index / 1000 | ||||||
| @@ -304,9 +306,10 @@ def draw_overload(overload_cnt, filename, title_unmet, annot_unmet=False, figure | |||||||
|     plt.xlabel('ESS Capacity (MWh)') |     plt.xlabel('ESS Capacity (MWh)') | ||||||
|     plt.ylabel('PV Capacity (MW)') |     plt.ylabel('PV Capacity (MW)') | ||||||
|     plt.savefig(filename) |     plt.savefig(filename) | ||||||
|  |     plt.close() | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[91]: | ||||||
|  |  | ||||||
|  |  | ||||||
| def cal_profit(es: EnergySystem, saved_money, days): | def cal_profit(es: EnergySystem, saved_money, days): | ||||||
| @@ -314,10 +317,10 @@ def cal_profit(es: EnergySystem, saved_money, days): | |||||||
|     return profit |     return profit | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[92]: | ||||||
|  |  | ||||||
|  |  | ||||||
| def generate_data(pv_capacity, pv_cost_per_kW, pv_lifetime, pv_loss, ess_capacity, ess_cost_per_kW, ess_lifetime, ess_loss, grid_capacity, grid_loss, sell_price, time_interval, data, days): | def generate_data(pv_capacity, pv_cost_per_kW, pv_lifetime, pv_loss, ess_capacity, ess_cost_per_kW, ess_lifetime, ess_loss, grid_capacity, grid_loss, sell_price, time_interval, data, days, storage=0): | ||||||
|     pv = pv_config(capacity=pv_capacity,  |     pv = pv_config(capacity=pv_capacity,  | ||||||
|                     cost_per_kW=pv_cost_per_kW, |                     cost_per_kW=pv_cost_per_kW, | ||||||
|                     lifetime=pv_lifetime,  |                     lifetime=pv_lifetime,  | ||||||
| @@ -327,7 +330,8 @@ def generate_data(pv_capacity, pv_cost_per_kW, pv_lifetime, pv_loss, ess_capacit | |||||||
|                         lifetime=ess_lifetime,  |                         lifetime=ess_lifetime,  | ||||||
|                         loss=ess_loss, |                         loss=ess_loss, | ||||||
|                         charge_power=ess_capacity, |                         charge_power=ess_capacity, | ||||||
|                         discharge_power=ess_capacity) |                         discharge_power=ess_capacity, | ||||||
|  |                         storage=storage) | ||||||
|     grid = grid_config(capacity=grid_capacity,  |     grid = grid_config(capacity=grid_capacity,  | ||||||
|                         grid_loss=grid_loss, |                         grid_loss=grid_loss, | ||||||
|                         sell_price= sell_price) |                         sell_price= sell_price) | ||||||
| @@ -338,34 +342,96 @@ def generate_data(pv_capacity, pv_cost_per_kW, pv_lifetime, pv_loss, ess_capacit | |||||||
|     results = cal_profit(energySystem, benefit, days) |     results = cal_profit(energySystem, benefit, days) | ||||||
|     overload_cnt = energySystem.overload_cnt |     overload_cnt = energySystem.overload_cnt | ||||||
|     costs = energySystem.ess.capacity * energySystem.ess.cost_per_kW + energySystem.pv.capacity * energySystem.pv.cost_per_kW |     costs = energySystem.ess.capacity * energySystem.ess.cost_per_kW + energySystem.pv.capacity * energySystem.pv.cost_per_kW | ||||||
|     return (results, overload_cnt, costs, netto_benefit, gen_energy, energySystem.generated) |     return (results,  | ||||||
|  |             overload_cnt, | ||||||
|  |             costs,  | ||||||
|  |             netto_benefit,  | ||||||
|  |             gen_energy,  | ||||||
|  |             energySystem.generated, | ||||||
|  |             energySystem.ess_rest, | ||||||
|  |             energySystem.factory_demand, | ||||||
|  |             energySystem.buy_price_kWh, | ||||||
|  |             energySystem.sell_price_kWh, | ||||||
|  |             energySystem.pv_generated_kWh, | ||||||
|  |             energySystem.grid_need_power_kW, | ||||||
|  |             energySystem.time) | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: |  | ||||||
|  | # In[93]: | ||||||
|  |  | ||||||
|  |  | ||||||
|  | from tqdm import tqdm | ||||||
| months_results = [] | months_results = [] | ||||||
| months_costs = [] | months_costs = [] | ||||||
| months_overload = [] | months_overload = [] | ||||||
| months_nettos = [] | months_nettos = [] | ||||||
| months_gen_energy = [] | months_gen_energy = [] | ||||||
| months_gen_energy2 = [] | months_gen_energy2 = [] | ||||||
| for index, month_data in enumerate(months_data): | months_ess_rest = pd.DataFrame(30, index=pv_capacities, columns= ess_capacities) | ||||||
|  | months_csv_data = {} | ||||||
|  | for index, month_data in tqdm(enumerate(months_data), total=len(months_data), position=0, leave= True): | ||||||
|     results = pd.DataFrame(index=pv_capacities, columns= ess_capacities) |     results = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|     costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities) |     costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|     overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities) |     overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|     nettos = pd.DataFrame(index=pv_capacities, columns= ess_capacities) |     nettos = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|     gen_energies = pd.DataFrame(index=pv_capacities, columns= ess_capacities) |     gen_energies = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|     gen_energies2 = pd.DataFrame(index=pv_capacities, columns= ess_capacities) |     gen_energies2 = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|     for pv_capacity in pv_capacities: |     factory_demands = {} | ||||||
|  |     buy_prices= {} | ||||||
|  |     sell_prices = {} | ||||||
|  |     pv_generates = {} | ||||||
|  |     grid_need_powers = {} | ||||||
|  |     times = {} | ||||||
|  |     for pv_capacity in tqdm(pv_capacities, total=len(pv_capacities), desc=f'generating pv for month {index + 1}',position=1, leave=False): | ||||||
|  |         factory_demands[pv_capacity] = {} | ||||||
|  |         buy_prices[pv_capacity] = {} | ||||||
|  |         sell_prices[pv_capacity] = {} | ||||||
|  |         pv_generates[pv_capacity] = {} | ||||||
|  |         grid_need_powers[pv_capacity] = {} | ||||||
|  |         times[pv_capacity] = {} | ||||||
|         for ess_capacity in ess_capacities: |         for ess_capacity in ess_capacities: | ||||||
|             (result, overload, cost, netto, gen_energy, gen_energy2) = generate_data(pv_capacity=pv_capacity,pv_cost_per_kW=pv_cost_per_kW, pv_lifetime=pv_lifetime, pv_loss=pv_loss, ess_capacity=ess_capacity, ess_cost_per_kW=ess_cost_per_kW, ess_lifetime=ess_lifetime, ess_loss=ess_loss, grid_capacity=grid_capacity, grid_loss=grid_loss, sell_price=sell_price, time_interval=time_interval, data=month_data, days=months_days[index]) |             (result,  | ||||||
|  |              overload,  | ||||||
|  |              cost,  | ||||||
|  |              netto, | ||||||
|  |              gen_energy, | ||||||
|  |              gen_energy2, | ||||||
|  |              ess_rest, | ||||||
|  |              factory_demand, | ||||||
|  |              buy_price, | ||||||
|  |              sell_price, | ||||||
|  |              pv_generate, | ||||||
|  |              grid_need_power, | ||||||
|  |              time) = generate_data(pv_capacity=pv_capacity, | ||||||
|  |                         pv_cost_per_kW=pv_cost_per_kW, | ||||||
|  |                         pv_lifetime=pv_lifetime,  | ||||||
|  |                         pv_loss=pv_loss,  | ||||||
|  |                         ess_capacity=ess_capacity,  | ||||||
|  |                         ess_cost_per_kW=ess_cost_per_kW,  | ||||||
|  |                         ess_lifetime=ess_lifetime,  | ||||||
|  |                         ess_loss=ess_loss,  | ||||||
|  |                         grid_capacity=grid_capacity,  | ||||||
|  |                         grid_loss=grid_loss,  | ||||||
|  |                         sell_price=sell_price,  | ||||||
|  |                         time_interval=time_interval,  | ||||||
|  |                         data=month_data,  | ||||||
|  |                         days=months_days[index], | ||||||
|  |                         storage=months_ess_rest.loc[pv_capacity, ess_capacity]) | ||||||
|             results.loc[pv_capacity,ess_capacity] = result |             results.loc[pv_capacity,ess_capacity] = result | ||||||
|             overload_cnt.loc[pv_capacity,ess_capacity] = overload |             overload_cnt.loc[pv_capacity,ess_capacity] = overload | ||||||
|             costs.loc[pv_capacity,ess_capacity] = cost |             costs.loc[pv_capacity,ess_capacity] = cost | ||||||
|             nettos.loc[pv_capacity,ess_capacity] = netto |             nettos.loc[pv_capacity,ess_capacity] = netto | ||||||
|             gen_energies.loc[pv_capacity, ess_capacity] = gen_energy |             gen_energies.loc[pv_capacity, ess_capacity] = gen_energy | ||||||
|             gen_energies2.loc[pv_capacity, ess_capacity] = gen_energy2 |             gen_energies2.loc[pv_capacity, ess_capacity] = gen_energy2 | ||||||
|  |             months_ess_rest.loc[pv_capacity, ess_capacity] = ess_rest | ||||||
|  |             factory_demands[pv_capacity][ess_capacity] = factory_demand | ||||||
|  |             buy_prices[pv_capacity][ess_capacity] = buy_price | ||||||
|  |             sell_prices[pv_capacity][ess_capacity] = sell_price | ||||||
|  |             pv_generates[pv_capacity][ess_capacity] = pv_generate | ||||||
|  |             grid_need_powers[pv_capacity][ess_capacity] = grid_need_power | ||||||
|  |             times[pv_capacity][ess_capacity] = time | ||||||
|  |     months_csv_data[index] = {"factory_demand": factory_demands, "buy_price": buy_prices, "sell_price": sell_prices, "pv_generate": pv_generates, "grid_need_power": grid_need_powers, "time": times} | ||||||
|     months_results.append(results) |     months_results.append(results) | ||||||
|     months_costs.append(costs) |     months_costs.append(costs) | ||||||
|     months_overload.append(overload_cnt) |     months_overload.append(overload_cnt) | ||||||
| @@ -384,7 +450,6 @@ for index, month_data in enumerate(months_data): | |||||||
|                     figure_size=figure_size, |                     figure_size=figure_size, | ||||||
|                     days=months_days[index], |                     days=months_days[index], | ||||||
|                     granularity=granularity) |                     granularity=granularity) | ||||||
|  |  | ||||||
| annual_result = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | annual_result = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
| annual_costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | annual_costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
| annual_overload = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | annual_overload = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
| @@ -393,7 +458,6 @@ annual_gen = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | |||||||
| annual_gen2 = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | annual_gen2 = pd.DataFrame(index=pv_capacities, columns= ess_capacities) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # get the yearly results | # get the yearly results | ||||||
| for pv_capacity in pv_capacities: | for pv_capacity in pv_capacities: | ||||||
|     for ess_capacity in ess_capacities: |     for ess_capacity in ess_capacities: | ||||||
| @@ -434,7 +498,48 @@ draw_overload(overload_cnt=annual_overload, | |||||||
|                 figure_size=figure_size) |                 figure_size=figure_size) | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[94]: | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def collapse_months_csv_data(months_csv_data, column_name,pv_capacies, ess_capacities): | ||||||
|  |     data = {} | ||||||
|  |     for pv_capacity in pv_capacities: | ||||||
|  |         data[pv_capacity] = {} | ||||||
|  |         for ess_capacity in ess_capacities: | ||||||
|  |             annual_data = [] | ||||||
|  |             for index, month_data in enumerate(months_data): | ||||||
|  |                 annual_data.extend(months_csv_data[index][column_name][pv_capacity][ess_capacity]) | ||||||
|  |                 # months_csv_data[index][column_name][pv_capacity][ess_capacity] = months_csv_data[index][column_name][pv_capacity][ess_capacity].tolist() | ||||||
|  |  | ||||||
|  |             data[pv_capacity][ess_capacity] = annual_data | ||||||
|  |     return data  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # In[102]: | ||||||
|  |  | ||||||
|  |  | ||||||
|  | annual_pv_gen = collapse_months_csv_data(months_csv_data, "pv_generate", pv_capacities, ess_capacities) | ||||||
|  | annual_time = collapse_months_csv_data(months_csv_data, "time", pv_capacities, ess_capacities) | ||||||
|  | annual_buy_price = collapse_months_csv_data(months_csv_data, "buy_price",pv_capacities, ess_capacities) | ||||||
|  | annual_sell_price = collapse_months_csv_data(months_csv_data, "sell_price", pv_capacities, ess_capacities) | ||||||
|  | annual_factory_demand = collapse_months_csv_data(months_csv_data, "factory_demand", pv_capacities, ess_capacities) | ||||||
|  | annual_grid_need_power = collapse_months_csv_data(months_csv_data, "grid_need_power", pv_capacities, ess_capacities) | ||||||
|  |  | ||||||
|  | from datetime import datetime, timedelta | ||||||
|  |  | ||||||
|  | for pv_capacity in pv_capacities: | ||||||
|  |     for ess_capacity in ess_capacities: | ||||||
|  |         with open(f'data/annual_data-pv-{pv_capacity}-ess-{ess_capacity}.csv', 'w') as f: | ||||||
|  |             f.write("date, time,pv_generate (kW),factory_demand (kW),buy_price (USD/MWh),sell_price (USD/MWh),grid_need_power (kW)\n") | ||||||
|  |             start_date = datetime(2023, 1, 1, 0, 0, 0) | ||||||
|  |             for i in range(len(annual_time[pv_capacity][ess_capacity])): | ||||||
|  |                 current_date = start_date + timedelta(hours=i) | ||||||
|  |                 formate_date = current_date.strftime("%Y-%m-%d") | ||||||
|  |                 f.write(f"{formate_date},{annual_time[pv_capacity][ess_capacity][i]},{int(annual_pv_gen[pv_capacity][ess_capacity][i])},{int(annual_factory_demand[pv_capacity][ess_capacity][i])},{int(annual_buy_price[pv_capacity][ess_capacity][i]*1000)},{int(annual_sell_price[pv_capacity][ess_capacity][i]*1000)},{int(annual_grid_need_power[pv_capacity][ess_capacity][i])} \n") | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # In[96]: | ||||||
|  |  | ||||||
|  |  | ||||||
| def save_data(data, filename): | def save_data(data, filename): | ||||||
| @@ -442,7 +547,7 @@ def save_data(data, filename): | |||||||
|     data.to_json(filename + '.json') |     data.to_json(filename + '.json') | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[97]: | ||||||
|  |  | ||||||
|  |  | ||||||
| if not os.path.isdir('data'): | if not os.path.isdir('data'): | ||||||
| @@ -453,13 +558,13 @@ save_data(annual_costs, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_ | |||||||
| save_data(annual_overload, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-overload_cnt') | save_data(annual_overload, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-overload_cnt') | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[98]: | ||||||
|  |  | ||||||
|  |  | ||||||
| draw_results(annual_result, 'plots/test.png', 'test', False) | draw_results(annual_result, 'plots/test.png', 'test', False) | ||||||
|  |  | ||||||
|  |  | ||||||
| # In[ ]: | # In[99]: | ||||||
|  |  | ||||||
|  |  | ||||||
| draw_roi(annual_costs, annual_nettos, 'plots/annual_roi.png',  title_roi, 365, annot_benefit, figure_size) | draw_roi(annual_costs, annual_nettos, 'plots/annual_roi.png',  title_roi, 365, annot_benefit, figure_size) | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								read_data.py
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								read_data.py
									
									
									
									
									
								
							| @@ -1,57 +1,47 @@ | |||||||
| import pandas as pd | import pandas as pd | ||||||
| import numpy as np | import numpy as np | ||||||
| import csv | import csv | ||||||
|  | import json | ||||||
|  |  | ||||||
| sunlight_file_name = 'lightintensity.xlsx' | with open('config.json', 'r') as f: | ||||||
| factory_demand_file_name = 'factory_power1.xlsx' |     js_data = json.load(f) | ||||||
| electricity_price_data = 'electricity_price_data.csv' |  | ||||||
| electricity_price_data_sell = 'electricity_price_data_sell.csv' |  | ||||||
|  |  | ||||||
| df_sunlight = pd.read_excel(sunlight_file_name, header=None, names=['SunlightIntensity']) | pv_yield_file_name = js_data["data_path"]["pv_yield"] | ||||||
|  | print(pv_yield_file_name) | ||||||
|  | # factory_demand_file_name = 'factory_power1.xlsx' | ||||||
|  | factory_demand_file_name = js_data["data_path"]["demand"] | ||||||
|  | print(factory_demand_file_name) | ||||||
|  | electricity_price_data = js_data["data_path"]["buy"] | ||||||
|  | print(electricity_price_data) | ||||||
|  | electricity_price_data_sell = js_data["data_path"]["sell"] | ||||||
|  | print(electricity_price_data_sell) | ||||||
|  |  | ||||||
| start_date = '2023-01-01 00:00:00'  # 根据数据的实际开始日期调整 | pv_df = pd.read_csv(pv_yield_file_name, index_col='Time', usecols=['Time', 'PV yield[kW/kWp]']) | ||||||
| hours = pd.date_range(start=start_date, periods=len(df_sunlight), freq='h') | pv_df.index = pd.to_datetime(pv_df.index) | ||||||
| df_sunlight['Time'] = hours |  | ||||||
| df_sunlight.set_index('Time', inplace=True) |  | ||||||
|  |  | ||||||
| df_sunlight_resampled = df_sunlight.resample('15min').interpolate() | df_power = pd.read_csv(factory_demand_file_name, index_col='Time', usecols=['Time', 'FactoryPower']) | ||||||
|  | df_power.index = pd.to_datetime(df_power.index) | ||||||
| df_power = pd.read_excel(factory_demand_file_name,  | df_combined = pv_df.join(df_power) | ||||||
|                          header=None,  |  | ||||||
|                          names=['FactoryPower'],  |  | ||||||
|                          dtype={'FactoryPower': float}) |  | ||||||
| times = pd.date_range(start=start_date, periods=len(df_power), freq='15min') |  | ||||||
| df_power['Time'] = times |  | ||||||
| df_power.set_index('Time',inplace=True) |  | ||||||
| print(df_power.head()) |  | ||||||
|  |  | ||||||
| df_combined = df_sunlight_resampled.join(df_power) |  | ||||||
|  |  | ||||||
|      |  | ||||||
|  |  | ||||||
| price_df = pd.read_csv(electricity_price_data, index_col='Time', usecols=['Time', 'ElectricityBuy']) | price_df = pd.read_csv(electricity_price_data, index_col='Time', usecols=['Time', 'ElectricityBuy']) | ||||||
| price_df.index = pd.to_datetime(price_df.index) | price_df.index = pd.to_datetime(price_df.index) | ||||||
| price_df = price_df.reindex(df_combined.index) | price_df = price_df.reindex(df_combined.index) | ||||||
|  |  | ||||||
| print("Electricity price data generated and saved.") |  | ||||||
| df_combined2 = df_combined.join(price_df) | df_combined2 = df_combined.join(price_df) | ||||||
|  |  | ||||||
| sell_df = pd.read_csv(electricity_price_data_sell, index_col='Time', usecols=['Time', 'ElectricitySell']) | sell_df = pd.read_csv(electricity_price_data_sell, index_col='Time', usecols=['Time', 'ElectricitySell']) | ||||||
| sell_df.index = pd.to_datetime(sell_df.index) | sell_df.index = pd.to_datetime(sell_df.index) | ||||||
| sell_df = sell_df.reindex(df_combined.index) | sell_df = sell_df.reindex(df_combined.index) | ||||||
|  |  | ||||||
| df_combined3 = df_combined2.join(sell_df) | df_combined3 = df_combined2.join(sell_df) | ||||||
|  |  | ||||||
| with open('combined_data.csv', 'w', newline='') as file: | with open('combined_data.csv', 'w', newline='') as file: | ||||||
|     writer = csv.writer(file) |     writer = csv.writer(file) | ||||||
|     writer.writerow(['time', 'sunlight', 'demand','buy', 'sell']) |     writer.writerow(['time', 'PV yield[kW/kWp]', 'demand','buy', 'sell']) | ||||||
|     cnt = 0 |     cnt = 0 | ||||||
|     for index, row in df_combined3.iterrows(): |     for index, row in df_combined3.iterrows(): | ||||||
|         time_formatted = index.strftime('%H:%M') |         time_formatted = index.strftime('%H:%M') | ||||||
|         writer.writerow([time_formatted, row['SunlightIntensity'], row['FactoryPower'],row['ElectricityBuy'], row['ElectricitySell']]) |         writer.writerow([time_formatted, row['PV yield[kW/kWp]'], row['FactoryPower'],row['ElectricityBuy'], row['ElectricitySell']]) | ||||||
|          |          | ||||||
|     print('The file is written to combined_data.csv') |     print('The file is written to combined_data.csv') | ||||||
|  |  | ||||||
| # combined_data.to_csv('updated_simulation_with_prices.csv', index=False) |  | ||||||
|  |  | ||||||
| print("Simulation data with electricity prices has been updated and saved.") | print("Simulation data with electricity prices has been updated and saved.") | ||||||
							
								
								
									
										35041
									
								
								read_data/Berlin.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35041
									
								
								read_data/Berlin.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										35041
									
								
								read_data/Cambodge.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35041
									
								
								read_data/Cambodge.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										35041
									
								
								read_data/Marcedonia.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35041
									
								
								read_data/Marcedonia.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										35041
									
								
								read_data/Riyahd.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35041
									
								
								read_data/Riyahd.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										35041
									
								
								read_data/Serbia.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35041
									
								
								read_data/Serbia.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										372
									
								
								read_data/convert_data.ipynb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										372
									
								
								read_data/convert_data.ipynb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,372 @@ | |||||||
|  | { | ||||||
|  |  "cells": [ | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 85, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [], | ||||||
|  |    "source": [ | ||||||
|  |     "import matplotlib.pyplot as plt\n", | ||||||
|  |     "import pandas as pd\n", | ||||||
|  |     "import numpy as np\n", | ||||||
|  |     "import os\n", | ||||||
|  |     "import csv" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 86, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [], | ||||||
|  |    "source": [ | ||||||
|  |     "def read_csv(filename):\n", | ||||||
|  |     "    skip_rows = list(range(1, 17))\n", | ||||||
|  |     "    data = pd.read_csv(filename, sep=';', skiprows=skip_rows)\n", | ||||||
|  |     "    return data" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 87, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "name": "stderr", | ||||||
|  |      "output_type": "stream", | ||||||
|  |      "text": [ | ||||||
|  |       "/tmp/ipykernel_3075037/3659192646.py:3: DtypeWarning: Columns (32,33,35) have mixed types. Specify dtype option on import or set low_memory=False.\n", | ||||||
|  |       "  data = pd.read_csv(filename, sep=';', skiprows=skip_rows)\n" | ||||||
|  |      ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |      "data": { | ||||||
|  |       "text/plain": [ | ||||||
|  |        "Index(['Time', 'Irradiance onto horizontal plane ',\n", | ||||||
|  |        "       'Diffuse Irradiation onto Horizontal Plane ', 'Outside Temperature ',\n", | ||||||
|  |        "       'Module Area 1: Height of Sun ',\n", | ||||||
|  |        "       'Module Area 1: Irradiance onto tilted surface ',\n", | ||||||
|  |        "       'Module Area 1: Module Temperature ', 'Grid Export ',\n", | ||||||
|  |        "       'Energy from Grid ', 'Global radiation - horizontal ',\n", | ||||||
|  |        "       'Deviation from standard spectrum ', 'Ground Reflection (Albedo) ',\n", | ||||||
|  |        "       'Orientation and inclination of the module surface ', 'Shading ',\n", | ||||||
|  |        "       'Reflection on the Module Surface ',\n", | ||||||
|  |        "       'Irradiance on the rear side of the module ',\n", | ||||||
|  |        "       'Global Radiation at the Module ',\n", | ||||||
|  |        "       'Module Area 1: Reflection on the Module Surface ',\n", | ||||||
|  |        "       'Module Area 1: Global Radiation at the Module ',\n", | ||||||
|  |        "       'Global PV Radiation ', 'Bifaciality ', 'Soiling ',\n", | ||||||
|  |        "       'STC Conversion (Rated Efficiency of Module) ', 'Rated PV Energy ',\n", | ||||||
|  |        "       'Low-light performance ', 'Module-specific Partial Shading ',\n", | ||||||
|  |        "       'Deviation from the nominal module temperature ', 'Diodes ',\n", | ||||||
|  |        "       'Mismatch (Manufacturer Information) ',\n", | ||||||
|  |        "       'Mismatch (Configuration/Shading) ',\n", | ||||||
|  |        "       'Power optimizer (DC conversion/clipping) ',\n", | ||||||
|  |        "       'PV Energy (DC) without inverter clipping ',\n", | ||||||
|  |        "       'Failing to reach the DC start output ',\n", | ||||||
|  |        "       'Clipping on account of the MPP Voltage Range ',\n", | ||||||
|  |        "       'Clipping on account of the max. DC Current ',\n", | ||||||
|  |        "       'Clipping on account of the max. DC Power ',\n", | ||||||
|  |        "       'Clipping on account of the max. AC Power/cos phi ', 'MPP Matching ',\n", | ||||||
|  |        "       'PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 1 - MPP 1 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 1 - MPP 2 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 1 - MPP 3 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 1 - MPP 4 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 1 - MPP 5 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 1 - MPP 6 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 2 - MPP 1 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Inverter 2 - MPP 2 - to Module Area 1: PV energy (DC) ',\n", | ||||||
|  |        "       'Energy at the Inverter Input ',\n", | ||||||
|  |        "       'Input voltage deviates from rated voltage ', 'DC/AC Conversion ',\n", | ||||||
|  |        "       'Own Consumption (Standby or Night) ', 'Total Cable Losses ',\n", | ||||||
|  |        "       'PV energy (AC) minus standby use ', 'Feed-in energy ',\n", | ||||||
|  |        "       'Inverter 1 to Module Area 1: Own Consumption (Standby or Night) ',\n", | ||||||
|  |        "       'Inverter 1 to Module Area 1: PV energy (AC) minus standby use ',\n", | ||||||
|  |        "       'Inverter 2 to Module Area 1: Own Consumption (Standby or Night) ',\n", | ||||||
|  |        "       'Inverter 2 to Module Area 1: PV energy (AC) minus standby use ',\n", | ||||||
|  |        "       'Unnamed: 58'],\n", | ||||||
|  |        "      dtype='object')" | ||||||
|  |       ] | ||||||
|  |      }, | ||||||
|  |      "execution_count": 87, | ||||||
|  |      "metadata": {}, | ||||||
|  |      "output_type": "execute_result" | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "\n", | ||||||
|  |     "file_name = 'Riyahd_raw.csv'\n", | ||||||
|  |     "df = read_csv(file_name)\n", | ||||||
|  |     "df.columns" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 88, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [], | ||||||
|  |    "source": [ | ||||||
|  |     "remain_column = ['Time','PV energy (AC) minus standby use ']\n", | ||||||
|  |     "energy_row_name = remain_column[1]\n", | ||||||
|  |     "\n", | ||||||
|  |     "df = df[remain_column]\n", | ||||||
|  |     "df[energy_row_name] = df[energy_row_name].str.replace(',','.').astype(float)\n" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 89, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "data": { | ||||||
|  |       "text/plain": [ | ||||||
|  |        "770594.226863267" | ||||||
|  |       ] | ||||||
|  |      }, | ||||||
|  |      "execution_count": 89, | ||||||
|  |      "metadata": {}, | ||||||
|  |      "output_type": "execute_result" | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "sum_energy = df[energy_row_name].sum()\n", | ||||||
|  |     "sum_energy" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 90, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "data": { | ||||||
|  |       "text/plain": [ | ||||||
|  |        "1975.882632982736" | ||||||
|  |       ] | ||||||
|  |      }, | ||||||
|  |      "execution_count": 90, | ||||||
|  |      "metadata": {}, | ||||||
|  |      "output_type": "execute_result" | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "sum_energy / 390" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 91, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [], | ||||||
|  |    "source": [ | ||||||
|  |     "group_size = 15\n", | ||||||
|  |     "df['group_id'] = df.index // group_size\n", | ||||||
|  |     "\n", | ||||||
|  |     "sums = df.groupby('group_id')[energy_row_name].sum()\n", | ||||||
|  |     "sums_df = sums.reset_index(drop=True).to_frame(name = 'Energy')" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 92, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "data": { | ||||||
|  |       "text/plain": [ | ||||||
|  |        "<bound method NDFrame.head of        Energy\n", | ||||||
|  |        "0         0.0\n", | ||||||
|  |        "1         0.0\n", | ||||||
|  |        "2         0.0\n", | ||||||
|  |        "3         0.0\n", | ||||||
|  |        "4         0.0\n", | ||||||
|  |        "...       ...\n", | ||||||
|  |        "35035     0.0\n", | ||||||
|  |        "35036     0.0\n", | ||||||
|  |        "35037     0.0\n", | ||||||
|  |        "35038     0.0\n", | ||||||
|  |        "35039     0.0\n", | ||||||
|  |        "\n", | ||||||
|  |        "[35040 rows x 1 columns]>" | ||||||
|  |       ] | ||||||
|  |      }, | ||||||
|  |      "execution_count": 92, | ||||||
|  |      "metadata": {}, | ||||||
|  |      "output_type": "execute_result" | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "sums_df.head" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 93, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "name": "stdout", | ||||||
|  |      "output_type": "stream", | ||||||
|  |      "text": [ | ||||||
|  |       "                 Time\n", | ||||||
|  |       "0 2023-01-01 00:00:00\n", | ||||||
|  |       "1 2023-01-01 00:15:00\n", | ||||||
|  |       "2 2023-01-01 00:30:00\n", | ||||||
|  |       "3 2023-01-01 00:45:00\n", | ||||||
|  |       "4 2023-01-01 01:00:00\n", | ||||||
|  |       "                     Time\n", | ||||||
|  |       "35035 2023-12-31 22:45:00\n", | ||||||
|  |       "35036 2023-12-31 23:00:00\n", | ||||||
|  |       "35037 2023-12-31 23:15:00\n", | ||||||
|  |       "35038 2023-12-31 23:30:00\n", | ||||||
|  |       "35039 2023-12-31 23:45:00\n" | ||||||
|  |      ] | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "\n", | ||||||
|  |     "start_date = '2023-01-01'\n", | ||||||
|  |     "end_date = '2023-12-31'\n", | ||||||
|  |     "\n", | ||||||
|  |     "# 生成每天的15分钟间隔时间\n", | ||||||
|  |     "all_dates = pd.date_range(start=start_date, end=end_date, freq='D')\n", | ||||||
|  |     "all_times = pd.timedelta_range(start='0 min', end='1435 min', freq='15 min')\n", | ||||||
|  |     "\n", | ||||||
|  |     "# 生成完整的时间标签\n", | ||||||
|  |     "date_times = [pd.Timestamp(date) + time for date in all_dates for time in all_times]\n", | ||||||
|  |     "\n", | ||||||
|  |     "# 创建DataFrame\n", | ||||||
|  |     "time_frame = pd.DataFrame({\n", | ||||||
|  |     "    'Time': date_times\n", | ||||||
|  |     "})\n", | ||||||
|  |     "\n", | ||||||
|  |     "# 查看生成的DataFrame\n", | ||||||
|  |     "print(time_frame.head())\n", | ||||||
|  |     "print(time_frame.tail())\n" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 94, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "name": "stdout", | ||||||
|  |      "output_type": "stream", | ||||||
|  |      "text": [ | ||||||
|  |       "(35040, 1)\n", | ||||||
|  |       "(35040, 1)\n" | ||||||
|  |      ] | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "print(sums_df.shape)\n", | ||||||
|  |     "print(time_frame.shape)" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 95, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [], | ||||||
|  |    "source": [ | ||||||
|  |     "# sums_df['Time'] = time_frame['Time']\n", | ||||||
|  |     "sums_df = pd.concat([time_frame, sums_df], axis=1)" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 96, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "name": "stdout", | ||||||
|  |      "output_type": "stream", | ||||||
|  |      "text": [ | ||||||
|  |       "                     Energy\n", | ||||||
|  |       "Time                       \n", | ||||||
|  |       "2023-01-01 00:00:00     0.0\n", | ||||||
|  |       "2023-01-01 00:15:00     0.0\n", | ||||||
|  |       "2023-01-01 00:30:00     0.0\n", | ||||||
|  |       "2023-01-01 00:45:00     0.0\n", | ||||||
|  |       "2023-01-01 01:00:00     0.0\n" | ||||||
|  |      ] | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "sums_df.set_index('Time', inplace=True)\n", | ||||||
|  |     "print(sums_df.head())" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 97, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [], | ||||||
|  |    "source": [ | ||||||
|  |     "max_value = sums_df['Energy'].max()\n", | ||||||
|  |     "sums_df['Energy'] = sums_df['Energy'] / max_value\n" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 98, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [], | ||||||
|  |    "source": [ | ||||||
|  |     "def save_csv(df, filename, columns):\n", | ||||||
|  |     "    tmp_df = df.copy()\n", | ||||||
|  |     "    tmp_df[columns[1]] = tmp_df[columns[1]].round(4)\n", | ||||||
|  |     "    with open(filename, 'w', newline='') as file:\n", | ||||||
|  |     "        writer = csv.writer(file)\n", | ||||||
|  |     "        writer.writerow(columns)\n", | ||||||
|  |     "        for index, row in tmp_df.iterrows():\n", | ||||||
|  |     "            time_formatted = index.strftime('%H:%M')\n", | ||||||
|  |     "            writer.writerow([time_formatted, row[columns[1]]])\n", | ||||||
|  |     "            \n", | ||||||
|  |     "        print(f'The file is written to {filename}')\n", | ||||||
|  |     "        \n", | ||||||
|  |     "\n" | ||||||
|  |    ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |    "cell_type": "code", | ||||||
|  |    "execution_count": 99, | ||||||
|  |    "metadata": {}, | ||||||
|  |    "outputs": [ | ||||||
|  |     { | ||||||
|  |      "name": "stdout", | ||||||
|  |      "output_type": "stream", | ||||||
|  |      "text": [ | ||||||
|  |       "The file is written to Riyahd.csv\n" | ||||||
|  |      ] | ||||||
|  |     } | ||||||
|  |    ], | ||||||
|  |    "source": [ | ||||||
|  |     "save_csv(sums_df, 'Riyahd.csv', ['Time', 'Energy'])" | ||||||
|  |    ] | ||||||
|  |   } | ||||||
|  |  ], | ||||||
|  |  "metadata": { | ||||||
|  |   "kernelspec": { | ||||||
|  |    "display_name": "pv", | ||||||
|  |    "language": "python", | ||||||
|  |    "name": "python3" | ||||||
|  |   }, | ||||||
|  |   "language_info": { | ||||||
|  |    "codemirror_mode": { | ||||||
|  |     "name": "ipython", | ||||||
|  |     "version": 3 | ||||||
|  |    }, | ||||||
|  |    "file_extension": ".py", | ||||||
|  |    "mimetype": "text/x-python", | ||||||
|  |    "name": "python", | ||||||
|  |    "nbconvert_exporter": "python", | ||||||
|  |    "pygments_lexer": "ipython3", | ||||||
|  |    "version": "3.11.9" | ||||||
|  |   } | ||||||
|  |  }, | ||||||
|  |  "nbformat": 4, | ||||||
|  |  "nbformat_minor": 2 | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								read_data/convert_data.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								read_data/convert_data.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | # coding: utf-8 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import matplotlib.pyplot as plt | ||||||
|  | import pandas as pd | ||||||
|  | import numpy as np | ||||||
|  | import os | ||||||
|  | import csv | ||||||
|  |  | ||||||
|  | def generate_min_df(mins = 15): | ||||||
|  |     end = 60/mins * 24 | ||||||
|  |     start_date = '2023-01-01' | ||||||
|  |     end_date = '2023-12-31' | ||||||
|  |  | ||||||
|  |     all_dates = pd.date_range(start=start_date, end=end_date, freq='D') | ||||||
|  |     all_times = pd.timedelta_range(start='0 min', end=f'1435 min', freq=f'{mins} min') | ||||||
|  |  | ||||||
|  |     date_times = [pd.Timestamp(date) + time for date in all_dates for time in all_times] | ||||||
|  |  | ||||||
|  |     time_frame = pd.DataFrame({ | ||||||
|  |         'Time': date_times | ||||||
|  |     }) | ||||||
|  |     return time_frame | ||||||
|  |  | ||||||
|  | def save_csv(df, filename, columns): | ||||||
|  |     with open(filename, 'w', newline='') as file: | ||||||
|  |         writer = csv.writer(file) | ||||||
|  |         writer.writerow(['Time', 'PV yield[kW/kWp]']) | ||||||
|  |         for index, row in df.iterrows(): | ||||||
|  |             time_formatted = index.strftime('%H:%M') | ||||||
|  |             writer.writerow([time_formatted, row[columns[1]]]) | ||||||
|  |              | ||||||
|  |         print(f'The file is written to {filename}') | ||||||
|  |  | ||||||
|  | def read_csv(filename): | ||||||
|  |     skip_rows = list(range(1, 17)) | ||||||
|  |     data = pd.read_csv(filename, sep=';', skiprows=skip_rows) | ||||||
|  |     return data | ||||||
|  |  | ||||||
|  | def process(file_name): | ||||||
|  |     df = read_csv(file_name) | ||||||
|  |     city = file_name.split('_')[0] | ||||||
|  |  | ||||||
|  |     remain_column = ['Time','PV energy (AC) minus standby use '] | ||||||
|  |     energy_row_name = remain_column[1] | ||||||
|  |  | ||||||
|  |     df = df[remain_column] | ||||||
|  |     df[energy_row_name] = df[energy_row_name].str.replace(',','.').astype(float) | ||||||
|  |  | ||||||
|  |     sum_energy = df[energy_row_name].sum() | ||||||
|  |     group_size = 15 | ||||||
|  |     df['group_id'] = df.index // group_size | ||||||
|  |  | ||||||
|  |     sums = df.groupby('group_id')[energy_row_name].sum() | ||||||
|  |     sums_df = sums.reset_index(drop=True).to_frame(name = 'Energy') | ||||||
|  |  | ||||||
|  |     pv_energy_column_name = 'PV yield[kW/kWp]' | ||||||
|  |     sums_df = sums_df.rename(columns={'Energy': pv_energy_column_name}) | ||||||
|  |  | ||||||
|  |     time_frame = generate_min_df(15) | ||||||
|  |     sums_df = pd.concat([time_frame, sums_df], axis=1) | ||||||
|  |     # sums_df.set_index('Time', inplace=True) | ||||||
|  |     # max_value = sums_df[pv_energy_column_name].max() | ||||||
|  |     sums_df[pv_energy_column_name] = sums_df[pv_energy_column_name] / 390. | ||||||
|  |     sums_df[pv_energy_column_name] = sums_df[pv_energy_column_name].round(4) | ||||||
|  |     sums_df[pv_energy_column_name].replace(0.0, -0.0) | ||||||
|  |  | ||||||
|  |     sums_df.to_csv(f'{city}.csv') | ||||||
|  |     # save_csv(sums_df, f'{city}.csv', ['Time', 'Energy']) | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     city_list = ['Riyahd', 'Cambodge', 'Berlin', 'Serbia'] | ||||||
|  |     for city in city_list: | ||||||
|  |         print(f'Processing {city}') | ||||||
|  |         file_name = f'{city}_raw.csv' | ||||||
|  |         process(file_name) | ||||||
|  |         print(f'Processing {city} is done\n') | ||||||
|  |  | ||||||
| Can't render this file because it is too large. | 
| Can't render this file because it is too large. | 
							
								
								
									
										35041
									
								
								read_data/factory_power1.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35041
									
								
								read_data/factory_power1.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										16
									
								
								xlsx2csv.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								xlsx2csv.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | import pandas as pd | ||||||
|  |  | ||||||
|  | excel_file = 'factory_power1.xlsx' | ||||||
|  | sheet_name = 'Sheet1' | ||||||
|  |  | ||||||
|  | df = pd.read_excel(excel_file, sheet_name=sheet_name) | ||||||
|  |  | ||||||
|  | start_date = '2023-01-01' | ||||||
|  | df_power = pd.read_excel(excel_file,  | ||||||
|  |                          header=None,  | ||||||
|  |                          names=['FactoryPower'],  | ||||||
|  |                          dtype={'FactoryPower': float}) | ||||||
|  | times = pd.date_range(start=start_date, periods=len(df_power), freq='15min') | ||||||
|  | df_power['Time'] = times | ||||||
|  | df_power = df_power[['Time', 'FactoryPower']] | ||||||
|  | df_power.to_csv('factory_power1.csv', index=True) | ||||||
		Reference in New Issue
	
	Block a user