自己总结的时间序列步骤

203 阅读4分钟

1.得到一系列的series数据

path = '***.csv' 
data = pd.read_csv(path,time_parser)    #假设date为时间列名
data['date'] = pd.to_datetime(data['date'],infer_datetime_format=True) #自动调整时间格式

2.观察时间序列值是否平稳(分为眼睛观察和使用adfuller检验

def plot_tf(data,time):
	data_mean = data.rolling(time).mean()	#计算序列均值
	data_std = data.rolling(time).std()		#计算序列标准差
   	orig = plt.plot(data, color='blue', label='Original')
    mean = plt.plot(data_mean, color='red', label='Rolling Mean')
    std = plt.plot(data_std , color='black', label='Rolling Std')
    plt.legend(loc='best')
    plt.title('Rolling Mean & Standard Deviation')
    plt.show(block=False)

大概可以看到这样的一张图: 在这里插入图片描述 下面黑色为标准差,而红色为平均值,可以从两根线看出此序列是不平稳的, 而通过adfuller检验可以进一步观察是否平稳:

dftest = adfuller(data['#Passengers'],autolag='AIC')  #代码中的#Passengers为自己想要观察的序列值,可以更改
print(dftest)

得到下列的值

(0.8153688792060433, 0.9918802434376409, 13, 130, {'1%': -3.4816817173418295, '5%': -2.8840418343195267, '10%': -2.578770059171598}, 996.692930839019)

主要观察p值(本例中为0.99,由于不符合Null hypothesis,一般小于0.05属于不符合假设),而且1%、5%、10%置信值与0.81差别很远,即可以得到结论不是平稳序列。

由于不是平稳序列,于是需要通过transform转换为平稳序列,有下列方法: 1.np.log

data_log = np.log(data['#Passengers'])   #进行对数转换

2.exp decay 网址:en.wikipedia.org/wiki/Moving…

data_expdecay = data_log.ewm(halflife=12, min_periods=0, adjust=True).mean()   #指数平均法

总的来说就是使序列更加平滑 3.shift

indexedDataset_logScale - indexedDataset_logScale.shift()

就是进行差分,此处可以进行1阶差分或2阶差分,对之后ARIMA模型参数的选择 可以使用

data_diff =np.diff(data_log,1) #1表示1阶差分

3.使用ARIMA模型或RNN模型(第一节使用ARIMA,之后更新RNN模型) 对于ARIMA模型,因为存在三个参数 自相关函数(ACF)是将有序的随机变量序列与其自身相比较,它反映了同一序列在不同时序的取值之间的相关性。

偏自相关函数(PACF)计算的是严格的两个变量之间的相关性,是剔除了中间变量的干扰之后所得到的两个变量之间的相关程度。对于一个平稳的AR( p )模型,求出滞后为k的自相关系数p(k)时,实际所得并不是x(t)与x(t-k)之间的相关关系。这是因为在这两个变量之间还存在k-1个变量,它们会对这个自相关系数产生一系列的影响,而这个k-1个变量本身又是与x(t-k)相关的。这对自相关系数p(k)的计算是一个不小的干扰。而偏自相关函数可以剔除这些干扰

p: The number of lag observations included in the model, also called the lag order. d: The number of times that the raw observations are differenced, also called the degree of differencing. q: The size of the moving average window, also called the order of moving average.

自回归项的数目(p):AR项仅仅是因变量的时滞。例如,如果p等于5,那么预测x(t)将是x(t-1)…x(t-5)。 移动平均的数目(q):MA项是预测误差的时滞。例如,如果q等于5,那么预测x(t)将是e(t-1)…e(t-5),e(i)是第i个时刻的移动平均和真实值的差值。 差分次数(d):这里指的是非季节性的差分次数,即这种情况下我们采用一阶差分。因为无论我们传递差分后的变量且d=0,还是传递原始变量且d=1,得到的结果是一样的。

p:滞后项,可以通关观察ACF图来获得,比如下面这张图 在这里插入图片描述 可以看到图片在x=2时,y=0可以确定p为2

q:移动平均窗口的大小,通过观察PACF的图得到数值,比如下面这张图 在这里插入图片描述 同时也是观察得到x=2时,y=0,确定q为2

d:即diff 差分项,通过上面的方法得到差分阶数

给出一段画acf图和pacf图的代码 #ACF & PACF plots

#data为你所需要计算的时间序列
lag_acf = acf(data, nlags=20)
lag_pacf = pacf(data, nlags=20, method='ols')

#Plot ACF:
plt.subplot(121)
plt.plot(lag_acf)
plt.axhline(y=0, linestyle='--', color='gray')
plt.axhline(y=-1.96/np.sqrt(len(datasetLogDiffShifting)), linestyle='--', color='gray')
plt.axhline(y=1.96/np.sqrt(len(datasetLogDiffShifting)), linestyle='--', color='gray')
plt.title('Autocorrelation Function')            

#Plot PACF
plt.subplot(122)
plt.plot(lag_pacf)
plt.axhline(y=0, linestyle='--', color='gray')
plt.axhline(y=-1.96/np.sqrt(len(datasetLogDiffShifting)), linestyle='--', color='gray')
plt.axhline(y=1.96/np.sqrt(len(datasetLogDiffShifting)), linestyle='--', color='gray')
plt.title('Partial Autocorrelation Function')
      
plt.tight_layout()     

构建ARIMA模型

import
#p,d,q分别为参数
model = ARIMA(data, order=(p,d,q))
results_AR = model.fit(disp=-1)  #disp=1代表不打印训练信息   
plt.plot(data)  #原图像
plt.plot(results_AR.fittedvalues, color='red')  #results_AR.fittedvalues表示预测值