当前位置: 首页 > 知识库问答 >
问题:

寻找局部最大值和最小值

南门建章
2023-03-14

我有一个熊猫数据框,有两列,一列是温度,另一列是时间。

我想做第三和第四列,叫做最小和最大。这些列中的每一个都将填充nan's,除非有一个局部min或max,那么它将具有该极值的值。

这里是一个数据的样本,本质上我试图识别图中所有的峰值和低点。

有没有内置的熊猫工具可以做到这一点?

共有3个答案

沈飞跃
2023-03-14

使用Numpy

ser = np.random.randint(-40, 40, 100) # 100 points
peak = np.where(np.diff(ser) < 0)[0]

double_difference = np.diff(np.sign(np.diff(ser)))
peak = np.where(double_difference == -2)[0]

使用熊猫

ser = pd.Series(np.random.randint(2, 5, 100))
peak_df = ser[(ser.shift(1) < ser) & (ser.shift(-1) < ser)]
peak = peak_df.index
秦毅
2023-03-14

假设感兴趣的列被标记为data,一种解决方案是

df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]

例如:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 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'])

# Find local peaks
df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]

# Plot results
plt.scatter(df.index, df['min'], c='r')
plt.scatter(df.index, df['max'], c='g')
df.data.plot()
查修谨
2023-03-14

fuglede提供的解决方案非常好,但如果您的数据非常嘈杂(如图中所示),则最终会出现大量误导性的局部极端情况。我建议您使用scipy。信号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数组
 类似资料:
  • 我正在为游戏开发AI,我想使用MinMax算法和Alpha-Beta修剪。 我对它的工作原理有一个粗略的想法,但我仍然无法从头开始编写代码,所以我花了最近两天的时间在网上寻找某种伪代码。 我的问题是,我在网上找到的每个伪代码似乎都是基于找到最佳移动的值,而我需要返回最佳移动本身而不是数字。 我现在的代码是基于这个伪代码(源代码) 如您所见,这段代码返回一个数字,我想这是使一切正常工作所必需的(因为

  • 主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都

  • 假设这条线是由熊猫的离散随机数组成的。我怎样才能找到A、B、C、D点? A是第一点和C之间的最高点 C是A和B之间的最低点 B是C和D之间的最高点 您可以使用这些数据来测试:[1, 2, 3, 10, 13, 15, 20, 50, 49, 49, 32, 33, 35, 36, 35, 34, 33, 34, 35, 36, 30, 27, 22, 15, 15, 17, 20, 27, 30,

  • 如何在数据集中找到几个最小值中的第一个?我希望至少2大于最小值。 例如, 我想将df['value'][0]或者简单地说(0.6)标识为这个数组中的第一个最小值。然后将df[‘值’][4]或(2.8)确定为至少比第一个确定的最小值(0.6)大2的值。 这适用于其他数据集,但在最小值为第一个时不适用。 理想的输出是: 正如评论中建议的那样,循环将是更好的方法。

  • 问题内容: 我有一个搜索栏,并尝试在步骤1中将值从60设置为180,将第二个设置为190。 不管用。知道如何解决吗? 问题答案:

  • 我需要在熊猫数据帧中找到本地最大值和最小值,起初看起来这和熊猫找到本地最大值和最小值是一样的问题,但建议的解决方案似乎都不正确。 我想确定局部最小值和最大值,而不是平台值。正确的标识是: iloc 2或3中的最大值(无所谓) iloc 7中的最小值 一个解决方案是开始写循环和如果/其他,但它变得越来越丑陋...我猜可能有更简单的解决方案,使用熊猫,我缺乏一些知识,任何帮助都将不胜感激。 我对Pyt