如何从值序列中获取尖峰值?
数据挖掘
Python
特征提取
预处理
2021-09-28 00:39:20
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(根据您的图表),然后只选择窗口内的最高值。
其它你可能感兴趣的问题




