在熊猫中找到当地的最小值

时间:2020-09-27 18:03:52

标签: python pandas min

我有以下数据:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.hide(WindowInsets.Type.statusBars())
}
else {
    @Suppress("DEPRECATION")
    window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN)
}

情节看起来像这样:

enter image description here

我试图通过查找至少为-80的数据来查找所有局部最小值,并继续提供较低的值,直到提供较高的值为止。

例如:如果值是-80,-82,-83,-90,-89。在此示例中,-90是最低值,因为-89高于-90。

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

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

我该如何解决此错误?

4 个答案:

答案 0 :(得分: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

parse_dates=True中用pd.read_csv绘制数据会产生更好的图

import matplotlib.pyplot as plt

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

结果 all local minima

要查找所有局部最小值<-80,可以添加此条件

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

结果 lower -80 minima

答案 1 :(得分: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 :(得分: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

答案 3 :(得分: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)