Python 中的变化点检测

问题描述 投票:0回答:2

我有一个 pandas DataFrame,其中一列包含以下元素:

[2,2.5,3,2,2.6,10,10.3,10,10.1,10.3,10], 

是否有一个 python 函数可以检测该列表中从 2.6 到 10 的突然变化?我读过一点,R 可以做到。 python中有类似的函数吗?

python python-2.7 pandas
2个回答
11
投票

IIUC,您可以使用

pct_change
来查找邻居之间的差异,然后与您的限制进行比较(无论它是什么):

s = pd.Series([2,2.5,3,2,2.6,10,10.3,10,10.1,10.3,10])

In [105]: s.pct_change()
Out[105]:
0          NaN
1     0.250000
2     0.200000
3    -0.333333
4     0.300000
5     2.846154
6     0.030000
7    -0.029126
8     0.010000
9     0.019802
10   -0.029126
dtype: float64

In [107]: s[s.pct_change() > 1]
Out[107]:
5    10
dtype: float64

In [117]: s[s.pct_change() > 1].index.tolist()
Out[117]: [5]    

0
投票

您的示例信号非常简单。正如上面所回答的,滞后 1(一阶)差分足以为您提供一个可以定位为变化点的尖峰。如果信号更复杂,一些基于模型的方法可能会有所帮助。在Python中,

ruptures
包绝对是一个绝佳的选择。如果需要贝叶斯方法,一种选择是我开发的 Rbeast 包(https://pypi.org/project/Rbeast)。

© www.soinside.com 2019 - 2024. All rights reserved.