【问题标题】:How to find the last local maximum of a pandas time series?如何找到熊猫时间序列的最后一个局部最大值?
【发布时间】:2019-03-03 09:17:13
【问题描述】:

给定以下数据框:

pd.DataFrame([['a', 1], ['b', 3], ['c', 7], ['d', 4], ['e', 1], ['f', 2], ['g', 9], ['h', 4], ['i', 0]])

有没有更好的方法来找到最后一个局部最大值('g'),而不是反向逐行迭代并搜索大于当前行的前一行?

这是我目前正在使用的,必须有更有效的东西:

df.columns = ['x', 'y']

first = True
prev_val = None
prev_row = None

for index, row in df[::-1].iterrows():
    if first:
        prev_val = row['y']
        prev_row = row['x']
        first = False
    else:    
        if row['y'] >= prev_val:
            prev_val = row['y']
            prev_row = row['x']
        else:
            break

【问题讨论】:

    标签: python arrays pandas numpy series


    【解决方案1】:

    使用scipy.signal.argrelextrema:

    from scipy.signal import argrelextrema
    
    a = df.iat[argrelextrema(df[1].values, np.greater)[0][-1], 0]
    print (a)
    g
    

    【讨论】:

      【解决方案2】:

      一般而言,您应该尽量避免手动循环,尤其是使用iterrows。一个例外是numba,它在较低级别高效地执行迭代:

      from numba import jit
      
      df = pd.DataFrame([['a', 1], ['b', 3], ['c', 9], ['d', 4], ['e', 1],
                         ['f', 2], ['g', 7], ['h', 4], ['i', 0]])
      
      @jit(nopython=True)
      def local_max_idx(A):
          for i in range(1, len(A)):
              if A[-(i+1)] < A[-i]:
                  return -i
      
      res = df[0].iat[local_max_idx(df[1].values)]  # 'g'
      

      性能基准测试

      n = 1000000
      df = pd.Series([0] + list(range(n, 0, -1))).to_frame().reset_index()
      df.columns = [0, 1]
      
      @jit(nopython=True)
      def local_max_idx(A):
          for i in range(1, len(A)):
              if A[-(i+1)] < A[-i]:
                  return -i
      
      from scipy.signal import argrelextrema
      
      %timeit df.iat[argrelextrema(df[1].values, np.greater)[0][-1], 0]  # 46.1 ms per loop
      %timeit df[0].iat[local_max_idx(df[1].values)]                     # 1.59 ms per loop
      

      【讨论】:

      • ...如果不存在矢量化解决方案,您认为argrelextrema 不能在这里使用吗?
      • @jezrael,我添加了一些性能基准测试,scipy 出于某种原因,当局部最大值接近系列开始时似乎很慢。
      • 可能是因为返回所有局部最大值
      猜你喜欢
      • 2018-06-09
      • 2021-03-28
      • 1970-01-01
      • 2022-10-16
      • 2021-01-13
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2018-04-02
      相关资源
      最近更新 更多