diff --git a/Imputer/fill_missing.py b/Imputer/fill_missing.py index b433a3dc78e64c5e542a3962e2861746dae76ee6..e50f660b25c9b1231ed5491184189526d8df034d 100644 --- a/Imputer/fill_missing.py +++ b/Imputer/fill_missing.py @@ -8,14 +8,14 @@ Created on Fri Feb 26 12:57:45 2021 import pandas as pd import numpy as np -data = pd.read_csv('data.csv') -data= data.iloc[:,1:] -timeinterval=[0] +data = pd.read_csv('data.csv') #einlesen der relevanten daten +data= data.iloc[:,1:] # alter index filtern +timeinterval=[0] # liste mit zeitintervalen erstellen minutes=[0] indexes=[] time=0 minute=0 -for h in range(108): +for h in range(108): # für den ganzen tag durchgehen und berechnen ab welchen sekunden man in welchem sende-interval ist h=h+1 if (h<13 or (h>48 and h<63) or h>98): time=time + (30*60) @@ -31,11 +31,11 @@ timeinterval=np.asarray(timeinterval) minutes=np.asarray(minutes) indexes=np.asarray(indexes) for h in range(np.asarray(timeinterval).shape[0]-1): - data.loc[(data['time']>timeinterval[h]) & (data['time']<=timeinterval[h+1]), 'time'] = indexes[h] #data.loc[(data['time']>timeinterval[h]) & (data['time']<=timeinterval[h+1]), 'time'] = indexes[h] + data.loc[(data['time']>timeinterval[h]) & (data['time']<=timeinterval[h+1]), 'time'] = indexes[h] #für jede sukundenanzahl das jeweilige interval einsetzen -d=data.copy() +d=data.copy()# ergänzen der Zeilen welche nicht erfasst worden sind for e in data['day_index'].unique(): # für alle verschiedenen tages_indexe day_data=data.loc[data['day_index'] == e] # nur die einzelnen Tage for h in indexes: #für alle zeit_indexe der tage @@ -49,4 +49,4 @@ for e in data['day_index'].unique(): # für alle verschiedenen tages_indexe new_row={'Streckenvorhersage.ZielortID':k,'Streckenvorhersage.StartortID': 1,'Streckenvorhersage.Dauer':0,'time':h,'day_index':e ,'weekday':(data.loc[data['day_index']==e]).loc[(data.loc[data['day_index']==e]).index[0],'weekday']} data = data.append(new_row, ignore_index=True) -data.to_csv('data_unfilled.csv') \ No newline at end of file +data.to_csv('data_unfilled.csv') # die daten aufgefüllt mit leeren zeielen für die fehlenden einträge als neue csv abspeichern diff --git a/Imputer/impute_mean.py b/Imputer/impute_mean.py index 847d58a01cfaf496e32b8024f8fe4dfdeb670e5a..4e58abf89e8ca242899e7205d473566dcab432d5 100644 --- a/Imputer/impute_mean.py +++ b/Imputer/impute_mean.py @@ -29,8 +29,6 @@ Y_incmpl = data_incmpl['Streckenvorhersage.Dauer'] #Prediction anhand vorhandener Daten - - myANN = Sequential() myANN.add(Dense(80, activation='relu', input_dim=X_cmpl.shape[1])) myANN.add(Dense(50,activation='relu')) @@ -47,8 +45,8 @@ print('Mittlere Abweichung auf fehlende Daten: %e ' % (np.mean(np.abs(yDiff)))) -#impute Dauer auf vorhandenen Daten -for index,row in data_incmpl.iterrows(): +#impute Dauer auf vorhandenen Daten indem er jede reihe durchgeht und den durchschnittswert den er in den Originaldaten hat berechnet. +for index,row in data_incmpl.iterrows(): relevant_data= data_cmpl[data_cmpl['time']==row['time']] data_incmpl.loc[index,'Streckenvorhersage.Dauer']=pd.DataFrame.mean(relevant_data['Streckenvorhersage.Dauer']) @@ -57,8 +55,8 @@ data_incmpl = data_incmpl[~np.isnan(data_incmpl['Streckenvorhersage.Dauer'])] # X_incmpl = data_incmpl[['Streckenvorhersage.ZielortID','Streckenvorhersage.StartortID','time','weekday']] Y_incmpl = data_incmpl['Streckenvorhersage.Dauer'] - -X_train, X_test, y_train, y_test = train_test_split(X_cmpl, Y_cmpl, test_size=0.35) +#größere Testmenge aus den originaldaten suchen +X_train, X_test, y_train, y_test = train_test_split(X_cmpl, Y_cmpl, test_size=0.2) y_train = pd.DataFrame(data=y_train,columns=['Streckenvorhersage.Dauer']) X_train=X_train.append(X_incmpl) @@ -73,6 +71,7 @@ myANN.add(Dense(30,activation='relu')) myANN.add(Dense(1,activation='linear')) myANN.compile(loss='mean_squared_error', optimizer='adam') +#ANN mit gefüllten Daten als trainingsmenge myANN.fit(X_train,y_train, epochs=100,shuffle=True,verbose=False) yp = myANN.predict(X_test) yp=np.squeeze(yp) @@ -81,12 +80,12 @@ yDiff = yp - y_test print('Mittlere Abweichung mit aufgefüllten Daten(mean): %e ' % (np.mean(np.abs(yDiff)))) +#das Data-DateaFrame mit den gefüllten Daten füllen y_test = pd.DataFrame(data=y_test,columns=['Streckenvorhersage.Dauer']) - X_all=X_train.append(X_test) y_all=pd.concat([y_train,y_test]) data= X_all y_all= np.asarray(y_all) data['Streckenvorhersage.Dauer']=y_all -data.to_csv('data_filled(mean).csv') - \ No newline at end of file +data.to_csv('data_filled(mean).csv') # Die gefülten Daten in einer neuen csv abspeichern + diff --git a/Imputer/impute_median.py b/Imputer/impute_median.py index 3d1ba7275ec687860989603d3321fd5115bb87a0..1511c07dcc896ca71f2d7227f645b3c5467e6b75 100644 --- a/Imputer/impute_median.py +++ b/Imputer/impute_median.py @@ -55,7 +55,7 @@ X_incmpl = data_incmpl[['Streckenvorhersage.ZielortID','Streckenvorhersage.Start Y_incmpl = data_incmpl['Streckenvorhersage.Dauer'] #größere Testmenge aus den originaldaten suchen -X_train, X_test, y_train, y_test = train_test_split(X_cmpl, Y_cmpl, test_size=0.35) +X_train, X_test, y_train, y_test = train_test_split(X_cmpl, Y_cmpl, test_size=0.2) y_train = pd.DataFrame(data=y_train,columns=['Streckenvorhersage.Dauer']) X_train=X_train.append(X_incmpl) @@ -87,4 +87,4 @@ data= X_all y_all= np.asarray(y_all) data['Streckenvorhersage.Dauer']=y_all data.to_csv('data_filled(median).csv') # Die gefülten Daten in einer neuen csv abspeichern - \ No newline at end of file + diff --git a/Imputer/sort_csv.py b/Imputer/sort_csv.py index 4dbaea4be686b9434996e4118f673bf2137923b9..9a6faa3e1112127c78d269dd49bebb6cde3707e0 100644 --- a/Imputer/sort_csv.py +++ b/Imputer/sort_csv.py @@ -9,27 +9,24 @@ import pandas as pd import numpy as np -data = pd.read_csv('db_dump.csv',delimiter=';') -dumb=data.copy() -relevantData= pd.DataFrame.copy(data[['Streckenvorhersage.ZielortID','Streckenvorhersage.StartortID','Streckenvorhersage.Dauer']]) -helpSeries= pd.DataFrame(np.zeros(relevantData.shape[0])) -#relevantData['day']=helpSeries -#relevantData['month']=helpSeries -#relevantData['year']=helpSeries -relevantData['time']=helpSeries +data = pd.read_csv('db_dump.csv',delimiter=';')#Lese die Csv als Panda Dataframe ein +relevantData= pd.DataFrame.copy(data[['Streckenvorhersage.ZielortID','Streckenvorhersage.StartortID','Streckenvorhersage.Dauer']]) # filtere die relevaten Daten +helpSeries= pd.DataFrame(np.zeros(relevantData.shape[0])) # eine Spalte mit nullen für weitere ergänzten Spalten +#Spalten ergänzen für Zeit, einen Index für den Tag und den einzelnen Wochentagen +relevantData['time']=helpSeries relevantData['day_index']=helpSeries relevantData['weekday']=helpSeries -dates= data['Streckenvorhersage.Datum'] +dates= data['Streckenvorhersage.Datum'] # fürs bessere Arbeiten alle Datum-Einträge in ein Hilfs-Dataframe einlesen for d in range(dates.shape[0]): - toTest = dates[d] + toTest = dates[d] #Aufteilen des Datums in die Bestandteile + zusammenrechnen der gesamt sekunden hours = toTest[11:13] minutes = toTest[14:16] seconds = int(toTest[17:19]) + int(hours)*60*60 + int(minutes)*60 day = toTest[0:2] month = toTest[3:5] year = toTest[6:10] - day_index= int(day)+int(month)*31+int(year)*12 + day_index= int(day)+int(month)*31+int(year)*49 #relevantData.at[d,'month']= month #relevantData.at[d,'day']=day #relevantData.at[d,'year']=year @@ -38,4 +35,4 @@ for d in range(dates.shape[0]): relevantData.at[d,'weekday']=pd.to_datetime(year+'-'+month+'-'+day) relevantData.at[d,'weekday']=relevantData.loc[d,'weekday'].dayofweek -relevantData.to_csv('data.csv') +relevantData.to_csv('data.csv') # neue csv mit lediglich relevanten daten errstellen diff --git a/UI/UI.py b/UI/UI.py new file mode 100644 index 0000000000000000000000000000000000000000..42e9efaf4bfaab147626c2fdf58b2f7b589404bc --- /dev/null +++ b/UI/UI.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon Mar 29 20:54:18 2021 + +@author: Christoph +""" +import tkinter as tk +import pickle +import numpy as np +from datetime import datetime,date + +OptionList = [ +"Hochschule Bochum", +"Centro Oberhausen", +"Unperfekthaus Essen", +"Neanderthalmuseum", +"Kö-Bogen", +"Haus Kemnade", +"ZOOM Erlebniswelt", +"Villa Hügel", +"Wallfahrt Neviges", +"Ruhr Park", +"Schloss Burg", +"Haus Ruhrnatur" +] + +app = tk.Tk() + +app.geometry('300x600') + +variable = tk.StringVar(app) +variable.set(OptionList[0]) + +opt = tk.OptionMenu(app, variable, *OptionList) +opt.config(width=90, font=('Helvetica', 32)) +opt.pack() + +opt.pack() +array=np.array(["Hochschule Bochum","Centro Oberhausen","Unperfekthaus Essen","Neanderthalmuseum","Kö-Bogen","Haus Kemnade","ZOOM Erlebniswelt","Villa Hügel","Wallfahrt Neviges","Ruhr Park","Schloss Burg","Haus Ruhrnatur"]).reshape(-1,1) +def berechne(): + now = datetime.now() + today = date.today() + current_time = now.strftime("%H:%M:%S") + current_date = today.strftime("%d/%m/%Y") + Stunde=current_time[0:2] + Minute=current_time[3:5] + Jahr=current_date[6:] + Monat=current_date[3:5] + Tag=current_date[0:2] + Wochentag=datetime.today().weekday() + for d in range(12): + if (variable.get() == array[d,0]): + ZielortID=d+2 + loaded_model = pickle.load(open('model.sav', 'rb')) + x_test=np.array([ZielortID,Jahr,Monat,Tag,Wochentag,Stunde,Minute]).reshape(1,-1) + result = loaded_model.predict(x_test) + lsum["text"]='Sie benötigen: '+str(result)[1:3]+' Minuten '+str(result)[3:5]+' Sekunden' + #print(str(result)[1:3]+' Minuten '+str(result)[3:5]+' Sekunden') + + +button = tk.Button(app, text="Berechnen", command=berechne, font= ('Helvetica', 26)) +button.pack() +lsum = tk.Label(app, text = 'Sie benötigen: ',font = ('Helvetica', 26)) +lsum.pack() +app.mainloop() diff --git a/UI/model.sav b/UI/model.sav new file mode 100644 index 0000000000000000000000000000000000000000..ea7e274060af82395e64cc710ba69c8ca9a8c171 Binary files /dev/null and b/UI/model.sav differ