我有一个包含两列的 Pandas 数据框,一列是温度,另一列是时间。
我想将第三列和第四列分别命名为最小值和最大值。这些列中的每一列都将用 nan 填充,除非有局部最小值或最大值,否则它将具有该极值的值。
这是数据的示例,基本上我试图识别图中的所有峰值和低点。
是否有任何带有 pandas 的内置工具可以完成此任务?
最佳答案
The solution offered by fuglede很好,但是如果您的数据非常嘈杂(如图中的数据),您最终会得到很多误导性的局部极端值。我建议你使用 scipy.signal.argrelextrema()
方法。 .argrelextrema()
方法有其自身的局限性,但它有一个有用的功能,您可以在其中指定要比较的点数,有点像噪声过滤算法。例如:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.signal import argrelextrema
# Generate a noisy AR(1) sample
np.random.seed(0)
rs = np.random.randn(200)
xs = [0]
for r in rs:
xs.append(xs[-1] * 0.9 + r)
df = pd.DataFrame(xs, columns=['data'])
n = 5 # number of points to be checked before and after
# Find local peaks
df['min'] = df.iloc[argrelextrema(df.data.values, np.less_equal,
order=n)[0]]['data']
df['max'] = df.iloc[argrelextrema(df.data.values, np.greater_equal,
order=n)[0]]['data']
# Plot results
plt.scatter(df.index, df['min'], c='r')
plt.scatter(df.index, df['max'], c='g')
plt.plot(df.index, df['data'])
plt.show()
几点:
- 之后您可能需要检查这些点,以确保没有缠绕点彼此非常靠近。
- 你可以用
n
来过滤噪声点 argrelextrema
返回一个元组,最后的[0]
提取一个numpy
数组
关于python - Pandas 寻找局部最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48023982/