def RunIterativePredict(FeaturesDFin, currentStep): FeaturesDF = FeaturesDFin.copy() FeaturesDF_raw = FeaturesDF.copy() if Settings["Normalise"] == "Yes": for col in FeaturesDF.columns: FeaturesDF[col] = ( FeaturesDF[col] - FeaturesDF_raw[col].mean()) / FeaturesDF_raw[col].std() if Settings["Regressor"] == "NN": nn_options = { # options for neural network 'hidden_layer_sizes': (2, 1), 'solver': 'lbfgs', 'activation': 'tanh', 'max_iter': 1500, # default 200 'alpha': 0.001, # default 0.0001 'random_state': None # default None } model = MLPRegressor(**nn_options) elif Settings["Regressor"] == "GPR": mainRolling_kernel = ConstantKernel() + Matern() + DotProduct( ) + WhiteKernel() # + PairwiseKernel() + RBF() + ExpSineSquared() #mainRolling_kernel = 1**2*ConstantKernel() + 1**2*Matern() + 1**2*DotProduct() + 1**2* ExpSineSquared() + 1**2*WhiteKernel() # + PairwiseKernel() + RBF() + ExpSineSquared() model = GaussianProcessRegressor( kernel=mainRolling_kernel, random_state=0, n_restarts_optimizer=2) #, normalize_y=True elif Settings["Regressor"] == "LSTM": model = Sequential() model.add(LSTM(7, input_shape=(1, FeaturesDF.shape[1]))) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') iterPredsList = [] iterPreds_Std_List = [] if "SingleStepPredict" in Settings["Reporter"]: fitInputX = FeaturesDF.shift(1).bfill().values fitTargetY = FeaturesDF[targetVarName].values.reshape(-1, 1) if Settings["Regressor"] == "LSTM": fitInputX = fitInputX.reshape(trainX, (1, FeaturesDF.shape[1])) for i in range(10): model.fit(fitInputX, fitTargetY, epochs=1, batch_size=5, verbose=0, shuffle=False) model.reset_states() else: model.fit(fitInputX, fitTargetY) if Settings['Regressor'] in ["NN", "LSTM"]: firstPred = model.predict(FeaturesDF.iloc[-1].values.reshape( 1, -1))[0] firstPred_Std = 0 elif Settings['Regressor'] == "GPR": firstPred, firstPred_Std = model.predict( FeaturesDF.iloc[-1].values.reshape(1, -1), return_std=True) firstPred = firstPred[0][0] firstPred_Std = firstPred_Std[0] iterPredsList.append(firstPred) iterPreds_Std_List.append(firstPred_Std) elif "Iterative" in Settings["Reporter"]: "Iterative Predictions" inputDataList_rep = [] for j in range(Settings["predictAhead"] - 1): if j == 0: fitInputX = FeaturesDF.shift(1).bfill().values fitTargetY = FeaturesDF[targetVarName].values.reshape( -1, 1) if Settings["Regressor"] == "LSTM": fitInputX = np.reshape(fitInputX, (1, FeaturesDF.shape[1])) for i in range(10): model.fit(fitInputX, fitTargetY, epochs=1, batch_size=1, verbose=0, shuffle=False) model.reset_states() else: model.fit(fitInputX, fitTargetY) if Settings['Regressor'] in ["NN", "LSTM"]: firstPred = model.predict( FeaturesDF.iloc[-1].values.reshape(1, -1))[0] firstPred_Std = 0 elif Settings['Regressor'] == "GPR": firstPred, firstPred_Std = model.predict( FeaturesDF.iloc[-1].values.reshape(1, -1), return_std=True) #print(firstPred) #print(firstPred_Std) #time.sleep(3000) firstPred = firstPred[0][0] firstPred_Std = firstPred_Std[0] iterPredsList.append(firstPred) iterPreds_Std_List.append(firstPred_Std) expanding_infectedDF = infectedDF.copy().iloc[:currentStep + j + 1] newDate = expanding_infectedDF.index[-1] knownWeather = allWeatherDF.loc[newDate].values knownMobility = mobility_df.loc[newDate] if Settings["Normalise"] == "Yes": invertNormIterPreds = [ x * FeaturesDF_raw[targetVarName].std() + FeaturesDF_raw[targetVarName].mean() for x in iterPredsList ] else: invertNormIterPreds = iterPredsList expanding_infectedDF.iloc[-len(iterPredsList):] = np.array( invertNormIterPreds) expanding_infectedDF_shifted = getShifts( expanding_infectedDF, Settings['lags']) if Settings["Scenario"] <= 1: inputDataList = [invertNormIterPreds[-1]] for elem in expanding_infectedDF_shifted.iloc[-1]: inputDataList.append(elem) for elem in knownWeather: inputDataList.append(elem) inputDataList.append(knownMobility) elif Settings["Scenario"] in [2, 3]: inputDataList = [invertNormIterPreds[-1]] for elem in expanding_infectedDF_shifted.iloc[-1]: inputDataList.append(elem) elif Settings["Scenario"] == 4: inputDataList = [invertNormIterPreds[-1]] inputDataList.append(knownMobility) elif Settings["Scenario"] == 5: inputDataList = [invertNormIterPreds[-1]] for elem in knownWeather: inputDataList.append(elem) inputDataList_rep.append([newDate, str(inputDataList)]) if Settings["Normalise"] == "Yes": for colCount in range(len(FeaturesDF_raw.columns)): inputDataList[colCount] = ( inputDataList[colCount] - FeaturesDF_raw.iloc[:, colCount].mean() ) / FeaturesDF_raw.iloc[:, colCount].std() if Settings["Regressor"] == "NN": inputPointArray = np.array(inputDataList) iterPred = model.predict(inputPointArray.reshape(1, -1))[0] iterPred_std = 0 else: inputPointArray = np.array(inputDataList) iterPred, iterPred_std = model.predict( inputPointArray.reshape(1, -1), return_std=True) iterPred = iterPred[0][0] iterPred_std = iterPred_std[0] iterPredsList.append(iterPred) iterPreds_Std_List.append(iterPred_std) iterPredsList.insert(0, FeaturesDF_raw.index[-1]) iterPreds_Std_List.insert(0, FeaturesDF_raw.index[-1]) if Settings["Normalise"] == "Yes": "standard normalisation" iterPredsList[1:] = [ x * FeaturesDF_raw[targetVarName].std() + FeaturesDF_raw[targetVarName].mean() for x in iterPredsList[1:] ] iterPreds_Std_List[1:] = [ x * FeaturesDF_raw[targetVarName].std() for x in iterPreds_Std_List[1:] ] if (Settings["Scenario"] == 1) & (RegionName in ["Campania", "Lombardia"]): pd.concat([expanding_infectedDF, infectedDF.loc[expanding_infectedDF.index], allWeatherDF.loc[expanding_infectedDF.index], mobility_df.loc[expanding_infectedDF.index], pd.DataFrame(inputDataList_rep, columns=['data', 'inputs']).set_index('data', )], axis=1)\ .to_excel(modelDataPath+str(Settings["Scenario"])+RegionName+"_expanding_infectedDF.xlsx") return [iterPredsList, iterPreds_Std_List]