Python /熊猫-关于ARIMA预测的困惑,以获取简单的预测

时间:2018-11-28 11:23:35

标签: python pandas forecasting arima

试图全神贯注于如何实现ARIMA模型以产生(可以说)简单的预测。从本质上讲,我希望做的是预测今年的预订量,直到今年年底,然后以csv的形式导出。看起来像这样:

date           bookings
2017-01-01     438
2017-01-02     167
...
2017-12-31     45
2018-01-01     748
...
2018-11-29     223
2018-11-30     98
...
2018-12-30     73
2018-12-31     100

预计会有比今天(18/11/28)大的地方。

我尝试做的事情:

这给了我我的数据集,基本上是两列,是2017年全年和预订的每日数据:

import pandas as pd
import statsmodels.api as sm
# from statsmodels.tsa.arima_model import ARIMA
# from sklearn.metrics import mean_squared_error

import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
import matplotlib
matplotlib.rcParams['axes.labelsize'] = 14
matplotlib.rcParams['xtick.labelsize'] = 12
matplotlib.rcParams['ytick.labelsize'] = 12
matplotlib.rcParams['text.color'] = 'k'

df = pd.read_csv('data.csv',names = ["date","bookings"],index_col=0)
df.index = pd.to_datetime(df.index)

这是“建模”位:

X = df.values
size = int(len(X) * 0.66)
train, test = X[0:size], X[size:len(X)]
history = [x for x in train]
predictions = list()
for t in range(len(test)): 
    model = ARIMA(history, order=(1,1,0))
    model_fit = model.fit(disp=0)
    output = model_fit.forecast()

    yhat = output[0]
    predictions.append(yhat) 

    obs = test[t]
    history.append(obs)

    #   print('predicted=%f, expected=%f' % (yhat, obs))
#error = mean_squared_error(test, predictions)
#print(error)
#print('Test MSE: %.3f' % error)
# plot
plt.figure(num=None, figsize=(15, 8))
plt.plot(test)
plt.plot(predictions, color='red')
plt.show()

将结果导出到csv:

df_forecast = pd.DataFrame(predictions)
df_test = pd.DataFrame(test)
result = pd.merge(df_test, df_forecast, left_index=True, right_index=True)
result.rename(columns = {'0_x': 'Test', '0_y': 'Forecast'}, inplace=True)

我遇到的麻烦是:

  • 了解训练/测试子集。如果我错了,请纠正我,但是使用训练集训练模型并生成“预测”数据,然后通过“测试”将预测与测试进行比较?
  • 2017年的数据看起来不错,但是如何在2018年的数据上实现呢?如何获得训练/测试集?我什至需要它吗?

我认为我需要做的事情:

  • 从我的数据库中获取2017年和2018年的预订数据集
  • 在2017年和2018年之前将其拆分
  • 对2018年做出一些预测
  • 将此2018年+预测数据追加到2017年并导出为csv

操作方法以及为什么是我遇到的问题。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

这里有一些想法:

  • 了解训练/测试子集。如果我错了,请纠正我,但是使用训练集训练模型并生成“预测”数据,然后通过“测试”将预测与测试进行比较?

是的,这是正确的。这个想法与任何机器学习模型相同,在训练/测试中拆分数据,使用训练数据拟合模型,并使用测试使用一些误差度量将实际模型预测与实际数据进行比较。但是,当您处理时间序列数据时,必须按照时间顺序执行训练/测试拆分。

  • 2017年的数据看起来不错,但是如何在2018年的数据上实现呢?如何获得训练/测试集?我什至需要它吗?

您实际上拥有2018年数据的csv吗?进行训练/测试划分所需要做的一切都与处理2017年数据相同,即保持训练规模不变,然后结束测试train, test = X[0:size], X[size:len(X)]的预测。但是,如果您要对今天的日期进行预测,为什么不将所有历史数据用作模型的输入并进行预测呢?

我认为我需要做的

  • 在2017年和2018年之前将其拆分

您为什么要拆分它?只需将您的ARIMA模型的所有数据作为一个单一的时序序列输入,即可附加两个年度数据,并使用最后的size个样本作为测试。考虑到样本数量越大,估计值越好。验证了模型的性能后,就可以使用它来进行预测。