diff --git a/Imputer/impute_median.py b/Imputer/impute_median.py new file mode 100644 index 0000000000000000000000000000000000000000..3d1ba7275ec687860989603d3321fd5115bb87a0 --- /dev/null +++ b/Imputer/impute_median.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon Mar 29 09:04:41 2021 + +@author: Christoph +""" +import pandas as pd +import numpy as np +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import Dense +from sklearn.model_selection import train_test_split +np.random.seed(42) + +data = pd.read_csv('data_unfilled.csv') +data= data.iloc[:,1:] + +#komplette Daten fürs Training: +data_cmpl = data.loc[data['Streckenvorhersage.Dauer']!= 0] +X_cmpl = data_cmpl[['Streckenvorhersage.ZielortID','Streckenvorhersage.StartortID','time','weekday']] +Y_cmpl = data_cmpl['Streckenvorhersage.Dauer'] +X_cmpl_train, X_cmpl_test, y_cmpl_train, y_cmpl_test = train_test_split(X_cmpl, Y_cmpl, test_size=0.2) + + +# fehlende Daten für Test: +data_incmpl = data.loc[data['Streckenvorhersage.Dauer']== 0] +X_incmpl = data_incmpl[['Streckenvorhersage.ZielortID','Streckenvorhersage.StartortID','time','weekday']] +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')) +myANN.add(Dense(30,activation='relu')) +myANN.add(Dense(1,activation='linear')) +myANN.compile(loss='mean_squared_error', optimizer='adam') + +myANN.fit(X_cmpl_train,y_cmpl_train, epochs=100,shuffle=True,verbose=False) +yp = myANN.predict(X_cmpl_test) +yp=np.squeeze(yp) + +yDiff = yp - y_cmpl_test +print('Mittlere Abweichung auf fehlende Daten: %e ' % (np.mean(np.abs(yDiff)))) + + + +#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.median(relevant_data['Streckenvorhersage.Dauer']) + +data_incmpl = data_incmpl[~np.isnan(data_incmpl['Streckenvorhersage.Dauer'])] # testing here + +X_incmpl = data_incmpl[['Streckenvorhersage.ZielortID','Streckenvorhersage.StartortID','time','weekday']] +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) +y_train = pd.DataFrame(data=y_train,columns=['Streckenvorhersage.Dauer']) + +X_train=X_train.append(X_incmpl) +Y_incmpl = pd.DataFrame(data=Y_incmpl,columns=['Streckenvorhersage.Dauer']) +y_train=pd.concat([y_train,Y_incmpl]) + + +myANN = Sequential() +myANN.add(Dense(80, activation='relu', input_dim=X_cmpl.shape[1])) +myANN.add(Dense(50,activation='relu')) +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) + +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(median).csv') # Die gefülten Daten in einer neuen csv abspeichern + \ No newline at end of file