如何检测 Pandas 中时间序列图的突然变化

Dan*_*nyK 4 python time-series pandas

我试图“检测”一个系列中速度的突然下降,但我不知道如何捕捉它。详细信息和代码如下:

这是我所拥有的系列片段以及用于生成它的代码:

velocity_df.velocity.car1

Index   velocity
200     17.9941
201     17.9941
202     18.4031
203     18.4031
Run Code Online (Sandbox Code Playgroud)

这是整个系列的情节 在此处输入图片说明

我试图检测从 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
Run Code Online (Sandbox Code Playgroud)

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

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

fel*_*iks 5

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

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

d = pd.Series(s.values[1:] - s.values[:-1], index=s.index[:-1]).abs()
Run Code Online (Sandbox Code Playgroud)

如果您现在取该m系列绝对差异的最大值,则可以将其乘以a0 到 1 之间的因子作为阈值:

a = .7
m = d.max()
print(d > m * a)
Run Code Online (Sandbox Code Playgroud)

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

在此基础上,您可以使用滑动窗口技术(例如内核密度估计或 Parzen 窗口)来创建更平滑的结果:

r = d.rolling(3, min_periods=1, win_type='parzen').sum()
n = r.max()
Run Code Online (Sandbox Code Playgroud)

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

print(r > n * a)
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出

Index
220    False
221    False
222    False
223    False
224    False
225    False
226    False
227     True
228     True
229     True
dtype: bool
Run Code Online (Sandbox Code Playgroud)