def holt_winters_ci(): N, t, m = 100, 80, 4 realisations = pd.Series(list(sample_seasonal_random_walk(N,m)), range(N)) mod = ExponentialSmoothing(realisations[:t+1], trend=True, seasonal=m, initialization_method='estimated').fit(disp=False) print(mod.summary()) forecasts = mod.get_forecast(N-(t+1)) forecasts_ci = forecasts.conf_int(alpha=0.05) plot_ci(realisations, pd.Series(np.nan, range(t+1)).append(forecasts.predicted_mean), forecasts_ci) py.show()
def holtwinter_model(target_variable, n_test, account_id, plot, save): from statsmodels.tsa.api import ExponentialSmoothing from sklearn.metrics import mean_squared_error from math import sqrt import numpy as np from save_forecast import save_forecast #Split target variable into training/test set train, test = train_test_split(target_variable, n_test) y_hat_avg = test.copy() #Fit the model fit1 = ExponentialSmoothing( np.asarray(train[train.columns[0]]), seasonal_periods=7, trend='add', seasonal='add', ).fit() #Create forecast and save to dataframe y_hat_avg['Holt_Winter'] = fit1.forecast(len(test)) #Calculate RMS rms = sqrt(mean_squared_error(test[test.columns[0]], y_hat_avg.Holt_Winter)) #Plot results if plot is True: import matplotlib.pyplot as plt plt.figure(figsize=(16, 8)) #plt.plot(train[train.columns[0]], label='dod_model.Train') plt.plot(test[test.columns[0]], label='Test') plt.plot(y_hat_avg['Holt_Winter'], label='Holt_Winter') plt.legend(loc='best') plt.show() #save forecast if save is True: save_forecast(y_hat_avg["Holt_Winter"], target_variable.columns[0], "holtwinter", account_id) return {"rms": rms, "summary": fit1.summary()}
seasonal = 'add', trend = 'add').fit(smoothing_level=0.01, smoothing_slope=0.1, smoothing_seasonal=0.3) Forecast = TES.forecast(12).rename('Forecast') Actual_Forecast_Df = pd.concat([Fullraw3, Forecast], axis =1) sns.lineplot(data = Actual_Forecast_Df) Validation_Df =Actual_Forecast_Df[-12:].copy() np.mean(abs(Validation_Df['Open'] -Validation_Df['Forecast'])/Validation_Df['Open'])*100 #MAPE################ np.sqrt(np.mean((Validation_Df['Open']- Validation_Df['Forecast'])**2)) TES2 = ExponentialSmoothing(Train, seasonal_periods = 12, seasonal = 'add', trend = 'add').fit() TES2.summary() Forecast_2 = TES2.forecast(12).rename('Forecast_2') Actual_Forecast_Df = pd.concat([Fullraw3, Forecast_2], axis =1) sns.lineplot(data = Actual_Forecast_Df) Validation_Df =Actual_Forecast_Df[-12:].copy() np.mean(abs(Validation_Df['Sales'] -Validation_Df['Forecast_2'])/Validation_Df['Open'])*100 #MAPE################ np.sqrt(np.mean((Validation_Df['Open']- Validation_Df['Forecast_2'])**2))
# Récupérer Estimateurs hw_aic = round(hw.aic, 2) hw_bic = round(hw.bic, 2) dfhw = hw.params_formatted float(dfhw[dfhw.name == 'alpha']['param'].values) hw_α = float(dfhw[dfhw.name == 'alpha']['param'].values) hw_β = float(dfhw[dfhw.name == 'beta']['param'].values) hw_γ = float(dfhw[dfhw.name == 'gamma']['param'].values) print("Paramètres Holt-Winters : α = ", hw_α, " | β = ",hw_β, " | γ = ",hw_γ) # In[25]: hw.summary().tables[1] # #### Test des Résidus "holt-winters" prédits avec Shapiro # In[26]: from scipy.stats import shapiro print("TEST Shapiro P-value = ", shapiro(hw.resid)[1]) # Ici, l'hypothèse de normalité n'est pas remise en cause (p-value = 0.46 > 0.05). # In[27]: