首页 > 解决方案 > 有没有办法检测时间序列数据中的阶梯状形状?

问题描述

我想检测时间序列中的任何阶梯形状,如示例图中所示。我想到的唯一方法是取系列前半部分和后半部分的平均值的差异,并将其与差异的平均值进行比较。如果后半部分的平均值比前半部分的平均值大某个阈值(例如平均值 + 3*sd),那么我可以说数据中有一个阶梯状的形状(希望如此)。但是使用序列的中点是不明智的,因为步长可以在数据中的任何位置。

apply(ds[1:6], 2, function(x){
    diffs = diff(x)
    l = floor(length(x) / 2)
    m1 = mean(x[1:l])
    m2 = mean(x[(l+1):length(x)])
    (m2-m1) > (mean(diffs) + 3*sd(diffs))
})

该方法也将 b 确定为阶梯形状。任何使用 R 或 Python 的可行解决方案都是可以接受的。

样本数据:

> a = c(115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 132.6718, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154)
> plot.ts(a)  # ds[ ,4]

a的时间序列图

另一方面,该方法不应将下面的系列数据检测为阶梯状,尽管有增加的趋势

b = c(4.0395, 4.0715, 3.9155, 4.065, 3.8804, 4.1018, 4.0128, 4.0536, 3.8843, 4.3133, 4.5442, 4.4616, 4.199, 4.1072, 4.9806, 5.0805, 5.285, 5.0236, 5.1037, 5.0898, 4.5565, 4.99, 5.0152, 5.2478, 5.2843, 5.2827, 5.3203, 5.3841, 5.8214, 5.7281)
> plot.ts(b)  # ds[ ,6]

b 的时间序列图

标签: pythonrtime-series

解决方案


您可以对该信号进行导数。step 的导数应该是一个大尖峰,第二个图的导数应该有多个小尖峰。


推荐阅读