【问题标题】:Finding local minimum values in pandas在熊猫中查找局部最小值
【发布时间】:2021-01-13 09:59:15
【问题描述】:

我有以下数据:

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

我该如何解决这个错误?

【问题讨论】:

    标签: python pandas min


    【解决方案1】:

    您可以先找到所有向下的运行并获取此运行的终点。假设您的数据在文件 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');
    

    结果

    要查找所有局部最小值

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

    结果

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        如果我理解正确,局部最小值是指这些值都小于它们的前一个值和下一个值。因此,条件是

        (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
        

        【讨论】:

          【解决方案4】:

          Try 将创建一个新列,如果这是一个局部最小值,则该列将为 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)
          

          【讨论】:

            猜你喜欢
            • 2018-06-09
            • 2021-03-28
            • 2019-07-21
            • 2012-08-27
            • 2020-08-09
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 2021-06-23
            相关资源
            最近更新 更多