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

Python-基于相对高度过滤局部极值

左丘繁
2023-03-14

使用fuglede的答案,很容易找到数据帧列的局部极值:

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()

它给出了以下图表:

我现在想把这些极值成对分组(最小值)

有没有一种优雅而快速的方法可以做到这一点?

共有2个答案

长孙知
2023-03-14

我同意前面的说法,但我认为这可能更符合你的要求。

threshold = 0.8
points = df.dropna(subset=['min', 'max'], how='all').copy()
ddf = pd.merge(points['min'].dropna().reset_index(),
               points['max'].dropna().reset_index(),
               left_index=True,
               right_index=True)
ddf = ddf[ddf['max'] < (ddf['min'] + threshold)]

# Plot results
plt.scatter(ddf['index_x'], ddf['min'], c='r')
plt.scatter(ddf['index_y'], ddf['max'], c='g')
df.data.plot()

虽然我怀疑你想要的其实是:

threshold = 3
points = df.dropna(subset=['min', 'max'], how='all').copy()
ddf = pd.merge(points['min'].dropna().reset_index(),
               points['max'].dropna().reset_index(),
               left_index=True,
               right_index=True)
ddf = ddf[ddf['max'] > (ddf['min'] + threshold)]

# Plot results
plt.scatter(ddf['index_x'], ddf['min'], c='r')
plt.scatter(ddf['index_y'], ddf['max'], c='g')
df.data.plot()

要将其合并回原始数据帧,请执行以下操作:

df['min'] = df.index.map(ddf.set_index('index_x')['min'])
df['max'] = df.index.map(ddf.set_index('index_y')['max'])
钦永贞
2023-03-14

我想你错过了Foad在这里报道的关于熊猫寻找本地最大值和最小值的极好答案

您可以设置一个窗口(邻居的数量)并查找值的局部最小值和最大值,而不是按1的移位计算最大值和最小值。虽然没有一个窗口参数可以完美匹配,但它大大降低了噪音。

from scipy.signal import argrelextrema

# Find peaks in the window
n = 10 #window size
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']
 类似资料:
  • 最近我一直在研究自动布局,我被一个看似微不足道的问题所困扰。我有一个想法,我想坐在屏幕的顶部,占据屏幕高度的一半。自动布局之前简单-只需将其固定到位,并告诉它在superview调整大小时垂直展开即可。 现在,我一辈子都不知道该怎么做。以下是我尝试设置时得到的结果: 底部空间约束设置为“等于284”,当我切换到iPhone4布局时,这对我来说绝对没有用,因为它在屏幕底部保留了284个点的空间,并将

  • 行列+单元格 001_1454578003995 column=hd:abc,时间戳=1454578173766,值=2 001_1454578003996 column=hd:def,timestamp=1454578173766,value=2 002_1454578003997 Column=HD:IJK,时间戳=1454578173766,值=2 你能帮我做这个吗?

  • 这个问题是我之前问题的延伸,有一些新问题,所以我想提出一个新的问题。我希望可以。 https://stackoverflow.com/questions/46054811/changing-the-values-in-the-neighbourhood-of-local-maxima-to-the-local-maxima/46055833#46055833 查询: > 问题:(我想改变我的窗口大

  • 如何根据具有绝对位置的子元素高度增加具有相对位置的父元素的高度。 在下面的例子中,父元素的高度显示为0px PS:我不想使用任何脚本 预期: 我得到的是: JSFIDLE 超文本标记语言: CSS:

  • 我有以下数据框: 我想根据以下条件对其进行过滤: 创建的角度=范围(87-92) GDT 1和GDT 2之间的距离 到目前为止我尝试了这个(最后一个方法): 此代码的输出是一个没有错误的空数据库。

  • 我问了一个以前被问过一百万次的问题,但在浏览了这些问题并求助于其他网站之后,我仍然没有找到一个好的答案: 如何在全局轴上旋转图形,而不是本地轴? opengl中的旋转对象 如何像OpenGL中的glRotatef()一样旋转顶点? 在OpenGL中围绕3个轴旋转对象 在OpenGL中沿对象自身的轴旋转对象 有没有可能让一个物体绕着它自己的轴旋转,而不是绕着基坐标轴旋转? OpenGL旋转-局部轴与