Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/Pandas-混淆ARIMA预测以获得简单预测_Python_Pandas_Forecasting_Arima - Fatal编程技术网

Python/Pandas-混淆ARIMA预测以获得简单预测

Python/Pandas-混淆ARIMA预测以获得简单预测,python,pandas,forecasting,arima,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

我一直在思考如何实现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
如果预测有比今天(2018年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
操作方法和原因是我遇到的问题。
任何帮助都将不胜感激

以下是一些想法:

  • 了解列车/测试子集。如果我错了,请纠正我,但列车组用于训练模型并生成“预测”数据,然后测试用于将预测与测试进行比较
是的,没错。该思想与任何机器学习模型相同,在训练/测试中分割数据,使用训练数据拟合模型,并使用测试使用一些误差度量将实际模型预测与实际数据进行比较。但是,在处理时间序列数据时,必须按照时间顺序执行列车/测试拆分,就像您已经做的那样

  • 2017年的数据看起来不错,但我如何在2018年的数据上实施呢?如何获取列车/测试集?我需要它吗
您是否有2018年数据的csv?在训练/测试中,你需要做的一切与你对2017年数据所做的一样,也就是说,一直保持到某个大小与训练相同,并留下末端来测试你的预测
train,test=X[0:size],X[size:len(X)]
。但是,如果您想要的是对今天以后的日期的预测,为什么不使用所有历史数据作为模型的输入并使用这些数据进行预测呢

我认为我需要做什么

  • 到2017年和2018年将其拆分

你为什么要分开它?只需将所有数据作为单个时间序列序列输入您的ARIMA模型,从而附加两个年度数据,并使用最后的
size
样本作为测试。考虑到样本量越大,估计值越高。一旦您验证了模型的性能,使用它从今天开始进行预测。

嗨,AK91,您读到了什么,问题是什么?这个标题有点误导人。下面没有使用ARIMA,但是你可能想读一些概念,我读过prophet,但是我在安装或其他方面遇到了一些问题?不过我还要再试试。就我所读到的内容而言,以下是链接:。问题是如何对2018年数据进行预测,我的列车/测试子集是什么?这对我来说有点新鲜/困惑…看尼克松的回答。但是这是个人的,我不认为博客是一个很好的信息来源。谢谢你的回答和澄清。我猜问题就在最后一点“一旦你验证了模型的性能,就用它来预测从今天开始。”-这是否意味着,使用我的代码,将我的for循环修改为类似于t范围内的
(len(明天到年底))
?所以我所有的数据都是我的火车组?测试基本上是预测?…为这些蹩脚的问题道歉…是的,没错。对于预测,您必须将迭代时间延长到您希望预测的日期。因此,与验证模型所做的相同,即检查预测的均方误差,但从
len(序列):last_forecast_date
尝试了一切使其工作-仍然没有得到模型的预期用途,当我使用的教程在培训/测试阶段停止,并且没有解释实际的应用/预测阶段时,没有任何帮助…无论如何,我会在这方面做一些适当的作业,而不是尝试快速修复…感谢您的帮助,非常感谢