关键词:
【中文标题】python statsmodels:帮助将 ARIMA 模型用于时间序列【英文标题】:python statsmodels: Help using ARIMA model for time series 【发布时间】:2015-10-19 19:48:11 【问题描述】:来自 statsmodels 的 ARIMA 为我的输出提供了不准确的答案。我想知道是否有人可以帮助我理解我的代码出了什么问题。
这是一个示例:
import pandas as pd
import numpy as np
import datetime as dt
from statsmodels.tsa.arima_model import ARIMA
# Setting up a data frame that looks twenty days into the past,
# and has linear data, from approximately 1 through 20
counts = np.arange(1, 21) + 0.2 * (np.random.random(size=(20,)) - 0.5)
start = dt.datetime.strptime("1 Nov 01", "%d %b %y")
daterange = pd.date_range(start, periods=20)
table = "count": counts, "date": daterange
data = pd.DataFrame(table)
data.set_index("date", inplace=True)
print data
count
date
2001-11-01 0.998543
2001-11-02 1.914526
2001-11-03 3.057407
2001-11-04 4.044301
2001-11-05 4.952441
2001-11-06 6.002932
2001-11-07 6.930134
2001-11-08 8.011137
2001-11-09 9.040393
2001-11-10 10.097007
2001-11-11 11.063742
2001-11-12 12.051951
2001-11-13 13.062637
2001-11-14 14.086016
2001-11-15 15.096826
2001-11-16 15.944886
2001-11-17 17.027107
2001-11-18 17.930240
2001-11-19 18.984202
2001-11-20 19.971603
其余代码设置 ARIMA 模型。
# Setting up ARIMA model
order = (2, 1, 2)
model = ARIMA(data, order, freq='D')
model = model.fit()
print model.predict(1, 20)
2001-11-02 1.006694
2001-11-03 1.056678
2001-11-04 1.116292
2001-11-05 1.049992
2001-11-06 0.869610
2001-11-07 1.016006
2001-11-08 1.110689
2001-11-09 0.945190
2001-11-10 0.882679
2001-11-11 1.139272
2001-11-12 1.094019
2001-11-13 0.918182
2001-11-14 1.027932
2001-11-15 1.041074
2001-11-16 0.898727
2001-11-17 1.078199
2001-11-18 1.027331
2001-11-19 0.978840
2001-11-20 0.943520
2001-11-21 1.040227
Freq: D, dtype: float64
如您所见,数据在1
附近保持不变,而不是增加。我在这里做错了什么?
(顺便说一句,由于某种原因,我无法将像 "2001-11-21"
这样的字符串日期传递到预测函数中。知道原因会很有帮助。)
【问题讨论】:
尝试添加typ='level'
进行预测。请参阅***.com/questions/30108091/… 和预测文档字符串。也可以将趋势直接添加到模型中(当前适合)。
谢谢!这解决了我的问题。诚然,我不理解ARIMA.predict
的文档。一定是统计学中的概念。
typ='levels'
,而不是type='level'
。过去可能是'level'
,但文档显示typ : str ‘linear’, ‘levels’
【参考方案1】:
TL;DR
您使用predict
的方式返回线性预测
差分内生变量不是对原始内生变量水平的预测。
您必须使用 typ='levels'
提供 predict
方法以更改此行为:
preds = fit.predict(1, 30, typ='levels')
有关详细信息,请参阅ARIMAResults.predict
的文档。
一步一步
数据集
我们会加载您在 MCVE 中提供的数据:
import io
import pandas as pd
raw = io.StringIO("""date count
2001-11-01 0.998543
2001-11-02 1.914526
2001-11-03 3.057407
2001-11-04 4.044301
2001-11-05 4.952441
2001-11-06 6.002932
2001-11-07 6.930134
2001-11-08 8.011137
2001-11-09 9.040393
2001-11-10 10.097007
2001-11-11 11.063742
2001-11-12 12.051951
2001-11-13 13.062637
2001-11-14 14.086016
2001-11-15 15.096826
2001-11-16 15.944886
2001-11-17 17.027107
2001-11-18 17.930240
2001-11-19 18.984202
2001-11-20 19.971603""")
data = pd.read_fwf(raw, parse_dates=['date'], index_col='date')
正如我们所料,数据是自相关的:
from pandas.plotting import autocorrelation_plot
autocorrelation_plot(data)
模型与训练
我们为给定的设置 (P,D,Q)
创建一个 ARIMA
Model 对象,并使用 fit
方法在我们的数据上对其进行训练:
from statsmodels.tsa.arima_model import ARIMA
order = (2, 1, 2)
model = ARIMA(data, order, freq='D')
fit = model.fit()
它返回一个感兴趣的ARIMAResults
对象。我们可以检查模型的质量:
fit.summary()
ARIMA Model Results
==============================================================================
Dep. Variable: D.count No. Observations: 19
Model: ARIMA(2, 1, 2) Log Likelihood 25.395
Method: css-mle S.D. of innovations 0.059
Date: Fri, 18 Jan 2019 AIC -38.790
Time: 07:54:36 BIC -33.123
Sample: 11-02-2001 HQIC -37.831
- 11-20-2001
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const 1.0001 0.014 73.731 0.000 0.973 1.027
ar.L1.D.count -0.3971 0.295 -1.346 0.200 -0.975 0.181
ar.L2.D.count -0.6571 0.230 -2.851 0.013 -1.109 -0.205
ma.L1.D.count 0.0892 0.208 0.429 0.674 -0.318 0.496
ma.L2.D.count 1.0000 0.640 1.563 0.140 -0.254 2.254
Roots
==============================================================================
Real Imaginary Modulus Frequency
------------------------------------------------------------------------------
AR.1 -0.3022 -1.1961j 1.2336 -0.2894
AR.2 -0.3022 +1.1961j 1.2336 0.2894
MA.1 -0.0446 -0.9990j 1.0000 -0.2571
MA.2 -0.0446 +0.9990j 1.0000 0.2571
------------------------------------------------------------------------------
我们可以粗略估计残差是如何分布的:
residuals = pd.DataFrame(fit.resid, columns=['residuals'])
residuals.plot(kind='kde')
预测
如果我们对我们的模型感到满意,那么我们可以预测一些样本内或样本外的数据。
这可以通过predict
方法完成,该方法默认返回差异内生变量而不是内生变量本身。要改变这种行为,我们必须指定typ='levels'
:
preds = fit.predict(1, 30, typ='levels')
那么我们的预测确实与我们的训练数据具有相同的水平:
此外,如果我们有兴趣也有置信区间,那么我们可以使用forecast
方法。
字符串参数
也可以使用字符串提供predict
(如果您想避免麻烦,请始终使用ISO-8601 格式)或datetime
对象:
preds = fit.predict("2001-11-02", "2001-12-15", typ='levels')
在 StatsModels 0.9.0 上按预期工作:
import statsmodels as sm
sm.__version__ # '0.9.0'
【讨论】:
从 statsmodels AutoReg 的摘要中获取值
】从statsmodelsAutoReg的摘要中获取值【英文标题】:GetValuesoutofsummaryofstatsmodelsAutoReg【发布时间】:2021-03-0420:20:12【问题描述】:我得到了数据,需要估计列的滞后1“AR(1)”的自回归值。我得到的摘要如下所示:importpandasaspdimportpan... 查看详情
python使用sklearn和statsmodels构建多元线性回归模型(multiplelinearregression)并解读(代码片段)
Python使用sklearn和statsmodels构建多元线性回归模型(MultipleLinearRegression)并解读#仿真数据集(预测股票指数)这里的目标是根据两个宏观经济变量:利率和失业率来预测/估计股票指数价格。我们将使用pandasDataFrame在Python中捕获上... 查看详情
忽略 Python 的 statsmodels 中的 NaN
】忽略Python的statsmodels中的NaN【英文标题】:IgnoreNaNsinPython\'sstatsmodels【发布时间】:2018-06-2216:19:18【问题描述】:有没有一种通用的方法可以忽略statsmodels中的NaN?我正在使用statsmodels的AnovaRM函数对各种数据集运行重复测量方差... 查看详情
Python:使用 Statsmodels 预测 y 值 - 线性回归
】Python:使用Statsmodels预测y值-线性回归【英文标题】:Python:PredicttheyvalueusingStatsmodels-LinearRegression【发布时间】:2016-08-2621:14:22【问题描述】:我正在使用Python的statsmodels库来预测使用线性回归的未来余额。csv文件显示如下:年... 查看详情
python使用statsmodels调整线到点(代码片段)
Python 3.6 AttributeError:模块“statsmodels”没有属性“compat”
】Python3.6AttributeError:模块“statsmodels”没有属性“compat”【英文标题】:Python3.6AttributeError:module\'statsmodels\'hasnoattribute\'compat\'【发布时间】:2018-11-0911:21:19【问题描述】:对Python完全陌生。在这个错误上没有看到任何命中。这... 查看详情
Python:多元线性回归:statsmodels.formula.api.ols()
】Python:多元线性回归:statsmodels.formula.api.ols()【英文标题】:Python:MultivariateLinearRegression:statsmodels.formula.api.ols()【发布时间】:2016-10-1506:01:09【问题描述】:我试图从温度、湿度等各种因素中找出总功率的依赖性,并有以下代... 查看详情
为 Statsmodels 线性回归格式化数据
】为Statsmodels线性回归格式化数据【英文标题】:FormatDataforStatsmodelsLinearRegression【发布时间】:2018-04-2403:06:07【问题描述】:我正在尝试在Python中使用Statsmodels进行一些多元线性回归,但我在尝试组织数据时遇到了一些心理障碍... 查看详情
statsmodels笔记:自回归模型autoreg(代码片段)
1基本用法classstatsmodels.tsa.ar_model.AutoReg(endog,lags,trend='c',seasonal=False,exog=None,hold_back=None,period=None,missing='none',*,deterministic=None)2 参数 查看详情
如何使用 statsmodels.formula.api (python) 预测新值
】如何使用statsmodels.formula.api(python)预测新值【英文标题】:Howtopredictnewvaluesusingstatsmodels.formula.api(python)【发布时间】:2016-12-2118:46:56【问题描述】:我使用以下来自乳腺癌数据的逻辑模型训练了逻辑模型,并且仅使用了一个特... 查看详情
python导入statsmodels没有名为'scipy.linlang'的模块(代码片段)
我已经安装了scipy和statsmodels,但是在尝试导入statsmodels时遇到错误:$pipinstallscipy$pipinstallstatsmodels$python>>>importstatsmodelsassmTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>Fi 查看详情
“statsmodels”或其他 Python 包是不是提供与 R 的“step”功能等效的功能?
】“statsmodels”或其他Python包是不是提供与R的“step”功能等效的功能?【英文标题】:Does\'statsmodels\'oranotherPythonpackageofferanequivalenttoR\'s\'step\'function?“statsmodels”或其他Python包是否提供与R的“step”功能等效的功能?【发布时间... 查看详情
python基于statsmodels包构建多元线性回归模型:模型构建模型解析模型推理预测
Python基于statsmodels包构建多元线性回归模型:模型构建、模型解析、模型推理预测目录 查看详情
在 Python Statsmodels 中创建文件 OLS
】在PythonStatsmodels中创建文件OLS【英文标题】:CreatefileOLSinPythonStatsmodels【发布时间】:2018-06-1913:39:38【问题描述】:我对Python了解不多,但我必须破解它才能完成评估,问题:运行以下代码以加载所需的库并创建适合模型的数... 查看详情
Python statsmodels ARIMA 预测
】PythonstatsmodelsARIMA预测【英文标题】:PythonstatsmodelsARIMAForecast【发布时间】:2016-02-1304:56:34【问题描述】:我正在尝试使用pythonstatsmodels进行样本外预测。我不想只预测训练集末尾的下x个值,但我想一次预测一个值,并在预测... 查看详情
python statsmodels - 回归中的二次项
】pythonstatsmodels-回归中的二次项【英文标题】:pythonstatsmodels-quadraticterminregression【发布时间】:2015-11-0520:57:23【问题描述】:我有以下线性回归:importstatsmodels.formula.apiassmmodel=sm.ols(formula=\'a~b+c\',data=data).fit()我想在这个模型中为... 查看详情
在 Python 中使用简单线性回归包的不同结果:statsmodel.api vs sklearn
】在Python中使用简单线性回归包的不同结果:statsmodel.apivssklearn【英文标题】:DifferentResultsusingSimpleLinearRegressionPackagesinPython:statsmodel.apivssklearn【发布时间】:2021-02-0422:53:22【问题描述】:我希望了解为什么我会得到两个不同的... 查看详情
python statsmodels.tsa.seasonal 中的值错误
】pythonstatsmodels.tsa.seasonal中的值错误【英文标题】:valueerrorinpythonstatsmodels.tsa.seasonal【发布时间】:2017-04-0905:20:46【问题描述】:我有这个带有日期时间索引的数据框:ts_log:dateprice_per_unit2013-04-0412.7623692013-04-0512.7771202013-04-0612.77... 查看详情