【问题标题】:Calling arbitrary function from pandas rolling series从熊猫滚动系列中调用任意函数
【发布时间】:2021-11-21 11:01:50
【问题描述】:

我可以调用通过 pandas 系列上的字符串变量定义的任意方法。我会这样做的方式是这样的:

import pandas as pd

method_name = 'mean'
pd.Series([1, 2, 3]).__getattr__(method_name)()

现在我想对滚动的熊猫系列做同样的事情,我会这样做:

import pandas as pd

method_name = 'mean'
pd.Series([1, 2, 3]).rolling(window=1).__getattr__(method_name)()

执行此操作时出现以下错误:

AttributeError: 'Rolling' object has no attribute 'mean'

有没有办法在滚动的熊猫系列上调用任意方法(平均值、中值、最大值、最小值、分位数)?

谢谢!

【问题讨论】:

  • pd.Series([1, 2, 3]).rolling(window=1).agg(method_name) ?

标签: python pandas oop


【解决方案1】:

您可以从 Python 文档(数据模型)中了解 getattrgetattributegetattrgetattribute

getattribute的使用会解决你的问题;

import pandas as pd

method_name = 'mean'
pd.Series([1, 2, 3]).rolling(window=1).__getattribute__(method_name)()

输出

0    1.0
1    2.0
2    3.0
dtype: float64

【讨论】:

    【解决方案2】:

    必须为每个对象实现方法__getattr__。这与__getatrribute__ 不同,__getatrribute__ 是 Python 中 object 基类中的一个方法。当调用__getatrr__ 时,您将获得该方法的对象实现(如果有)。对于rolling,定义如下,它基本上会检查缓存/酸洗目的(_internal_names_set),如果没有找到,它会检查数据帧(self.obj):

    def __getattr__(self, attr: str):
        if attr in self._internal_names_set:
            return object.__getattribute__(self, attr)
        if attr in self.obj:
            return self[attr]
    
        raise AttributeError(
            f"'{type(self).__name__}' object has no attribute '{attr}'"
        )
    

    为避免这种情况,请使用getattr 内置函数:

    >> getattr(df.rolling(3), 'mean')
    

    我喜欢getattr,因为它允许您在未定义属性时指定第三个可选参数:

    >> getattr(df.rolling(3), 'mean', None)
    

    【讨论】:

      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 2021-01-08
      • 2023-01-19
      • 2015-05-28
      • 2013-11-25
      • 1970-01-01
      • 2019-01-25
      • 2020-06-03
      相关资源
      最近更新 更多