【问题标题】:How to detect a sudden change in a time series plot in Pandas如何检测 Pandas 时间序列图中的突然变化
【发布时间】:2019-05-31 13:51:32
【问题描述】:

我正在尝试“检测”一系列速度的突然下降,但我不知道如何捕捉它。详情及代码如下:

这是我拥有的系列的 sn-p 以及生成它的代码:

velocity_df.velocity.car1

Index   velocity
200     17.9941
201     17.9941
202     18.4031
203     18.4031

这是整个系列的情节

我正在尝试检测从 220 到 230-40 的突然下降,并将其保存为如下所示的系列:

Index   velocity
220      14.927
221      14.927
222      14.927
223      14.927
224      14.518
225      14.518
226     16.1538
227     12.2687
228     9.20155
229     6.33885
230     4.49854

我只是想在速度突然下降时捕捉一个大概的范围,以便使用其他功能。

如果我可以添加任何其他信息,请告诉我。 谢谢!

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    如果您想逐个比较两个值,这将是一种简单的方法:

    鉴于您的问题中的系列,称为s,您可以通过将其减去 1 来构造数据的绝对离散导数:

    d = pd.Series(s.values[1:] - s.values[:-1], index=s.index[:-1]).abs()
    

    如果您现在取该系列绝对差中的最大 m,您可以将其乘以介于 0 和 1 之间的因子 a 作为阈值:

    a = .7
    m = d.max()
    print(d > m * a)
    

    最后一行输出匹配的索引。

    在此基础上,您可以使用滑动窗口技术(例如 kernel density estimation, or Parzen window)来创建更平滑的结果:

    r = d.rolling(3, min_periods=1, win_type='parzen').sum()
    n = r.max()
    

    就像之前我们可以打印出匹配的元素一样

    print(r > n * a)
    

    给出以下输出

    Index
    220    False
    221    False
    222    False
    223    False
    224    False
    225    False
    226    False
    227     True
    228     True
    229     True
    dtype: bool
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-26
      • 2022-10-16
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多