python数据建模步骤_AR(I)MA时间序列建模过程——步骤和python代码
数据挖掘入门与实战 公众号: datadw
1.异常值和缺失值的处理
这绝对是数据分析时让所有人都头疼的问题。异常和缺失值会破坏数据的分布,并且干扰分析的结果,怎么处理它们是一门大学问,而我根本还没入门。
(1)异常值
https://ocefpaf.github.io/python4oceanographers/blog/2015/03/16/outlier_detection/
提供了关于如何对时间序列数据进行异常值检测的方法,作者认为移动中位数的方法最好,代码如下:
from pandas import rolling_median
threshold = 3 #指的是判定一个点为异常的阈值df['pandas'] =
rolling_median(df['u'], window=3, center=True)
.fillna(method='bfill').fillna(method='ffill')
#df['u']是原始数据,df['pandas'] 是求移动中位数后的结果,
window指的是移动平均的窗口宽度difference = np.abs(df['u'] - df['pandas'])
outlier_idx = difference > threshold
rolling_median函数详细说明参见pandas.rolling_median
(2)缺失值
缺失值在DataFrame中显示为nan,它会导致ARMA无法拟合,因此一定要进行处理。
a.用序列的均值代替,这样的好处是在计算方差时候不会受影响。但是连续几个nan即使这样替代也会在差分时候重新变成nan,从而影响拟合回归模型。
b.直接删除。我在很多案例上看到这样的做法,但是当一个序列中间的nan太多时,我无法确定这样的做法是否还合理。
2.平稳性检验
序列平稳性是进行时间序列分析的前提条件,主要是运用ADF检验。
from statsmodels.tsa.stattools import adfullerdef test_stationarity(timeseries):
dftest = adfuller(timeseries, autolag='AIC') return dftest[1]
#此函数返回的是p值
3.不平稳的处理
(1)对数处理。对数处理可以减小数据的波动,因此无论第1步检验出序列是否平稳,都最好取一次对数。关于为什么统计、计量学家都喜欢对数的原因,知乎上也有讨论:在统计学中为什么要对变量取对数?
https://www.zhihu.com/question/22012482
(2)差分。一般来说,非纯随机的时间序列经一阶差分或者二阶差分之后就会变得平稳。那差分几阶合理呢?我的观点是:在保证ADF检验的p<0.01的情况下,阶数越小越好,否则会带来样本减少、还原序列麻烦、预测困难的问题。——这是我的直觉,还没有查阅资料求证。基于这样的想法,构造了选择差分阶数的函数:
(3)平滑法。利用移动平均的方法来处理数据,可能可以用来处理周期性因素,我还没实践过。
4.随机性检验
只有时间序列不是一个白噪声(纯随机序列)的时候,该序列才可做分析。
from statsmodels.stats.diagnostic import acorr_ljungboxdef test_stochastic(ts):
p_value = acorr_ljungbox(ts, lags=1)[1] #lags可自定义
return p_value
http://www.statsmodels.org/devel/generated/statsmodels.stats.diagnostic.acorr_ljungbox.html?highlight=acorr_ljungbox#statsmodels.stats.diagnostic.acorr_ljungbox
5.确定ARMA的阶数
ARMA(p,q)是AR(p)和MA(q)模型的组合,关于p和q的选择,一种方法是观察自相关图ACF和偏相关图PACF, 另一种方法是通过借助AIC、BIC统计量自动确定。由于我有几千个时间序列需要分别预测,所以选取自动的方式,而BIC可以有效应对模型的过拟合,因而选定BIC作为判断标准。
这个函数的原理是,根据设定的maxLag,通过循环输入p和q值,选出拟合后BIC最小的p、q值。
然而在statsmodels包里还有更直接的函数:
import statsmodels.tsa.stattools as st
order = st.arma_order_select_ic(timeseries,max_ar=5,max_ma=5,ic=['aic', 'bic', 'hqic'])
order.bic_min_order
timeseries是待输入的时间序列,是pandas.Series类型,max_ar、max_ma是p、q值的最大备选值。
order.bic_min_order返回以BIC准则确定的阶数,是一个tuple类型
6.拟合ARAM
from statsmodels.tsa.arima_model import ARMA
model = ARMA(timeseries, order=order.bic_min_order)
result_arma = model.fit(disp=-1, method='css')
对于差分后的时间序列,运用于ARMA时该模型就被称为ARMIA,在代码层面改写为model = ARIMA(timeseries, order=(p,d,q)),但是实际上,用差分过的序列直接进行ARMA建模更方便,之后添加一步还原的操作即可。
7.预测的y值还原
从前可知,放入模型进行拟合的数据是经过对数或(和)差分处理的数据,因而拟合得到的预测y值要经过差分和对数还原才可与原观测值比较。
暂时写了对数处理过的还原:
def predict_recover(ts):
ts = np.exp(ts) return ts
8.判定拟合优度
在我学习计量经济学的时候,判断一个模型拟合效果是用一个调整R方的指标,但是似乎在机器学习领域,回归时常用RMSE(Root Mean Squared Error,均方根误差),可能是因为调整R方衡量的预测值与均值之间的差距,而RMSE衡量的是每个预测值与实际值的差距。
train_predict = result_arma.predict()
train_predict = predict_recover(train_predict)
#还原RMSE = np.sqrt(((train_predict-timeseries)**2)
.sum()/timeseries.size)
9.预测未来的值
用statsmodel这个包来进行预测,很奇怪的是我从来没成功过,只能进行下一步(之后一天)的预测,多天的就无法做到了。这里提供他们的代码,供大家自行试验,成功的话一定要留言教我啊!跪谢。
predict_ts = result_arma.predict()
for t in range(len(test)):
model = ARIMA(history, order=(5,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))
10. 更方便的时间序列包:pyflux
好在《AR、MA及ARMA模型》提到了python的另一个包pyflux,它的文档在PyFlux 0.4.0 documentation。这个包在macOS上安装之前需要安装XCode命令行工具:
xcode-select --install
同时它的画图需要安装一个seaborn的包(如果没有Anaconda则用pip的方式。《数据可视化(三)- Seaborn简易入门》简要介绍了seaborn,它是“在matplotlib的基础上进行了更高级的API封装”。
conda install seaborn
我用这个包写了一个简略而完整的ARIMA建模:
http://www.pyflux.com/docs/arima.html
数据挖掘入门与实战
搜索添加微信公众号:datadw
教你机器学习,教你数据挖掘
长按图片,识别二维码,点关注
公众号: weic2c 据分析入门与实战
长按图片,识别二维码,点关注
python数据建模步骤_AR(I)MA时间序列建模过程——步骤和python代码相关推荐
- python数据可视化的特点_python的数据分析到底是啥?python数据可视化怎么做?
python是个啥?它一个强大的编程语言.数据分析是个啥?它一目了然,就是将数据进行分析,看看能得出什么结论.那python的数据分析到底是啥?其实就是通过这个语言将数据分析做出来,更加便捷化,更加速 ...
- python数据预测模型算法_如何对时间序列预测问题计算基准预测(python)
例程数据下载 建立基准对于时间序列预测问题是及其重要的. 基准效果会告诉你其他模型在解决你的问题的时候的实际效果有多好. 在这个教程中,你会发现如何制作一个persistence预测,用来对时间序列数 ...
- python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象
第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...
- 在Python中使用LSTM和PyTorch进行时间序列预测
全文链接:http://tecdat.cn/?p=8145 顾名思义,时间序列数据是一种随时间变化的数据类型.例如,24小时内的温度,一个月内各种产品的价格,一年中特定公司的股票价格(点击文末&quo ...
- 小白学数据_|_28张小抄表大放送:Python,R,大数据,机器学习
1. Python的数据科学快速入门指南 如果你刚入门Python,那么这张小抄表非常适合你.查看这份小抄表,你将获得循序渐进学习Python的指导.它提供了Python学习的必备包和一些有用的学习技 ...
- 网易组建Python数据分析学习群,3场直播课+6G学习资料免费领
学会Python之后的你会有什么不同? 写几十行代码便能实现表情包爬取: 用几行代码就能快速整理数据并出图: 甚至可以编写合成多个Excel表格的Python脚本,一键跳过复制粘贴: 今天给大家送个福 ...
- 每日一课 | Python数据可视化—如何分区和绘图
06 大家好,我是营长,昨天营长分享了数据科学"的知识点:,不清楚的小伙伴可戳这????每日一课|Python数据可视化-重新认识坐标系 本期营长接着为大家分享Python数据可视化相关内容 ...
- python语言的特点和应用场景_python语言有什么特点?python应用领域有哪些?
随着人工智能.大数据的发展,各大企业都开始抢夺市场,而python语言作为该领域的首选语言,广受大家的喜欢,现在越来越多人都想要学习python,为什么呢? python语言有什么特点? 1.简洁高效 ...
- Python 数据可视化的 3 大步骤,你知道吗?
Python实现可视化的三个步骤: 确定问题,选择图形 转换数据,应用函数 参数设置,一目了然 1.首先,要知道我们用哪些库来画图? matplotlib Python中最基本的作图库就是matplo ...
最新文章
- as3中TextFormat类的使用
- 飞书与IAI国际广告奖,协同实现国内营销史上的创新“云终审”
- 「杂谈」如何写好R语言apply家族函数
- 虚拟机用户配置root权限
- 需要注意AT24Cxx和BL24Cxx引脚不一样
- 滴滴出行2020数据分析面试题
- golang 切片 接口_一日看尽golang高级语法之slice
- 常用的开源视音频解码软件库
- CSS-合理使用z-index控制盒子视轴高度,解决z-index失效
- 酸吗?28岁程序员财务自由宣布退休!
- Linux下串口通信详解
- matlab数值很小出错,求大神帮忙解决一下,用MATLAB求解动力学数据总是出错~ - 计算模拟 - 小木虫 - 学术 科研 互动社区...
- Hemberg-lab单细胞转录组数据分析(九)- Scater包单细胞过滤
- 数据分析最难的就是怎样读懂数据!
- vue+jsonp跨域
- Gitbub 常用命令
- 视频技术系列 - 谈谈毫米波
- 百度短网址 php,PHP实现百度、网易、新浪短网址服务的API接口调用
- excel表格怎么恢复?常见的恢复方法
- linux 内核2.6.35.3,linux-2.6.35.3内核移植(s3c2440)
热门文章
- echarts关系图/力导向动态图(地图经纬度定位)
- Intent之对象传递(Parcelable传递对象和对象集合)
- 家庭财务管理,从记账开始
- go pear.php 下载,请注意!有人攻破了PEAR网站并篡改了go-pear.phar安装包
- 【论文研读】基于BP 神经网络的 Q235 钢力学性能预测模型
- 计算方法实验(四):牛顿迭代法
- 非线性方程求根方法总结附代码(从二分法、试位法到牛顿迭代、二次插值等)
- Geb UI 自动化手册(4: 页面内容交互)
- android 的视频渲染
- 如何清除搜狗输入法自带的“搜狐新闻”?