熊猫找到当地最大和最小

时间:2017-12-29 14:19:01

标签: python pandas numpy dataframe

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

我想制作名为min和max的第三和第四列。除了存在局部最小值或最大值之外,这些列中的每一列都将填充为nan,然后它将具有该极值的值。

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

enter image description here

是否有任何带有pandas的内置工具可以实现这一目标?

3 个答案:

答案 0 :(得分:16)

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

enter image description here

有些观点:

  • 您可能需要检查以后的积分,以确保没有相互靠近的点。
  • 您可以使用n来过滤嘈杂的点
  • argrelextrema返回一个元组,最后的[0]提取numpy数组

答案 1 :(得分:13)

假设感兴趣的列标记为moment(new Date("2017-12-14T4:0:14-06:00")).format('MMM DD,YYYY A') ,则一个解决方案将是

new Date("2017-12-14T4:0:14-06:00");

例如:

data

enter image description here

答案 2 :(得分:0)

使用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