python - Pandas 寻找局部最大值和最小值

标签 python pandas dataframe numpy time-series

我有一个包含两列的 Pandas 数据框,一列是温度,另一列是时间。

我想将第三列和第四列分别命名为最小值和最大值。这些列中的每一列都将用 nan 填充,除非有局部最小值或最大值,否则它将具有该极值的值。

这是数据的示例,基本上我试图识别图中的所有峰值和低点。

enter image description here

是否有任何带有 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/

相关文章:

python - 从 SQL 结果创建 pandas 数据框

python - 返回无值的数据框

python - Tkinter回调异常: matplotlib animation

python - 使用 pandas 将一行写入 csv 文件

python - 如何处理 Pandas 中的SettingWithCopyWarning

python - DataFrame 对象没有属性 'name'

python - 分组值并使用 Python 在 Pandas 上合并

python - 使用 else 语句有什么好处吗?

python - 不打算使用 json.load 反序列化在 Python 中保存为字符串的 json

pandas - 同时运行 df.apply、dask 和 pd.get_dummies