(采坑记录)时间序列分析和预测学习_1

最近在学时间序列分析和预测的相关内容,看到了本站一篇相当不错的帖子,原文链接:

https://blog.csdn.net/weixin_40787712/article/details/122749425?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E5%B7%AE%E5%88%86%E6%B3%95%E4%BB%A3%E7%A0%81&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-122749425.142^v93^chatgptT3_2&spm=1018.2226.3001.4187d

但是在实际复现代码的时候,出现了很多问题!在此做个记录,解释错误原因,并提供解决办法。

1.在读取数据时:

原文第1部分12-17行代码,运行结果报错,这里附的是原文代码:

# 读取数据,pd.read_csv默认生成DataFrame对象,需将其转换成Series对象
df = pd.read_csv('international-airline-passengers.csv', encoding='utf-8', index_col='Month')
df.index = pd.to_datetime(df.index)  # 将字符串索引转换成时间索引
ts = df['Passengers']  # 生成pd.Series对象
ts = ts.astype('float')
ts.head()

这里需要注意,international-airline-passengers.csv这个数据集,第一列名字是Month,但是第二列名字叫International airline passengers: monthly totals in thousands. Jan 49 ? Dec 60,强烈建议手动改成Passenger,并且记得删除最后一行的International airline passengers: monthly totals in thousands. Jan 49 ? Dec 60

运行后原文结果:

Month
1949-01-01    112.0
1949-02-01    118.0
1949-03-01    132.0
1949-04-01    129.0
1949-05-01    121.0
Name: Passengers, dtype: float64

但是十有八九输出结果是这样的:

Month
2049-01-01    112.0
2049-02-01    118.0
2049-03-01    132.0
2049-04-01    129.0
2049-05-01    121.0
Name: Passengers, dtype: float64

结果差了100年,实际上这个问题比较搞笑,这里的解决方法是,打开你的数据,选第一列,设置单元格格式-日期,选择2001-01-01的格式,不要选成Jun-01的格式

2.检验数据的稳定性部分

在原文2.2部分的21-28行代码处

#Dickey-Fuller test:
def teststationarity(ts,max_lag = None):
    dftest = statsmodels.tsa.stattools.adfuller(ts,maxlag= max_lag)
    # 对上述函数求得的值进行语义描述
    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
    for key,value in dftest[4].items():
        dfoutput['Critical Value (%s)'%key] = value
    return dfoutput

十有八九报错

E       fixture 'ts' not found
>       available fixtures: anyio_backend, anyio_backend_name, anyio_backend_options, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.

实际上这个问题更加搞笑,因为环境里装载了pytest包,当存在该包时,自定义函数开头存在“test”时,pycharm会跳转到test模式,并寻找“teststationarity”函数,当然,这个函数是自定义的肯定没有,就会出现上述报错,解决方法更加简单:将teststationarity换个名字就好了

或者,将本段代码改为如下,也可以运行:

#Dickey-Fuller test:
def stationarity(ts):
    dftest = statsmodels.tsa.stattools.adfuller(ts)
    # 对上述函数求得的值进行语义描述
    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
    for key,value in dftest[4].items():
        dfoutput['Critical Value (%s)'%key] = value
    return dfoutput

3.文章中出现的一切teststationarity(X)后运行没有结果输出

teststationarity(X)只是对其进行了计算,没有打印出来结果,添加一句输出代码就好了

此处的X代表任意参数名

print(X)

4.关于ARIMA的坑

首先,ARIMA的包更新过路径,原文的包读入代码是一定会报错的:

from statsmodels.tsa.arima_model import ARIMA

报错结果:

NotImplementedError: 
statsmodels.tsa.arima_model.ARMA and statsmodels.tsa.arima_model.ARIMA have
been removed in favor of statsmodels.tsa.arima.model.ARIMA (note the .
between arima and model) and statsmodels.tsa.SARIMAX.

statsmodels.tsa.arima.model.ARIMA makes use of the statespace framework and
is both well tested and maintained. It also offers alternative specialized
parameter estimators.

其实这里一看就能知道,报错已经提示出原工具包的函数早就removed了,这里的解决方法是将读入改为

from statsmodels.tsa.arima.model import ARIMA

其次,在原文第4部分的代码中:

model = ARIMA(ts_diff_1, order=(1,1,1)) 
result_arima = model.fit( disp=-1, method='css')
 
predict_data=result_arima.predict(15,150)                # 拟合+预测0~150数据
forecast=result_arima.forecast(21)                      # 预测未来21天数据

这一步,当disp=-1,方法选择'css'时,必定报错:

ValueError: "css" is not a valid estimator.

只要对着fit按住Ctrl+鼠标左键查看函数就知道:

method : str, optional
            The method used for estimating the parameters of the model. Valid
            options include 'statespace', 'innovations_mle', 'hannan_rissanen',
            'burg', 'innovations', and 'yule_walker'. Not all options are
            available for every specification (for example 'yule_walker' can
            only be used with AR(p) models).

method中已经没有css了,而且ARIMA.fit中的变量也不再存在disp了,此时只需删除括号里的参数即可正常运行

model = ARIMA(ts_diff_1, order=(1, 1, 1))
result_arima = model.fit()

predict_data = result_arima.predict(15, 150)  # 拟合+预测0~150数据
forecast = result_arima.forecast(21)  # 预测未来21天数据

总结:

1.本人刚学时序分析预测,接触的东西很少,可能上述部分存在错误,欢迎指正

2.在复现代码时应该还有许多报错,但解决后忘记了报了哪些错,只记得这些,如有报错问题欢迎探讨

3.文章代码复现最大的问题就是ARIMA这个包更新过,很多路径或者函数功能都改了,本人尝试去寻找解读ARIMA包的帖子,但是无功而返,只能自己摸索,现行网上的关于ARIMA教程的帖子,只要是2023年以前的帖子,其代码复现都会遇到函数路径问题,建议多阅读近期的帖子

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值