【问题标题】:How to predict a time series set with statsmodels Holt-Winters如何使用 statsmodels Holt-Winters 预测时间序列集
【发布时间】:2020-09-17 22:36:15
【问题描述】:

我有一组从 2012 年 1 月到 2014 年 12 月的数据,这些数据显示了一些趋势和季节性。我想使用 statsmodels 中的 Holt-Winters 方法对未来 2 年(从 2015 年 1 月到 2017 年 12 月)进行预测。 数据集如下:

date,Data
Jan-12,153046
Feb-12,161874
Mar-12,226134
Apr-12,171871
May-12,191416
Jun-12,230926
Jul-12,147518
Aug-12,107449
Sep-12,170645
Oct-12,176492
Nov-12,180005
Dec-12,193372
Jan-13,156846
Feb-13,168893
Mar-13,231103
Apr-13,187390
May-13,191702
Jun-13,252216
Jul-13,175392
Aug-13,150390
Sep-13,148750
Oct-13,173798
Nov-13,171611
Dec-13,165390
Jan-14,155079
Feb-14,172438
Mar-14,225818
Apr-14,188195
May-14,193948
Jun-14,230964
Jul-14,172225
Aug-14,129257
Sep-14,173443
Oct-14,188987
Nov-14,172731
Dec-14,211194

如下所示:

我正在尝试构建 Holt-Winters 模型,以提高过去数据的预测性能(这意味着,一个新的图表,我可以在其中查看我的参数是否可以很好地预测过去)以及稍后对未来几年的预测。我使用以下代码进行了预测,但无法进行预测。

# Data loading
data = pd.read_csv('setpoints.csv', parse_dates=['date'], index_col=['date'])
df_data = pd.DataFrame(datos_matric, columns=['Data'])

df_data['Data'].index.freq = 'MS'
train, test = df_data['Data'], df_data['Data']
model = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=12).fit()
period = ['Jan-12', 'Dec-14']
pred = model.predict(start=period[0], end=period[1])


df_data['Data'].plot(label='Train')
test.plot(label='Test')
pred.plot(label='Holt-Winters')
plt.legend(loc='best')
plt.show()

看起来像:

现在有人如何预测吗?

【问题讨论】:

    标签: python pandas statsmodels forecasting holtwinters


    【解决方案1】:

    我认为你在这里犯了一个误解。您不应该对traintest 使用相同的数据。测试数据是您的模型“尚未看到”的数据点。通过这种方式,您可以测试模型的性能。所以我用你最近三个月的数据为test

    至于预测,我们可以使用不同的startend点。

    另请注意,我将mul 用作seasonal component,它在您的数据上表现更好:

    # read in data and convert date column to MS frequency
    df = pd.read_csv(data)
    df['date'] = pd.to_datetime(df['date'], format='%b-%y')
    df = df.set_index('date').asfreq('MS')
    
    # split data in train, test
    train = df.loc[:'2014-09-01']
    test = df.loc['2014-10-01':]
    
    # train model and predict
    model = ExponentialSmoothing(train, seasonal='mul', seasonal_periods=12).fit()
    #model = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=12).fit()
    pred_test = model.predict(start='2014-10-01', end='2014-12-01')
    pred_forecast = model.predict(start='2015-01-01', end='2017-12-01')
    
    # plot data and prediction
    df.plot(figsize=(15,9), label='Train')
    pred_test.plot(label='Test')
    pred_forecast.plot(label='Forecast')
    plt.legend()
    plt.show()
    plt.savefig('figure.png')
    

    【讨论】:

    • 太棒了! predictionforecast 函数之间有什么不同?我认为model.forecast(steps=24) 也可以提供,不是吗?
    • 是的,但是您要设置steps=27,因为模型一直训练到9th 月,这可能更通用,因为您不必提供开始和结束日期。因此,这些步骤取决于您在索引上设置的frequency。所以在这种情况下每月一次。
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2016-02-16
    • 2023-03-08
    • 2011-08-17
    • 2016-06-27
    相关资源
    最近更新 更多