如何从值序列中获取尖峰值?

数据挖掘 Python 特征提取 预处理
2021-09-28 00:39:20

我有一堆向量,其中的值可以像这样绘制:

在此处输入图像描述

现在我想提取“尖峰值”(超过某个阈值,比如 15,000)。在这种情况下,有十五个。用 Python 怎么能做到这一点?(没有预定义的尖峰数量,但阈值是一个可靠的过滤器值。)

3个回答

这很简单。假设您的数据为 Panda 格式(名为 data_df),提取超过某个阈值(例如此处为 15000)的峰值/峰值很简单:

data_df[data_df > 15000]

如果此数据位于特定列中,则可以改用它:

data_df[data_df['column_name'] > 15000]

这些将返回峰值。

更新答案:

如果您想要每个峰值周围的局部极值点(例如 maximum 或 minimum ),请检查Scipy 中的scipy.signal.argrelextrema一个具体的例子:

让我们制作一个带有随机尖峰的人工随机数据:

import numpy as np                    
import matplotlib.pyplot as plt 

random_number1 =np.random.randint(0,200,20)
random_number2=np.random.randint(0,20,100)
random_number=np.concatenate((random_number1,random_number2))
np.random.shuffle(random_number)
plt.plot(random_number)

原始数据

现在使用argrelextrema函数,您将找到相对极值的索引(最小值或最大值)

c_max_index = argrelextrema(random_number, np.greater, order=5)

请确保您了解“订购”选项。它基本上会查看 5 个相邻点,并在这种情况下返回最大值。您可以通过在实际图表上精确定位找到的点来了解它是如何工作的,如下所示:

plt.plot(random_number)
plt.scatter(c_max_index[0],random_number[c_max_index[0]],linewidth=0.3, s=50, c='r')

带有红色峰值点的原始数据

请注意,您可以通过 random_number[c_max_index[0]] 检索峰值点,而 c_max_index 只是极值点的索引。

从 SciPy 1.1 版开始,您还可以使用find_peaks(数据来自@Majid Mortazavi 的回答

import numpy as np                    
import matplotlib.pyplot as plt
from scipy.signal import find_peaks 

np.random.seed(42)

# borrowed from @Majid Mortazavi's answer
random_number1 = np.random.randint(0, 200, 20)
random_number2 = np.random.randint(0, 20, 100)
random_number = np.concatenate((random_number1, random_number2))
np.random.shuffle(random_number)

peaks, _ = find_peaks(random_number, height=100)

plt.plot(random_number)
plt.plot(peaks, random_number[peaks], "x")
plt.show()

这将绘制(阈值 = 100):

在此处输入图像描述

除了height,您还可以设置峰之间的最小距离(例如 30):

在此处输入图像描述

在这种情况下,您将使用(其余代码相同):

peaks, _ = find_peaks(random_number, height=100, distance=30)

您可以实现某种窗口大小为 ca 的滑动窗口算法。50(根据您的图表),然后只选择窗口内的最高值。