【问题标题】:Selecting local minima and maxima from pandas.Series从 pandas.Series 中选择局部最小值和最大值
【发布时间】:2015-02-22 07:05:20
【问题描述】:

有一个scipy.signal.argrelextrema 函数可以与ndarray 一起使用,但是当我尝试在pandas.Series 上使用它时,它会返回错误。将它与 pandas 一起使用的正确方法是什么?

import numpy as np
import pandas as pd
from scipy.signal import argrelextrema
s = pd.Series(randn(10), range(10))
s
argrelextrema(s, np.greater)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-f3812e58bbe4> in <module>()
      4 s = pd.Series(randn(10), range(10))
      5 s
----> 6 argrelextrema(s, np.greater)

/usr/lib/python2.7/dist-packages/scipy/signal/_peak_finding.pyc in argrelextrema(data, comparator, axis, order, mode)
    222     """
    223     results = _boolrelextrema(data, comparator,
--> 224                               axis, order, mode)
    225     return np.where(results)
    226 

/usr/lib/python2.7/dist-packages/scipy/signal/_peak_finding.pyc in _boolrelextrema(data, comparator, axis, order, mode)
     60 
     61     results = np.ones(data.shape, dtype=bool)
---> 62     main = data.take(locs, axis=axis, mode=mode)
     63     for shift in xrange(1, order + 1):
     64         plus = data.take(locs + shift, axis=axis, mode=mode)

TypeError: take() got an unexpected keyword argument 'mode'

【问题讨论】:

标签: python pandas


【解决方案1】:

你可能想这样使用它,

argrelextrema(s.values, np.greater)

您当前使用的是完整的 pandas 系列,而 argrelextrema 需要一个 nd 数组。 s.values 为您提供了 nd.array

【讨论】:

    【解决方案2】:

    即使s.values 仍然可以正常工作(Pandas 0.25),现在推荐的方法是:

    argrelextrema(s.to_numpy(), np.greater)
    # equivalent to:
    argrelextrema(s.to_numpy(copy=False), np.greater)
    

    虽然还有一个 s.array 属性,但在这里使用它会失败:TypeError: take() got an unexpected keyword argument 'axis'

    注意:copy=False 的意思是“不要强制复制”,但它仍然可能发生。

    【讨论】:

      【解决方案3】:

      迟到的回复 当您的代码显示时,您的已被 pandas 读取的数组应该变成 numpy 数组。所以只需尝试通过np.array将数据框更改为numpy数组

      g = np.array(s) # g is new variable notation
      argrelextrema(g, np.greater)
      
      

      或其他形状

      g = np.array(s) # g is new variable notation
      argrelextrema(g, lambda a,b: (a>b) | (a<b))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 2021-09-12
        相关资源
        最近更新 更多