1.19学习笔记——记录被statsmodels折磨的一下午
一、背景
最近正好在做一个时间序列预测的问题,需要用到分解方法STL,一查statsmodels自带这个模块直接调用就行,于是pip安装:
pip install statsmodels
二、程序运行
安装成功,省去数据预处理的部分先展示一下调用的方法吧!
from statsmodels.tsa.seasonal import STL
stl = STL(data['value'],period=12).fit()
stl.plot()
plt.show()
这些不多说了,网上教程有的是,官方文档解释的也很详细,主要讲一下坑!
三、单位根检验
statsmodels本来就是做统计分析的,用单位根做个时间序列平稳性检验并不难,找教程运行就OK了,可是,重点来了,下面这行import命令一直报错!
from statsmodels.stats.diagnostic import unitroot_adf
ImportError: cannot import name**********(后面我就省略了,因为问题已经解决了,但是没截图)
然后,就一直找问题……
四、解决
1、先看官网吧,查一下unitroot_adf在哪?
对比一下路径没问题啊……
2、去Google了一下statsmodels.stats.diagnostic源码:
发现sandbox里定义了unitroot_adf。
那就改个调用方法:
from statsmodels.sandbox.stats.diagnostic import unitroot_adf
结果还是报错,但是报错和上面稍为有点不同:
说是:import Warnings
无奈,找自己的安装目录查看源码吧!
这太搞笑了,statsmodels.sandbox.py合着就是个摆设!
那就去找statsmodels.stats.diagnostic.py*吧!
但是这里就根本没定义unitroot_adf!
问题还是没解决!
接着……
pip uninstall statsmodels
卸载了最新版本的stats models,安装了了个旧版本:
pip install statsmodels==0.10.2
然后导入:
from statsmodels.stats.diagnostic import unitroot_adf
特别感人! 成功了!
但是,前面的STL又报错了!还是import error……
再后来,又去看官网,终于解决了,其实问题很好解决,就是这个过程特别煎熬,因为不知道问题出在哪里。
解决方法:
sm.tsa.stattools.adfuller(p1['都兰'])
# 输出:
(0.7450912365586915,
0.9906960923424853,
7,
13,
{'1%': -4.068853732362312,
'5%': -3.1271488757396453,
'10%': -2.7017297633136095},
-113.47752924741127)
原因很简单:就是命令调用方式换了而已!
最后,生命在于折腾,经历这一番好像理解的更深刻了~