导读:
我们的很多数据是具有季节性或者趋势性的,就是随着时间越来越久,数据随着一个趋势来变化,这种内在的趋势对数据的预测有一定的影响。那么怎么来消除这个影响呢?
我们可以使用差分法,差分法简单说就是在一系列数据中,相邻两个相减得到相邻两个值的变化量,我们在进行数据分析的过程中,只对差分之后的结果进行分析,也就是说我们只分析连续数据间的变化情况,而忽略了数据本身的累加形成的趋势性或者季节性。最后我们对数据进行逆转换即可。
正文如下:
差分变换
差分是一种转换时间序列数据集的方法。
它可用于消除序列对时间的依赖性,即所谓的时间依赖性。这包括趋势和季节性等结构。
通过从当前观察中减去先前的观察来执行差分。
difference(t) = observation(t) - observation(t-1)
当必须将预测转换回原始比例时,需要反转该过程。
通过将先前时间步骤的观察值添加到差值,可以反转该过程。
inverted(t) = differenced(t) + observation(t-1)
以这种方式,可以计算一系列差异和反转差异。
滞后差异
将连续观察之间的差异称为滞后-1差异。
可以调整滞后差异以适应特定的时间结构。
对于具有季节性成分的时间序列,滞后可以预期为季节性的周期(宽度)。
差异订单
在执行差分运算之后,一些时间结构可能仍然存在,例如在非线性趋势的情况下。
因此,差分过程可以重复多次,直到所有时间依赖性都被消除。
执行差分的次数称为差分顺序。
计算差分
我们可以手动区分数据集。
这涉及开发一个创建差异数据集的新功能。该函数将遍历提供的序列并以指定的间隔或滞后计算差异值。
下面名为difference()的函数实现了此过程。
#创建一个差分序列
def difference(dataset, interval=1):
diff = list()
for i in range(interval, len(dataset)):
value = dataset[i] - dataset[i - interval]
diff.append(value)
return Series(diff)
我们可以看到该函数在指定的时间间隔后小心地开始差异数据集,以确保实际上可以计算差值。定义默认间隔或滞后值1。这是一个合理的默认值。
进一步的改进是还能够指定执行差分操作的次序或次数。
下面名为inverse_difference()的函数会反转单个预测的差异运算。它还要求提供前一时间步的实际观测值。
# 差分的逆转换
def inverse_difference(last_ob, value):
return value + last_ob
区别于消除趋势
在本节中,我们将介绍使用差异变换来移除趋势。
趋势通过提高水平使时间序列非静止。这具有随时间改变平均时间序列值的效果。
下面的示例将difference()函数应用于具有线性增加趋势的人为数据集。
# 创建一个差分序列
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
# 差分的逆转换
def inverse_difference(last_ob, value):
return value + last_ob
# 定义一个有线性趋势的数据集
data = [i+1 for i in range(20)]
print(data)
# 对数据做差分
diff = difference(data)
print(diff)
# 差分的逆转换
inverted = [inverse_difference(data[i], diff[i]) for i in range(len(diff))]
print(inverted)
最后,使用来自原始序列的先前值作为每个变换的引物来反转差异序列。运行该示例首先使用线性趋势打印设计序列。接下来,打印差异数据集,显示每个时间步长增加一个单位。该序列的长度为19而不是20,因为序列中第一个值的差异无法计算,因为没有先前值。
1 2 3 | [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个单元。
from math import sin
from math import radians
from matplotlib import pyplot
# 创建一个差分序列
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
# 差分的逆转换
def inverse_difference(last_ob, value):
return value + last_ob
# 定义一个有线性趋势的数据集
data = [sin(radians(i)) for i in range(360)] + [sin(radians(i)) for i in range(360)]
pyplot.plot(data)
pyplot.show()
# 对数据做差分
diff = difference(data, 360)
pyplot.plot(diff)
pyplot.show()
# 差分的逆转换
inverted = [inverse_difference(data[i], diff[i]) for i in range(len(diff))]
pyplot.plot(inverted)
pyplot.show()
首先运行示例创建并绘制360时间步长序列的两个周期的数据集。
人工数据集的线图
接下来,应用差异变换并绘制结果。该图显示了360个零值,并删除了所有季节性信号。
在上面的去趋势示例中,差值应用滞后为1,这意味着牺牲了第一个值。这里整个周期用于差分,即360个时间步长。结果是牺牲整个第一循环以区分第二循环。
差异季节性数据集的线图
最后,转换反转显示第二个周期恢复了季节性。
差分数据集的线图与反向差分变换