JoBeer commited on
Commit
7e81330
·
verified ·
1 Parent(s): 0aa652d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +175 -0
app.py ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #Importierung Pakete
2
+ import gradio as gr
3
+ import pandas as pd #Verarbeitung excel/csv
4
+
5
+ from darts.models import LinearRegressionModel #Importierung Klasse LinearRegressionModel von darts
6
+ from darts import TimeSeries #In darts wird für Datensätze das TimeSeries Format verwendet
7
+
8
+ from sklearn.metrics import mean_absolute_error, r2_score
9
+
10
+ import os
11
+ import plotly.express as px #Erstellung von Diagrammen
12
+
13
+ # Funktion, um die hochgeladene Datei zu lesen
14
+ def upload_excel(file):
15
+ if file is not None:
16
+ # Excel-Datei lesen
17
+ df = pd.read_excel(file.name, index_col='time')
18
+ return df
19
+
20
+ # Funktion, um Checkbox-Optionen automatisch zu erstellen
21
+ def create_feature_checkbox(df):
22
+ if df is not None:
23
+ new_choices = list(df.columns)
24
+ return gr.update(choices=new_choices)
25
+ else:
26
+ return gr.update(choices=[])
27
+
28
+ # Funktion, um Trainingsstartdatum automatisch zu laden
29
+ def fill_start_date(df):
30
+ if df is not None:
31
+ start_date = str(df.index.min())
32
+ return gr.update(value=start_date)
33
+ else:
34
+ return gr.update(value='')
35
+
36
+ # Funktion, um Testenddatum automatisch zu laden
37
+ def fill_end_date(df):
38
+ if df is not None:
39
+ end_date = str(df.index.max())
40
+ return gr.update(value=end_date)
41
+ else:
42
+ return gr.update(value='')
43
+
44
+ #Funktion, läd die excel Datei hoch und führt außerdem die Funktionen create_feature_checkbox, fill_start_date, fill_end_date
45
+ def process_excel(file):
46
+ df = upload_excel(file)
47
+ return df, create_feature_checkbox(df), create_feature_checkbox(df), fill_start_date(df), fill_end_date(df) #create_feature_checkbox steht zwei mal drinnen wegen target und covariate
48
+
49
+ #Funktion training und test split
50
+ def data_split_and_training(df,start_train,end_train,end_test,target,df_covariates,time,lags_target,lags_covariates):
51
+ #Zeitliche Größen ergänzen
52
+ df['year'] = df.index.year
53
+ df['month'] = df.index.month
54
+ df['weekday'] = df.index.weekday
55
+ df['daytime'] = df.index.hour
56
+
57
+ #Start_test in Abhängigkeit von end_train
58
+ start_test = str(df.index[df.index.get_loc(end_train) + 1])
59
+
60
+ #Aufteilen in Train Test
61
+ train_df = df[start_train:end_train]
62
+ test_df = df[start_test:end_test]
63
+
64
+ #Umwandeln in darts.TimeSeries
65
+ train = TimeSeries.from_dataframe(train_df)
66
+ test = TimeSeries.from_dataframe(test_df)
67
+
68
+ #Lags Eingabe in Liste umwandeln für Darts Bibliothek
69
+ lags_target_list = list(range(-1,-lags_target-1,-1))
70
+ lags_covariates_list = list(range(-1,-lags_covariates-1,-1))
71
+
72
+ #model instantiation
73
+ model = LinearRegressionModel(lags=lags_target_list, lags_future_covariates=lags_covariates_list)
74
+
75
+ #model training
76
+ model_fit = model.fit(train[target], future_covariates= train[df_covariates+time])
77
+ return train, test, model_fit, f'Training is complete'
78
+
79
+ # Funktion zur Speicherung des trainierten Modells
80
+ def create_file(state_value):
81
+ file_path = "model_fit.pt"
82
+ with open(file_path, "w") as f:
83
+ f.write(f"State Value: {state_value}")
84
+ return file_path
85
+
86
+ # Funktion für Prediction
87
+ def test(model_fit,test,train,df_covariates,time):
88
+ #prediction
89
+ prediction = model_fit.predict(n=len(test), future_covariates= train.append(test)[df_covariates+time])
90
+
91
+ #converting to pandas
92
+ df_prediction = prediction.to_dataframe()
93
+
94
+ # Visualisierung mit Plotly
95
+ fig = px.line()
96
+ fig.add_scatter(x=df_prediction.index, y=test.to_dataframe()[df_prediction.columns[0]], mode='lines', name='test', line_color='red')
97
+ fig.add_scatter(x=df_prediction.index, y=df_prediction[df_prediction.columns[0]], mode='lines', name='predict', line_color='blue')
98
+ fig.update_yaxes(title_text=df_prediction.columns[0])
99
+
100
+ #check metrics
101
+ target_variable = []
102
+ MAE = []
103
+ R2 = []
104
+ for i in df_prediction.columns:
105
+ target_variable.append(i)
106
+ MAE.append(mean_absolute_error(df_prediction[i], test.to_dataframe()[i]))
107
+ R2.append(r2_score(df_prediction[i], test.to_dataframe()[i]))
108
+ metrics = pd.DataFrame({'target':target_variable,'MAE': MAE, 'R2': R2})
109
+ return metrics, fig
110
+
111
+
112
+
113
+
114
+ # Gradio-Interface erstellen
115
+ with gr.Blocks() as demo:
116
+ gr.Markdown("## ML-based Building Simulation") #Überschrift
117
+ gr.Markdown("This demo offers the possibility of creating building simulations based on time series data (measurement data with timestamps). The demo uses the machine learning algorithm multiple linear regression. The target variables and additional external variables of the forecast can be selected based on the data.") #Beschreibung
118
+
119
+ # Datei-Upload-Komponente
120
+ file_input = gr.File(label="Drop an excel file", file_types=[".xls", ".xlsx"]) #Hochladebereich
121
+
122
+ #Upload Button
123
+ upload_button = gr.Button("Upload Excel") #Button für Funktion proceed_excel()
124
+
125
+ #Feature checkboxen erstellen
126
+ checkbox_group_target = gr.CheckboxGroup(label="Select target variable", choices=[], interactive=True) #Auswahl target variable
127
+ checkbox_group_covariate = gr.CheckboxGroup(label="Select exogenous variables", choices=[], interactive=True) #Auswahl covariate variables
128
+ checkbox_group_time = gr.CheckboxGroup(label="Select time variables", choices=['year','month','weekday','daytime'], interactive=True)
129
+
130
+ with gr.Row():
131
+ # Eingabe Teilung Training und Testdaten
132
+ start_train = gr.Textbox(label='start_train:', lines=1, interactive=True)
133
+ train_test_split = gr.Textbox(label='end_train (train_test_split):', lines=1, interactive=True)
134
+ #end_train = gr.Textbox(label='end_train:', lines=1, interactive=True, value = '2019-06-04 02:15:00')
135
+ #start_test = gr.Textbox(label='start_test:', lines=1, interactive=True, value = '2019-06-04 02:30:00')
136
+ end_test = gr.Textbox(label='end_test:', lines=1, interactive=True)
137
+
138
+ # Eingabe Verzögerung
139
+ with gr.Row():
140
+ lags_target = gr.Number(value=1, label='Number of laged values for target', interactive=True)
141
+ lags_covariates = gr.Number(value=1, label='Number of laged values for exogenous variables', interactive=True)
142
+
143
+ # DataFrame df wird als Zustand gespeichert, damit er in in anderen Funktionen weiter verwendet werden kann
144
+ df_state = gr.State(None)
145
+ train_state = gr.State(None)
146
+ test_state = gr.State(None)
147
+ model_fit_state = gr.State(None)
148
+
149
+ #Training Button
150
+ training_button = gr.Button("Training") #Button für Funktion data_split_and_training()
151
+
152
+ with gr.Row():
153
+ #Training Status
154
+ status_output = gr.Textbox(label="Training status")
155
+ with gr.Column():
156
+ #Download Button
157
+ download_button = gr.DownloadButton("Download model")
158
+ test_button = gr.Button("Test")
159
+
160
+ # Tabellenausgabe Metrik
161
+ metrics_table = gr.DataFrame(label="Metrics", headers=['target','MAE','R2'])
162
+
163
+ # Plotausgabe Vorhersagen
164
+ plot = gr.Plot()
165
+
166
+ # Event-Verknüpfungen
167
+ upload_button.click(process_excel, inputs=file_input, outputs=[df_state, checkbox_group_target, checkbox_group_covariate, start_train, end_test])
168
+ training_button.click(data_split_and_training,
169
+ inputs=[df_state, start_train, train_test_split, end_test, checkbox_group_target, checkbox_group_covariate, checkbox_group_time, lags_target, lags_covariates],
170
+ outputs=[train_state, test_state, model_fit_state, status_output])
171
+ download_button.click(create_file,inputs=[model_fit_state],outputs=[download_button])
172
+ test_button.click(test,inputs=[model_fit_state,test_state,train_state,checkbox_group_covariate,checkbox_group_time],outputs=[metrics_table,plot])
173
+
174
+ # Demo starten
175
+ demo.launch(show_error=True)