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
网址:https://en.wikipedia.org/wiki/Moving_average
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.
自回归项的数目§: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表示预测值