时间序列数据集可能包含趋势和季节性,在建模之前可能需要将其删除。
趋势可能导致随时间变化的平均值,而季节性可能导致随时间变化的方差(variance),这两者都将时间序列定义为不稳定的(non-stationary)。稳定(Stationary)数据集是具有稳定均值和方差的数据集,更容易建模。
差分是一种流行的且广泛使用的数据转换,用于使时间序列数据保持平稳。在本教程中,我们将发现如何使用Python将差分运算应用于时间序列数据。
完成本教程后,我们将知道:
平稳时间序列(Stationary Time Series)粗略地讲,一个时间序列,如果均值没有系统的变化(无趋势)、方差没有系统变化,且严格消除了周期性变化,就称之是平稳的。
平稳又包括:严平稳、宽平稳。
非平稳时间序列(Non-stationary Time Series)是指包含趋势、季节性或周期性的序列,它可能只含有其中的一种成分, 也可能是几种成分的组合。
我们可以通过查看时间序列的线图来检查时间序列是否稳定。该系列中明显趋势,季节性或其他系统结构的迹象是非平稳系列的指标。
一种更准确的方法是使用统计检验,例如Dickey-Fuller检验(Dickey-Fuller test)。
我们是否应该使时间序列平稳?通常,是的。如果我们在时间序列中具有明确的趋势和季节性,则可以对这些成分进行建模,将其从观测值中删除。统计时间序列方法甚至现代机器学习方法都将受益于数据中更清晰的信号。
差异是一种转换时间序列数据集的方法。它可以用来消除对时间的序列依赖性,即所谓的时间依赖性。这包括趋势和季节性等结构。
差分通过从当前观察值中减去先前的观察值来执行求差。
difference(t) = observation(t) - observation(t-1)
当必须将预测转换回原始比例时,需要反转过程。通过将先前时间步长的观察值添加到差值,可以逆转此过程。
inverted(t) = differenced(t) + observation(t-1)
以此方式,可以计算出一系列的差和反差。
# create a differenced series
def difference(dataset, interval=1):
diff = list()
for i in range(interval, len(dataset)):
value = dataset[i] - dataset[i - interval]
diff.append(value)
return diff
# invert differenced forecast
def inverse_difference(last_ob, value):
return value + last_ob
在本节中,我们将研究使用差异变换来消除趋势。趋势通过增加水平使时间序列不稳定。这具有随时间改变平均时间序列值的效果。
下面的示例将different() 函数应用于具有线性增长趋势的人为设计的数据集。
首先运行示例,将打印出具有线性趋势的人为序列。接下来,打印差异数据集,显示每个时间步长增加一个单位。该序列的长度为19而不是20,因为该序列中第一个值的差无法计算,因为没有先验值。
最后,使用来自原始序列的先验值作为每次转化的引物,将差异序列反转。
# define a dataset with a linear trend
data = [i+1 for i in range(20)]
print(data)
# difference the dataset
diff = difference(data)
print(diff)
# invert the difference
inverted = [inverse_difference(data[i], diff[i]) for i in range(len(diff))]
print(inverted)
plt.plot(data)
plt.show()
plt.plot(diff)
plt.show()
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
有许多类型的季节性。一些明显的例子包括:一天中的时间,每天,每周,每月,每年等。因此,确定时间序列问题中是否存在季节性因素是主观的。
确定是否存在季节性方面的最简单方法是绘制和查看数据,可能采用不同的比例并添加趋势线。
下面的示例将difference() 函数应用于人为的季节性数据集。数据集包括两个周期,每个周期360个单位。
# difference the dataset
diff = difference(data, 360)
plt.plot(diff)
plt.show()
这一部分更详细的内容可见https://blog.csdn.net/qq_41103204/article/details/105725136
这是一种比较简单的让时间序列变得平稳的方式,其实就是用当前的数据减去一个明显的在数据中体现出来的趋势。
参考资料:
https://machinelearningmastery.com/remove-trends-seasonality-difference-transform-python/
https://machinelearningmastery.com/time-series-seasonality-with-python/