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()
Пример #2
0
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']
Пример #3
0
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']
Пример #4
0
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")
Пример #6
0
def Multiplicative(df):
    x_smoothed, Y, s, alpha, beta, gamma, rmse = multiplicative(
        list(df.values), 12, 6)
    return Y
Пример #7
0
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):
Пример #8
0
    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)