我有一个 pandas DataFrame,其中一列包含以下元素:
[2,2.5,3,2,2.6,10,10.3,10,10.1,10.3,10],
是否有一个 python 函数可以检测该列表中从 2.6 到 10 的突然变化?我读过一点,R 可以做到。 python中有类似的函数吗?
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]
您的示例信号非常简单。正如上面所回答的,滞后 1(一阶)差分足以为您提供一个可以定位为变化点的尖峰。如果信号更复杂,一些基于模型的方法可能会有所帮助。在Python中,
ruptures
包绝对是一个绝佳的选择。如果需要贝叶斯方法,一种选择是我开发的 Rbeast 包(https://pypi.org/project/Rbeast)。