def execute(dataframe, file_name): # Parameters period_len, next_periods = 12, 12 # Generate result forecast_result, alpha, beta, gamma, rmse = hw.multiplicative(dataframe, period_len, next_periods) # Log result to file out_file_name = 'data/result_' + file_name.split('.')[0] + '_holt_winter.txt' f = open(out_file_name, 'w') print('Full timeframe:\n{}'.format(forecast_result), file=f) print('\n------------------------\n', file=f) print('Partial timeframe:\n{}'.format(forecast_result[-next_periods:]), file=f) print('\n------------------------\n', file=f) print('Alpha = {}'.format(alpha), file=f) print('\n------------------------\n', file=f) print('Beta = {}'.format(beta), file=f) print('\n------------------------\n', file=f) print('Gamma = {}'.format(gamma), file=f) print('\n------------------------\n', file=f) print('RMSE = {}'.format(rmse), file=f) f.close() # Combine dataframe result = pd.concat(objs=[dataframe, forecast_result], axis=1) result.columns = ['Actual', 'Forecast'] # Plot result.plot() plt.show()
def holt_pred_test(steps, path, func): index_name, my_trend = parse_csv(path) if func == 'additive': future, alpha, beta, gamma, rmse = additive(my_trend[-5 * 52:-steps], 52, steps) if func == 'multi': future, alpha, beta, gamma, rmse = multiplicative( my_trend[-5 * 52:-steps], 52, steps) y_pred = np.array(future) y_true = np.array(my_trend[-steps:]) metrics_result = { 'sarima_MAE': metrics.mean_absolute_error(y_true, y_pred), 'sarima_MSE': metrics.mean_squared_error(y_true, y_pred), 'sarima_MAPE': np.mean(np.abs((y_true - y_pred) / y_true)) * 100 } p1 = plt.plot(my_trend[-steps:], '*-') p2 = plt.plot(future) # p1 = plt.plot(index_name,my_trend,'r-') # p2 = plt.plot(index_name_future,future,'g-') plt.ylabel('Search Intensity') plt.xlabel('Year') plt.title('Search Prediction of ' + path.split('/')[-1][:-4]) plt.legend((p1[0], p2[0]), ["Actual", "Predicted"], loc=1) plt.grid(True) # print metrics_result['sarima_MAPE'] return metrics_result['sarima_MAPE']
def holt_pred_test(steps,path,func): index_name,my_trend = parse_csv(path) if func == 'additive': future, alpha, beta, gamma, rmse = additive(my_trend[-5*52:-steps],52,steps) if func == 'multi': future, alpha, beta, gamma, rmse = multiplicative(my_trend[-5*52:-steps],52,steps) y_pred = np.array(future) y_true = np.array(my_trend[-steps:]) metrics_result = {'sarima_MAE':metrics.mean_absolute_error(y_true, y_pred),'sarima_MSE':metrics.mean_squared_error(y_true, y_pred), 'sarima_MAPE':np.mean(np.abs((y_true - y_pred) / y_true)) * 100} p1 = plt.plot(my_trend[-steps:],'*-') p2 = plt.plot(future) # p1 = plt.plot(index_name,my_trend,'r-') # p2 = plt.plot(index_name_future,future,'g-') plt.ylabel('Search Intensity') plt.xlabel('Year') plt.title('Search Prediction of '+path.split('/')[-1][:-4]) plt.legend((p1[0], p2[0]), ["Actual","Predicted"], loc=1) plt.grid(True) # print metrics_result['sarima_MAPE'] return metrics_result['sarima_MAPE']
if __name__ == '__main__': forecastCount = 12 x = np.array([i for i in range(0, len(data)+forecastCount)]) linearfc = np.zeros([1,len(data)+forecastCount]) additivefc = np.zeros([1,len(data)+forecastCount]) multiplefc = np.zeros([1,len(data)+forecastCount]) for i in range(2, len(data)): forecast, alpha, beta, rmse = hw.linear(data[:i], 1) linearfc[0, i:i+len(forecast)] = forecast if i>4: forecast, alpha, beta, gamma, rmse = hw.additive(data[:i], m=4, fc=1) additivefc[0, i:i+len(forecast)] = forecast forecast, alpha, beta, gamma, rmse = hw.multiplicative(data[:i], m=4, fc=1) multiplefc[0, i:i+len(forecast)] = forecast else: forecast, alpha, beta, gamma, rmse = hw.additive(data[:i], m=1, fc=1) additivefc[0, i:i+len(forecast)] = forecast forecast, alpha, beta, gamma, rmse = hw.multiplicative(data[:i], m=1, fc=1) multiplefc[0, i:i+len(forecast)] = forecast # Linear forecast, alpha, beta, rmse = hw.linear(data, forecastCount) linearfc[0,-forecastCount:] = forecast # Additive forecast, alpha, beta, gamma, rmse = hw.additive(data, m=4, fc=forecastCount)
# ---------------------------------------------------------- # Period 1: Jan 1994 to Mar 2016 with forecast to Mar 2017 # ---------------------------------------------------------- fig = plt.figure() fig = plt.figure(figsize=(10,6)) plt.plot(car_sales) plt.title("Figure HW1. Number of Car sales in Australia from January 1994 to March 2017") plt.xlabel("Months") plt.ylabel("Number of Sales") plt.show(block=False) fc1 = 12 # 12 months forecasting h1 = 12 # Number of seasons y_smoothed_mult1, y_forecast_vals1, alpha1, beta1, gamma1, rmse1 = hw.multiplicative(y1_list,fc=fc1,m=h1) plt.plot(x1full_list,y1full_list,label = 'Observed') plt.plot(x1full_list,y_smoothed_mult1[:-1], '-r',color= "red",label ='Multiplicative' + 'rmse = '+str(np.round(rmse1,2))) plt.title('Figure HW2. Number of Car Sales, Holt-Winters Multiplicative Method, January 1994 -March 2017: alpha = '+str(np.round(alpha1,2)) +' ,beta = '+ str(np.round(beta1,2))+',gamma = '+ str(np.round(gamma1,2))) plt.xlabel('Year') plt.legend(loc="lower right") plt.ylabel('Number of Sales') fig = plt.figure() fig = plt.figure(figsize=(10,6)) plt.plot(y_forecast_vals1) plt.title('Figure HW3. Estimated Seasonal Components') plt.xlabel("Months") plt.ylabel("Number of Sales")
def Multiplicative(df): x_smoothed, Y, s, alpha, beta, gamma, rmse = multiplicative( list(df.values), 12, 6) return Y
train = y[:-12] test = y[-12:] x1 = x[:-12] #the additive method forecasting y_smoothed_additive, y_forecast_vals_additive, alpha, beta, gamma,rmse = hw.additive(train.tolist(), fc=fc, m=h) plt.plot(np.hstack((x1,xp)),y_smoothed_additive[:-1], c = 'red',label="Additive forecasts") plt.plot(xp,test,c = 'green',label='test set') plt.legend() print(alpha,beta,gamma) #the multiplicative method forecasting plt.figure(figsize = (12,8)) plt.plot(x,y,label='train set') plt.xlabel('time span') plt.ylabel('house price') plt.title('Multiplicative Holt winters forecasts') y_smoothed_mult, y_forecast_vals_Multi, alpha, beta, gamma,rmse = hw.multiplicative(train.tolist(), fc=fc, m=h) plt.plot(np.hstack((x1,xp)),y_smoothed_mult[:-1], c = 'red',label="Multiplicitive forecasts") plt.plot(xp,test,c = 'green',label='test set') plt.legend() print(alpha,beta,gamma) print(rmse) # model accuracy for the testing set yf1 = y_forecast_vals_additive yf2 = y_forecast_vals_Multi def mae(yf1, test): return np.average(np.abs(yf1-test)) def mae(yf2, test): return np.average(np.abs(yf2-test)) def rmse(yf1,test): return np.sqrt(np.average(np.power(yf1-test,2))) def rmse(yf2,test):
x = np.array([i for i in range(0, len(data) + forecastCount)]) linearfc = np.zeros([1, len(data) + forecastCount]) additivefc = np.zeros([1, len(data) + forecastCount]) multiplefc = np.zeros([1, len(data) + forecastCount]) for i in range(2, len(data)): forecast, alpha, beta, rmse = hw.linear(data[:i], 1) linearfc[0, i:i + len(forecast)] = forecast if i > 4: forecast, alpha, beta, gamma, rmse = hw.additive(data[:i], m=4, fc=1) additivefc[0, i:i + len(forecast)] = forecast forecast, alpha, beta, gamma, rmse = hw.multiplicative(data[:i], m=4, fc=1) multiplefc[0, i:i + len(forecast)] = forecast else: forecast, alpha, beta, gamma, rmse = hw.additive(data[:i], m=1, fc=1) additivefc[0, i:i + len(forecast)] = forecast forecast, alpha, beta, gamma, rmse = hw.multiplicative(data[:i], m=1, fc=1) multiplefc[0, i:i + len(forecast)] = forecast # Linear forecast, alpha, beta, rmse = hw.linear(data, forecastCount)