AR(I)MA时间序列建模过程——步骤和python代码
这绝对是数据分析时让所有人都头疼的问题。异常和缺失值会破坏数据的分布,并且干扰分析的结果,怎么处理它们是一门大学问,而我根本还没入门。
3 ways to remove outliers from your data
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
函数详细说明参见3 ways to remove outliers from your data
3 ways to remove outliers from your data
缺失值在DataFrame中显示为nan
,它会导致ARMA无法拟合,因此一定要进行处理。
a.用序列的均值代替,这样的好处是在计算方差时候不会受影响。但是连续几个nan
即使这样替代也会在差分时候重新变成nan
,从而影响拟合回归模型。
b.直接删除。我在很多案例上看到这样的做法,但是当一个序列中间的nan
太多时,我无法确定这样的做法是否还合理。
序列平稳性是进行时间序列分析的前提条件,主要是运用ADF检验。
from statsmodels.tsa.stattools import adfullerdef test_stationarity(timeseries): dftest = adfuller(timeseries, autolag='AIC') return dftest[1] #此函数返回的是p值
adfuller
函数详细说明参见3 ways to remove outliers from your data
3 ways to remove outliers from your data
(1)对数处理。对数处理可以减小数据的波动,因此无论第1步检验出序列是否平稳,都最好取一次对数。关于为什么统计、计量学家都喜欢对数的原因,知乎上也有讨论:3 ways to remove outliers from your data
https://www.zhihu.com/question/22012482
(2)差分。一般来说,非纯随机的时间序列经一阶差分或者二阶差分之后就会变得平稳。那差分几阶合理呢?我的观点是:在保证ADF检验的p<0.01的情况下,阶数越小越好,否则会带来样本减少、还原序列麻烦、预测困难的问题。——这是我的直觉,还没有查阅资料求证。基于这样的想法,构造了选择差分阶数的函数: