【问题标题】:Pandas: using rolling windows with user functionsPandas:使用带有用户功能的滚动窗口
【发布时间】:2019-02-18 07:05:59
【问题描述】:

我有一个数据框,我用旧式滚动语法估计了各种类型的 10 年滚动平均值:

`pandas.rolling_mean(df['x'], 10)`, 
`pandas.rolling_median(df['x'], 10)`

`pandas.rolling_apply(df['x'],10, hodgesLehmanMean)`,

hodgesLehman 的意思是我写的一个函数(见下文)。

def hodgesLehmanMean(x):
    #Computes the Hodges-Lehman mean = median { [x_i + x+j]/2 }. 
    #Robust to 29% outliers, with high (95% efficiency) in the gaussian case

    N = len(x)
    return 0.5 * numpy.median(x[i] + x[j] for i in range(N) for j in range(i+1,N))
`

现在旧的滚动函数已被弃用,我正在尝试以新样式 series.rolling() 样式重写我的代码,即:

`df['x'].rolling(window=10).mean()`, 
`df['x'].rolling(window=10).median()`
 and 
`df['x'].rolling(window=10).hodgesLehmanMean()`.

前两个(均值和中值)就像一个魅力。第三个(hodgesLehmanMean)不起作用 - 它引发了AttributeError: 'Rolling' object has no attribute 'hodgesLehmanMean

如何让我的函数使用新的 series.rolling 语法?

【问题讨论】:

    标签: python pandas rolling-computation


    【解决方案1】:

    您可以拨打Rolling.apply/agg:

    df['x'].rolling(window=10).agg(hodgesLehmanMean)
    

    另外,请注意,在您的函数中,您希望将 list 传递给 np.median,而不是 generator

    def hodgesLehmanMean(x): 
        return 0.5 * np.median([x[i] + x[j] 
                               for i in range(len(x)) 
                               for j in range(i+1,len(x))])
    

    如需更快地实现hodgesLehmanMean,请查看unutbu's answer 以解决您较早的问题之一here

    【讨论】:

    • 感谢您的指点 - 就像一个魅力。我不知道 agg,并在您的指导下立即开始工作。实际上,我使用了 unutbu 更快的 hodgesLehmanMean 实现,该实现是为了回应我之前的问题而发布的,但故意没有发布它,以防它对我的问题的性质造成任何混淆。再次感谢!托马斯飞利浦
    • @ThomasPhilips 如果答案有帮助,请vote on it and accept the answer。谢谢。
    • 确实如此,我已经接受了答案并对其进行了投票。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多