RoyAalekh commited on
Commit
d5ad93b
·
verified ·
1 Parent(s): 5ef39c4

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +233 -0
app.py ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import panel as pn
2
+ import pandas as pd
3
+ import os
4
+
5
+ from consts import INVERTER_ID_MAPPING, TEMPERATURE_COLUMNS_TO_USE, CURRENT, IRRADIANCE, VOLTAGE, POWER_DC, POWER_AC, T_AMBIENT, T_MODULE, T_HEATSINK, T_CPU, T_BOARD
6
+ from plotting import (
7
+ create_heatmap,
8
+ create_iv_plot_with_power_curves,
9
+ create_iv_plot,
10
+ create_iv_plot_with_power_and_temperature_curves,
11
+ create_iv_plot_with_temperature_curves,
12
+ )
13
+
14
+ # Function to load chunked data based on month selection
15
+ def load_timeseries_data_for_month(month):
16
+ start_date = pd.to_datetime(month).strftime('%Y-%m-01')
17
+ end_date = (pd.to_datetime(month) + pd.offsets.MonthEnd()).strftime('%Y-%m-%d')
18
+ file_name = f"timeseries_chunks/enel_timeseries_data_{start_date}_{end_date}.csv"
19
+ if not os.path.exists(file_name):
20
+ return None
21
+ return pd.read_csv(file_name, index_col=0, header=[0, 1, 2], parse_dates=True)
22
+
23
+ def load_other_features_data_for_month(month):
24
+ start_date = pd.to_datetime(month).strftime('%Y-%m-01')
25
+ end_date = (pd.to_datetime(month) + pd.offsets.MonthEnd()).strftime('%Y-%m-%d')
26
+ file_name = f"other_features_chunks/enel_other_features_data_{start_date}_{end_date}.csv"
27
+ if not os.path.exists(file_name):
28
+ return None
29
+ return pd.read_csv(file_name, index_col=0, header=0, parse_dates=True)
30
+
31
+ # Define the available months
32
+ months = pd.date_range(start='2022-09-01', end='2023-08-31', freq='MS').strftime('%Y-%m').tolist()
33
+
34
+ kpi_data = pd.read_csv(
35
+ r"data/kpi_data.csv", index_col=0, header=0, parse_dates=True
36
+ )
37
+
38
+ daily_timeseries_data = pd.read_csv(
39
+ r"data/daily_aggregated_timeseries_data.csv",
40
+ index_col=0,
41
+ header=0,
42
+ parse_dates=True,
43
+ )
44
+
45
+ # Initialize Panel extension
46
+ pn.extension("plotly")
47
+
48
+ # Widgets for selecting month and columns
49
+ month_selector = pn.widgets.Select(
50
+ name='Choose a Month',
51
+ options=months,
52
+ )
53
+
54
+ inverter_ids = pn.widgets.MultiSelect(
55
+ name="Inverter IDs",
56
+ value=[list(INVERTER_ID_MAPPING.keys())[0]],
57
+ options=list(INVERTER_ID_MAPPING.keys()),
58
+ size=8,
59
+ )
60
+ # Line Plots
61
+ plot_power_curves = pn.widgets.Checkbox(name="Plot P-dc and P-ac", value=False)
62
+ plot_temperature_curves = pn.widgets.Checkbox(name="Plot Temperatures", value=False)
63
+
64
+ # Heatmaps
65
+ heatmap_pr = pn.widgets.Checkbox(name="Heat Map PR", value=False)
66
+ heatmap_sy = pn.widgets.Checkbox(name="Heat Map SY", value=False)
67
+ heatmap_current = pn.widgets.Checkbox(name="Heat Map - Current", value=False)
68
+ heatmap_voltage = pn.widgets.Checkbox(name="Heat Map - Voltage", value=False)
69
+ heatmap_power = pn.widgets.Checkbox(name="Heat Map - Power", value=False)
70
+ heatmap_irradiance = pn.widgets.Checkbox(name="Heat Map - Irradiance", value=False)
71
+ heatmap_temperature = pn.widgets.Checkbox(
72
+ name="Heat Map - Temperature Heatsink", value=False
73
+ )
74
+
75
+ # Create a loading spinner
76
+ loading_spinner = pn.indicators.LoadingSpinner(width=50, height=50)
77
+
78
+ # Global variables to store loaded data
79
+ loaded_timeseries_data = None
80
+ loaded_other_features_data = None
81
+ loaded_month = None
82
+
83
+ # Panel interactive functions
84
+ @pn.depends(
85
+ month_selector.param.value,
86
+ inverter_ids.param.value,
87
+ plot_power_curves.param.value,
88
+ plot_temperature_curves.param.value
89
+ )
90
+ def update_iv_plot(inverter_ids, plot_power_curves, plot_temperature_curves, selected_month):
91
+ global loaded_timeseries_data, loaded_other_features_data, loaded_month
92
+ if not selected_month:
93
+ return pn.pane.Markdown("Please select a month to load data.")
94
+
95
+ if loaded_month != selected_month:
96
+ loaded_timeseries_data = load_timeseries_data_for_month(selected_month)
97
+ loaded_other_features_data = load_other_features_data_for_month(selected_month)
98
+ loaded_month = selected_month
99
+
100
+ if loaded_timeseries_data is None or loaded_other_features_data is None:
101
+ return pn.pane.Markdown("No data available for the selected month.")
102
+
103
+ if not inverter_ids:
104
+ return pn.pane.Markdown("No Inverters selected for Plotting.")
105
+ else:
106
+ # Plot IV + Power + Temperature Curves
107
+ if plot_power_curves and plot_temperature_curves:
108
+ return create_iv_plot_with_power_and_temperature_curves(
109
+ loaded_timeseries_data, loaded_other_features_data, inverter_ids
110
+ )
111
+ # Plot IV + Temperature Curves
112
+ elif (not plot_power_curves) and plot_temperature_curves:
113
+ return create_iv_plot_with_temperature_curves(
114
+ loaded_timeseries_data, loaded_other_features_data, inverter_ids
115
+ )
116
+ # Plot IV + Power Curves
117
+ elif plot_power_curves and (not plot_temperature_curves):
118
+ return create_iv_plot_with_power_curves(loaded_timeseries_data, inverter_ids)
119
+ # Plot only IV Curves
120
+ else:
121
+ return create_iv_plot(loaded_timeseries_data, inverter_ids)
122
+
123
+
124
+ @pn.depends(heatmap_pr.param.value)
125
+ def update_heatmap_pr(heatmap_pr):
126
+ if heatmap_pr:
127
+ pr_df = kpi_data.filter(like="pr")
128
+ pr_df.columns = [i.split("-")[1] for i in pr_df.columns]
129
+ pr_heatmap = create_heatmap(pr_df, "PR Heatmap")
130
+ return pn.Row(pr_heatmap)
131
+ return pn.pane.Markdown("")
132
+
133
+
134
+ @pn.depends(heatmap_sy.param.value)
135
+ def update_heatmap_sy(heatmap_sy):
136
+ if heatmap_sy:
137
+ sy_df = kpi_data.filter(like="daily_specific_yield")
138
+ sy_df.columns = [i.split("-")[1] for i in sy_df.columns]
139
+ sy_heatmap = create_heatmap(sy_df, "SY Heatmap")
140
+ return pn.Row(sy_heatmap)
141
+ return pn.pane.Markdown("")
142
+
143
+
144
+ @pn.depends(heatmap_current.param.value)
145
+ def update_heatmap_current(heatmap_current):
146
+ if heatmap_current:
147
+ current_df = daily_timeseries_data.filter(like="I")
148
+ current_df.columns = [i.split("-")[1] for i in current_df.columns]
149
+ current_heatmap = create_heatmap(current_df, "Current Heatmap")
150
+ return pn.Row(current_heatmap)
151
+ return pn.pane.Markdown("")
152
+
153
+
154
+ @pn.depends(heatmap_voltage.param.value)
155
+ def update_heatmap_voltage(heatmap_voltage):
156
+ if heatmap_voltage:
157
+ voltage_df = daily_timeseries_data.filter(like="V")
158
+ voltage_df.columns = [i.split("-")[1] for i in voltage_df.columns]
159
+ voltage_heatmap = create_heatmap(voltage_df, "Voltage Heatmap")
160
+ return pn.Row(voltage_heatmap)
161
+ return pn.pane.Markdown("")
162
+
163
+
164
+ @pn.depends(heatmap_power.param.value)
165
+ def update_heatmap_power(heatmap_power):
166
+ if heatmap_power:
167
+ power_df = daily_timeseries_data.filter(like="P")
168
+ power_df.columns = [i.split("-")[1] for i in power_df.columns]
169
+ power_heatmap = create_heatmap(power_df, "Power Heatmap")
170
+ return pn.Row(power_heatmap)
171
+ return pn.pane.Markdown("")
172
+
173
+
174
+ @pn.depends(heatmap_irradiance.param.value)
175
+ def update_heatmap_irradiance(heatmap_irradiance):
176
+ if heatmap_irradiance:
177
+ irradiance_df = daily_timeseries_data.filter(like="G")
178
+ irradiance_df.columns = [i.split("-")[1] for i in irradiance_df.columns]
179
+ irradiance_heatmap = create_heatmap(irradiance_df, "Irradiance Heatmap")
180
+ return pn.Row(irradiance_heatmap)
181
+ return pn.pane.Markdown("")
182
+
183
+
184
+ @pn.depends(heatmap_temperature.param.value)
185
+ def update_heatmap_temperature(heatmap_temperature):
186
+ if heatmap_temperature:
187
+ temp_df = daily_timeseries_data.filter(like="THeatSink")
188
+ temp_df.columns = [i.split("-")[1] for i in temp_df.columns]
189
+ temp_heatmap = create_heatmap(temp_df, "T-Heatsink Heatmap")
190
+ return pn.Row(temp_heatmap)
191
+ return pn.pane.Markdown("")
192
+
193
+
194
+ # Create dashboard layout
195
+ dashboard = pn.Column(
196
+ "# ENEL Dashboard",
197
+ month_selector,
198
+ # IV Plots
199
+ pn.Row(
200
+ pn.Column(inverter_ids, plot_power_curves, plot_temperature_curves),
201
+ pn.panel(update_iv_plot, sizing_mode="stretch_width"),
202
+ ),
203
+ # Heatmaps
204
+ pn.Row(
205
+ pn.Column(heatmap_pr), pn.panel(update_heatmap_pr, sizing_mode="stretch_width")
206
+ ),
207
+ pn.Row(
208
+ pn.Column(heatmap_sy), pn.panel(update_heatmap_sy, sizing_mode="stretch_width")
209
+ ),
210
+ pn.Row(
211
+ pn.Column(heatmap_current),
212
+ pn.panel(update_heatmap_current, sizing_mode="stretch_width"),
213
+ ),
214
+ pn.Row(
215
+ pn.Column(heatmap_voltage),
216
+ pn.panel(update_heatmap_voltage, sizing_mode="stretch_width"),
217
+ ),
218
+ pn.Row(
219
+ pn.Column(heatmap_power),
220
+ pn.panel(update_heatmap_power, sizing_mode="stretch_width"),
221
+ ),
222
+ pn.Row(
223
+ pn.Column(heatmap_irradiance),
224
+ pn.panel(update_heatmap_irradiance, sizing_mode="stretch_width"),
225
+ ),
226
+ pn.Row(
227
+ pn.Column(heatmap_temperature),
228
+ pn.panel(update_heatmap_temperature, sizing_mode="stretch_width"),
229
+ ),
230
+ )
231
+
232
+ # Serve the dashboard
233
+ dashboard.servable()