赞
踩
【参考资料】
【1】应用时序分析
【2】https://blog.csdn.net/u010414589/article/details/49622625
【3】http://www.statsmodels.org/devel /examples/notebooks/generated/tsa_arma_0.html
【4】https://www.jianshu.com/p/5c5a6293640a
【5】http://www.docin.com/p-241451370.html
长期趋势: 该因素的影响导致序列呈现出明显的长期趋势(递增、递减等)
循环波动: 该因素的影响导致序列从高到底再从底到高得反复循环波动
季节性变化: 该因素的影响导致序列呈现与季节相关的稳定周期变换
随机波动: 除了上述三种因素外,序列所呈现的随机性现象
拟合法是直接采用某已模型对一个明显的时序进行拟合,通常方法如下:
分类 | 模型 | 参数估计方法 |
---|---|---|
线性拟合 | x t = a + b t + I t x_t = a + bt + I_t xt=a+bt+It | 采用最小二乘法进行参数估计 |
曲线拟合 | 二次型: T t = a + b t + c t 2 T_t = a + bt + ct^2 Tt=a+bt+ct2 | 采用最小二乘法进行参数估计 |
曲线拟合 | 指数型: T t = a b t T_t = ab^t Tt=abt | 取ln后采用最小二乘法进行参数估计 |
曲线拟合 | 修正指数法: T t = a + b c t T_t = a + bc^t Tt=a+bct | 无法转为线性模型,用迭代法 |
曲线拟合 | Comperz型: T t = e a + b c t T_t = e^{a + bc^t} Tt=ea+bct | 无法转为线性模型,用迭代法 |
曲线拟合 | Logistic型: T t = 1 a + b c t T_t = \dfrac{1}{a + bc^t} Tt=a+bct1 | 无法转为线性模型,用迭代法 |
平滑法利用修匀技术削弱短期随机波动序列的影响,类似于图像打马赛克。主要包括如下方法
a. 移动平滑法(n期中心平均):
x
^
t
=
{
1
n
(
x
t
−
(
n
−
1
)
/
2
+
x
t
−
(
n
−
1
)
/
2
+
1
+
⋯
+
x
t
+
⋯
+
x
t
−
(
n
+
1
)
/
2
)
,
x
i
s
o
d
d
1
n
(
1
2
x
t
−
n
/
2
+
x
t
−
n
/
2
+
1
+
⋯
+
x
t
+
x
t
+
n
/
2
−
1
+
1
2
x
t
+
n
/
2
)
,
x
i
s
e
v
e
n
\hat{x}_t =
b. 移动平滑法(n期移动平均):
x
^
t
=
1
n
(
x
t
+
x
t
−
1
+
⋯
+
x
t
−
n
+
1
)
\hat{x}_t = \dfrac{1}{n}(x_t + x_{t-1} + \dots + x_{t-n+1})
x^t=n1(xt+xt−1+⋯+xt−n+1)
c. 简单指数平滑:
x
^
t
=
a
x
t
+
a
(
1
−
a
)
x
t
−
1
+
a
(
1
−
a
)
2
x
t
−
2
+
…
\hat{x}_t = ax_t + a(1-a)x_{t-1} + a(1-a)^2x_{t-2} + \dots
x^t=axt+a(1−a)xt−1+a(1−a)2xt−2+…
其中a为平滑系数 0 < a < 1
d. Holt两参数指数平滑:
{
x
^
t
=
a
x
t
+
(
1
−
a
)
(
x
^
t
−
1
+
r
t
−
1
)
r
t
=
γ
(
x
^
t
−
x
^
t
−
1
)
+
(
1
−
γ
)
r
t
−
1
季节效应分析针对存在周期性变化(季节是周期的一种)的时序。例如气温的波动由两个因素组成,一个是季节效应,一个是随机波动。
举例:
每个月的季节指数
S
1
,
S
2
,
.
.
.
,
S
12
S_1, S_2, ... , S_{12}
S1,S2,...,S12
第i年的第j个月气温定义为:
x
i
j
=
x
ˉ
.
S
j
+
I
i
j
x_{ij}=\bar{x}.S_j + I_{ij}
xij=xˉ.Sj+Iij,其中
x
ˉ
\bar{x}
xˉ是各月总的平均温度,
S
j
S_j
Sj是第j个月的季节指数,
I
i
j
I_{ij}
Iij是该月的随机波动。计算季节指数步骤如下:
假设m为一周期,共有n个周期
第一步: 计算周期内平均数(诸如所有6月的气温均值)
x
ˉ
k
=
∑
i
=
1
n
x
i
k
n
k
=
1
,
2
,
.
.
.
,
m
\bar{x}_k = \dfrac{\sum\limits_{i=1}^{n}x_{ik}}{n} \quad k = 1, 2, ..., m
xˉk=ni=1∑nxikk=1,2,...,m
第二步: 计算总平均数(所有月份气温均值)
x
ˉ
=
∑
i
=
1
n
∑
k
=
1
m
x
i
k
n
m
\bar{x}=\dfrac{\sum\limits_{i=1}^{n}\sum\limits_{k=1}^{m}x_{ik}}{nm}
xˉ=nmi=1∑nk=1∑mxik
第二步: 计算各周期的季节指数(各个月气温相对于平均气温的偏差度)
S
k
=
x
ˉ
k
x
ˉ
k
=
1
,
2
,
.
.
.
,
m
S_k=\dfrac{\bar{x}_k}{\bar{x}} \quad k = 1, 2, ..., m
Sk=xˉxˉkk=1,2,...,m
df = pd.read_csv('./data/train.csv', sep=',')
df_kpi = df[df['KPI ID'] == '02e99bd4f6cfb33f']
data = df_kpi.loc[1000:1200, ['value']]
一阶差分:
▽
x
t
=
x
t
−
x
t
−
1
\bigtriangledown x_t = x_t - x_{t-1}
▽xt=xt−xt−1
二阶差分: 在++一阶差分的结果上++再次差分
▽
2
x
t
=
x
t
−
x
t
−
1
\bigtriangledown^2 x_t = x_t - x_{t-1}
▽2xt=xt−xt−1
def _cal_diff(data): output = [0 for col in range(len(data) - 1)] for i in range(len(data) - 1): output[i] = data[i + 1] - data[i] return output def _show_diff_data(): plt.figure(figsize=(8, 6), facecolor='w') plt.subplot(121) plt.title('origin data') plt.plot(data) plt.subplot(122) plt.title('diff 1') plt.plot(_cal_diff(data.as_matrix().reshape(-1)), color='r') plt.show()
单位根检验是将整个时序模型看成是一个差分方程,其平稳性意味着差分方程的稳定性条件。单位根检验就是检验该差分方程的特征方程的各个特征根是否小于1,若存在单位根则认为不是平稳序列。
我们检查原始数据、一阶差分和二阶差分的ADF结果如下:
data = df_kpi.loc[1000:1200, ['value']].as_matrix().reshape(-1)
data_diff1 = _cal_diff(data)
data_diff2 = _cal_diff(data_diff1)
print(ts.adfuller(data))
print(ts.adfuller(data_diff1))
print(ts.adfuller(data_diff2))
1 第一个值为ADF测试值,判断是否小于1%、5%、%10对应的统计量
2 第二个值pValue是否趋近于0
由上述两项可以判断一阶差分数据属于平稳序列
fig = plt.figure(figsize=(10, 6))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(data_diff1,lags=40,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(data_diff1,lags=40,ax=ax2)
plt.show()
几个关键定义:
截尾: ACF或PACF在某一阶之后都为0
拖尾: ACF或PACF在某一阶之后不为0,但呈现趋于0的衰减
AR模型: ACF拖尾、PACF截尾
MA模型: ACF截尾、PACF拖尾
ARMA模型: ACF和PACF均为拖尾
参见笔记《时序分析(平稳序列建模)》
上图判断自相关图ACF存在2阶拖尾,PACF存在4阶拖尾,由于设定p=4、q=2。
这里的代码重新开始全部用pandas下的API编写
# -*- coding: utf-8 -*- import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm df = pd.read_csv('./data/train.csv', sep=',') df_kpi = df[df['KPI ID'] == '02e99bd4f6cfb33f'] data = df_kpi.loc[1001:1200, ['value']] #根据pandas时序分析要求将index装换为date类型 data.index = pd.Index(pd.date_range(start='2018-12-12', periods=200, freq='S')) dta = data.diff(1) #这里从1开始时为了去掉NaN这个无效值 arma_mod42 = sm.tsa.ARMA(dta[1:],(4,2)).fit(disp=False) predict_sunspots = arma_mod42.predict('2018-12-12 00:03:20', '2018-12-12 00:03:45', dynamic=True) fig, ax = plt.subplots(figsize=(8, 6)) ax = dta.ix['2018-12-12 00:00:01':].plot(ax=ax) predict_sunspots.plot(ax=ax) plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。