python - 以广泛的数据格式循环 python auto_arima 通过几列
问题描述
我会先说我绝不是 Python 专家,但我目前的项目要求它用 Python 编程,所以感谢任何帮助。我所拥有的是一个包含每月数据(30 个月)和 1000 多个项目的转换时间序列。
我希望为这些列中的每一个运行 arima。它们不相互依赖。本质上,它就像运行 1000 次独立的 Arima 分析。
我通过为每个项目创建一个数据框列表并使用 R 的 auto arima 函数在列表中循环,在 R 中对这个功能进行了编程。它缓慢而笨重,但完成了工作。
在 Python 中做这件事我没有找到一种方法来创建这个结构并使其可行。相反,我找到了一些代码并试图从中创建一个循环。现在, auto_arima 在此运行,但它覆盖了结果,我真的不知道如何使它可行。
我需要运行 auto_arima,因为这些项目具有单独的最佳 P、D、Q 参数。
X为数据,结构为:index, item1, item2, item3...itemn
dict_org = {}
dict_pred = {}
for col in X:
size = int(len(X) * 0.70)
train, testdata = X[0:size], X[size:len(X)]
history = [x for x in train[column]]
predictions = list()
for column in testdata:
model = pm.auto_arima(history, start_p=1, start_q=1,
test='adf', # use adftest to find optimal 'd'
max_p=3, max_q=3, # maximum p and q
m=1, # frequency of series
d=None, # let model determine 'd'
seasonal=False, # No Seasonality
start_P=0,
D=0,
trace=True,
error_action='ignore',
suppress_warnings=True,
stepwise=True) # this works
output = model.predict()
yhat = output[0]
predictions.append(yhat)
obs = testdata[column]
history.append(obs)
print("Predicted:%f, expected:%f" %(yhat, obs))
error = mean_squared_error(testdata, predictions[:len(testdata)])
print('Test MSE: %.3f' % error)
dict_org.update({X[col]: testdata})
dict_pred.update({X[col]: predictions})
print("Item: ", X[col], "Test MSE:%f"% error)
我想要得到的是一个包含所有项目和预测的字典,类似于我通过将 R 的自动 arima 传递给数据帧列表所得到的。我现在不断将 yhat 更新为 1 个观察结果,我不知所措。
我将非常感谢您的帮助。
解决方案
您现在可能已经找到了解决方案,但我会留下一个答案,以防其他人偶然发现它。
auto_arima 不是模型本身。这是一个帮助找到最佳模型订单的功能。在上述情况下,您要做的是为其分配一个变量并访问订单和季节性订单,以及最佳模型的 AIC。您可以创建一个小函数来执行这部分,然后将输出用于实际模型。
def find_orders(ts):
stepwise_model = pm.auto_arima(history, start_p=1, start_q=1,
test='adf', # use adftest to find optimal 'd'
max_p=3, max_q=3, # maximum p and q
m=1, # frequency of series
d=None, # let model determine 'd'
seasonal=False, # No Seasonality
start_P=0,
D=0,
trace=True,
error_action='ignore',
suppress_warnings=True,
stepwise=True) # this works
return stepwise_model.order, stepwise_model.seasonal_order
然后,您可以为建模部分创建另一个函数 - 假设您称之为 fit_arima - 并为循环中的每个时间序列传递模型中的订单和季节性订单。
for column in testdata:
order, seasonal_order = find_orders(ts)
fit_arimax(ts, order=order, seasonal_order=seasonal_order)
希望有帮助!
推荐阅读
- c# - 将结构列表转换为字典的最有效方法是什么?
- excel - 是否可以在其中更新 For End 参数?
- forms - Symfony 4 表单未发送到数据库,可能是 datetimepicker 问题
- c# - 无法将文件从当前目录复制到远程目录路径
- javascript - 选择所有未触发其各自 .change 功能的复选框
- javascript - jQuery按顺序迭代整数
- c# - 实体框架代码第一个值对象持久保存到数据库
- jmeter - Pass JMeter property value generated by JSR233 sampler to new request
- xamarin - 他们是否可以通过单击另一个页面的按钮来更改选择器的选定索引?
- git - Visual Studio 中的完整 Git 集成