时间序列数据之三阶指数平滑法以及python代码实现

三阶指数平滑(holt-winters)

适用:

三阶指数平滑法针对有趋势也有季节性的序列。当一个序列在每个固定的时间间隔中都出现某种重复的模式,就称之具有季节性特征,而这样的一个时间间隔称为一个季节(理解:比如说在一个周内,销量呈现出重复的模式)。一个季节的长度k为它所包含的序列点个数。


二次指数平滑考虑了序列的baseline和趋势,三次就是在此基础上增加了一个季节分量。类似于趋势分量,对季节分量也要做指数平滑。比如预测下一个季节第3个点的季节分量时,需要指数平滑地考虑当前季节第3个点的季节分量、上个季节第3个点的季节分量。
在这里插入图片描述

其中:

P_i 是指周期性部分,公式如下:
在这里插入图片描述
k表示这个周期的长度

代码实现如下
def exponential_smoothing_3(alpha, s):
     '''
    三次指数平滑
    :param alpha:  平滑系数
    :param s:      数据序列, list
    :return:       返回三次指数平滑模型参数a, b, c, list
    '''
    s_single = exponential_smoothing_1(alpha, s)
    s_double = exponential_smoothing_1(alpha, s_single)
    s_triple = exponential_smoothing_1(alpha, s_double)
    
    a_triple = [0 for i in range(len(s))]
    b_triple = [0 for i in range(len(s))]
    c_triple = [0 for i in range(len(s))] 
    for i in range(len(s)):
        a_triple[i] = 3 * s_single[i] - 3 * s_double[i] + s_triple[i]
        b_triple[i] = (alpha / (2 * ((1 - alpha) ** 2))) * ((6 - 5 * alpha) * s_single[i] - 2 * ((5 - 4 * alpha) * s_double[i]) + (4 - 3 * alpha) * s_triple[i])
        c_triple[i] = ((alpha ** 2) / (2 * ((1 - alpha) ** 2))) * (s_single[i] - 2 * s_double[i] + s_triple[i])
    return a_triple, b_triple, c_triple
  

运行代码

def predict_value_with_exp_smoothing_3(alpha,s):
      a,b,c=exponential_smoothing_3(alpha,s)
      s_temp=[]
      s_temp.append(a[0])
      for i in range(len(a)):
         s_temp.append(a[i]+b[i]+c[i])
     return s_temp
dataset=predict_value_with_exp_smoothing_3(alpha=0.2,s=dataset) 

画图代码

plt.figure()
plt.plot(dataset,'g-',label='dwell')
plt.legend(loc='best')
plt.show()
平滑之前的数据如下图所示:

时间序列数据之三阶指数平滑法以及python代码实现_第1张图片

平滑之后的数据如下图所示:

时间序列数据之三阶指数平滑法以及python代码实现_第2张图片

你可能感兴趣的:(matplotlib,pandas,numpy,python,统计学)