时间序列预处理(整理)
对于平稳非随机序列进行进一步建模分析。
平稳性->对应建模类型进一步分析
非随机性->有进一步分析的价值
非平稳序列->需要进一步检验变换处理之后才能确定拟合模型
一、特征统计量
1)均值
E(X)----np.mean(x)
2)方差
σ²=DX=E(X-μ)²
3)自协方差和自相关系数
自协方差 γ(t,s)=E(Xt-μt)(Xs-μs)
自相关系数 ρ(t,s)=γ(t,s)/((DXt*DXs)**0.05)
自己过去行为对自身现在的影响
def mydrawts(y,pname):
myname='OK'
##draw ax
fig = plt.figure(figsize=(10,8))
ts_ax=plt.subplot2grid((2,2),(0,0),colspan=2)
acf_ax=plt.subplot2grid((2,2),(1,0))
pacf_ax=plt.subplot2grid((2,2),(1,1))
##draw plot
ts_ax.plot(y,'*-')
ts_ax.set_title('Time Series Analysis Plots(custom %s)'%myname)
##calclate acf
myacf=np.ones((17))
###自相关系数
uy=np.mean(y)
i=0
under=0
for i in range(len(y)):
under=under+(y[i]-uy)*(y[i]-uy)
i=i+1
#index 17 is out of bounds for axis 0 with size 17
for k in range(1,17):
# k的参与运算
temp = 0
temp = np.sum((y[:-k] - uy) * (y[k:] - uy) )
myacf[k] = temp / under
k=k+1
#print(myacf[k])
#print(k)
twosigma = np.ones((17))
###YOUR CODE to calculate 2 sigma
## 置信区间(?)
## ax.fill_between(lags, confint[:, 0] - acf_x, confint[:, 1] - acf_x, alpha=0.25)
twosigma[0]=(1/len(y))**0.5
for m in range(1,17):
twosigma[m] = ((np.sum(myacf[1:m+1]**2)*2+1)/len(y))**0.5
m=m+1
twosigma=twosigma*2
acf_ax.bar(range(len(myacf)), myacf)
acf_ax.fill_between(range(len(myacf)), -1 * twosigma, twosigma, color='lightblue')
plt.xticks(range(-1,1))
# plt.savefig('%s.jpg'%pname,dpi=256)
plt.show()
plt.close()
二、平稳性的性质与意义
常数均值。
自协方差与自相关系数与时间长度相关,与起止位置无关。
自相关系数t=0为1,对称且非负定性(?)。
平稳性意义
1、均值序列可表示为含有一个变量的常数序列(?)
2、原本每个随机变量的均值(方差等)只能依靠一个样本观察值去估计。
基于平稳性,每个统计量将拥有大量样本观察值(?)。
减少了随机变量的个数,并增加待估计变量的样本容量。
简化时序分析难度,增加精度。
三、平稳性的判断
1)图检验
时序图,均值方差为常数。波动范围有界,无趋势与明显周期。
自相关图(自相关系数和延迟期数),短期相关性并会迅速衰减向0
2)统计检验(如单位根检验)
(线性差分方程)
四、纯随机性检验
(数据分析有进一步的意义,历史数据对未来有影响,有相关性)
1)白噪声序列
纯随机性
方差齐性
2)纯随机性检验(白噪声检验)-检验统计量
Q统计量
LB统计量
def mypurerandtest(y):
n = len(y)
myacf = np.ones((n))
LB = np.zeros(n)
myacf = np.ones((n))
##calclate acf
###自相关系数的计算
uy=np.mean(y)
i=0
under=0
for i in range(len(y)):
under=under+(y[i]-uy)*(y[i]-uy)
i=i+1
#index 17 is out of bounds for axis 0 with size 17
for k in range(1,17):
# k的参与运算
temp = 0
temp = np.sum((y[:-k] - uy) * (y[k:] - uy) )
myacf[k] = temp / under
k=k+1
#print(myacf[k])
#print(k)
##LB统计量的计算
for i in range(0, n):
for k in range(1, i + 1):
LB[i] = LB[i] + ((myacf[k] ** 2) / (n - k))
LB[i]=LB[i]*n*(n+2)
lag = np.arange(0, n)
myd = pd.DataFrame(np.c_[lag, LB], columns=['lags', 'LB'])
print(myd[:23])