去趋势

去趋势主要指的是去除带有趋势的序列中的线性趋势。scipy库提供了对应的函数以实现这一目的。

1
scipy.signal.detrend(data, axis=-1, type='linear', bp=0, overwrite_data=False)

参数:

    data: 数组

    axis: 整形,去趋势的维度

    type:{‘linear’, ‘constant’}参数可选

      ‘linear’ 默认值,数据减去线性最小二乘法拟合的结果

      ‘constant’ 去掉序列的均值,即求距平

​ bp:整形,一系列的断点。如果给定,则在两个断点之间对数据的每个部分执行单独的线性拟合。断点被 指定为数据的索引

overwrite_data :布尔型,默认为False,若为真则结果覆盖data

注:由于是扣除了最小二乘法拟合,因此最终结果与原始序列均值之和才是原始数据去除线性趋势的结果。

1
2
3
4
5
6
7
8
9
10
11
12
from scipy import signal
import numpy as np
y = np.array([6.08, 4.56, 5.63, 5.31, 5.15, 5.44, 4.65, 4.24, 7.3, 5.86, 4.51, 6.28, 5.55, 5.35,
5.12, 4.76, 4.35, 3.76, 4.74, 5.55, 4.54, 5.74, 5.54, 3.67, 4.77, 4.9, 3.06, 3.9,
4.18, 5.44, 5.21, 3.86, 3.96, 4.47, 4.37, 4.86, 4.43, 3.63, 3.98, 3.94, 5.09, 4.48,
4.05, 4.81, 4.07, 4.48, 4.46, 3.95, 5.24, 3.54, 3.11, 5.07, 6.09, 4.59, 4.55, 4.7,
3.43, 4.37, 4.79, 3.64, 4.3, 3.5 ])
y_detrend_linear = signal.detrend(y,axis = 0,type='linear')
y_detrend_constant = signal.detrend(y,axis = 0,type='constant')
plt.plot(np.arange(0,62,1),y,'k',label='y')
plt.plot(np.arange(0,62,1),y_detrend_linear+y.mean(),'r',label='linear')
plt.legend()

image-20200519214452584