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)
我只是想在速度突然下降时捕捉一个大概的范围,以便使用其他功能。
如果我可以添加任何其他信息,请告诉我。谢谢!
如果您想一个一个比较两个值,这将是一种简单的方法:
鉴于您的问题中的系列,称为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)