在 Pandas 中查找局部最小值

5

我有以下数据:

Date
2020-07-20   -98.109956
2020-07-21   -94.408946
2020-07-22   -76.788330
2020-07-23   -71.094908
2020-07-24   -92.262792
2020-07-27   -97.932848
2020-07-28   -90.236719
2020-07-29   -96.301774
2020-07-30   -94.293501
2020-07-31   -98.110483
2020-08-03   -99.121514
2020-08-04   -73.715980
2020-08-05   -67.069465
2020-08-06   -57.401802
2020-08-07   -53.323235
2020-08-10   -50.000000
2020-08-11   -24.169180
2020-08-12   -10.286685
2020-08-13    -6.745360
2020-08-14   -19.178088
2020-08-17    -2.475911
2020-08-18   -11.586069
2020-08-19    -4.896705
2020-08-20   -10.435387
2020-08-21   -20.938373
2020-08-24    -8.269516
2020-08-25   -11.557382
2020-08-26    -2.938893
2020-08-27   -10.296292
2020-08-28    -7.050787
2020-08-31   -24.016059
2020-09-01   -27.694853
2020-09-02    -4.538226
2020-09-03    -8.166541
2020-09-04    -8.243151
2020-09-07    -3.356906
2020-09-08   -32.970033
2020-09-09   -11.716626
2020-09-10   -16.220030
2020-09-11   -33.078070
2020-09-14   -38.897395
2020-09-15   -35.068910
2020-09-16   -39.969342
2020-09-17   -23.889707
2020-09-18   -26.339946
2020-09-21   -68.164790
2020-09-22   -89.451473
2020-09-23   -72.038817
2020-09-24   -74.854345
2020-09-25   -61.359206
Name: CHAMTEMP, dtype: float64

该情节如下:

进入图像描述

我正在尝试查找所有的局部最小值,方法是查找数据至少为-80,并继续给出较低的值,直到它给出更高的值。

例如:如果数值为-80、-82、-83、-90、-89。在这个例子中,-90将是最低的值,因为-89比-90要高。

我尝试了这个方法但是出现了错误:

data.loc[data < -80] and data.loc[data.shift(-1)<data.shift(0)]

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我该如何解决这个错误?

4个回答

2
假设 df 是数据框,data 是列名:
import numpy as np
from scipy.signal import argrelextrema

df["lmin"] = False

df.iloc[argrelextrema(df["data"].to_numpy(), np.less)[0], list(df.columns).index("lmin")] = True

2

您可以先找到所有的下降趋势,并获取这些趋势的终点。假设您的数据在文件filename.csv中。

import pandas as pd
import numpy as np

df = pd.read_csv('filename.csv', sep='\s+', parse_dates=True)

down = df.Date.diff().values < 0
df['test'] = np.r_[down[1:] != down[:-1], False] & down

pd.read_csv中使用parse_dates=True来绘制数据将产生更美观的图表。

import matplotlib.pyplot as plt

plt.figure(figsize=(14,5))
plt.plot(df.Date)
plt.plot(df.Date[df.test], 'o');

结果 所有局部极小值

要查找所有小于-80的局部极小值,您可以添加此条件。

plt.figure(figsize=(14,5))
plt.plot(df.Date)
plt.plot(df.Date[(df.test) & (df.Date < -80)], 'o');

结果 lower -80 minima


2
如果我理解正确,局部最小值是指数值既小于前一个值又小于后一个值的情况。因此,条件为
(data < data.shift(1)) & (data < data.shift(-1))

添加条件小于-80,条件变为

conds = (data < -80) & (data < data.shift(1)) & (data < data.shift(-1))

使用这个条件进行切片。
data_minima = data[conds]

Out[29]:

2020-07-27   -97.932848
2020-07-29   -96.301774
2020-08-03   -99.121514
2020-09-22   -89.451473
Name: 1, dtype: float64

1

尝试创建一个新列,如果这是一个局部最小值,则该列将为True:

import numpy as np
minimum = -80
df['local_min'] = np.where(((df['data'] < minimum) & (df['data'] < df['data'].shift(-1)) & (df['data'] > df['data'].shift(1)), True, False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接