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]