【问题标题】:Method like argument in function函数中类似参数的方法
【发布时间】:2017-03-01 09:28:57
【问题描述】:

我想在 python / pandas 中使用方法,例如函数中的参数。 例如数据帧的滚动统计:

def rolling (df, prefix = 'r', window = 3, method = 'here I wanna choose a method' ):
    for name in df.columns:
        df[prefix + name] = df[name].rolling(window).'here this method been called'
    return df

'mean()' 或 'sum()' 或其他... 喜欢

df.rolling(2).sum()

我在 R 中工作了 95% 的时间,在 R 中这很简单(将函数作为参数或返回任何函数)。但是在python中我是菜鸟。所以我创建了一个包来让我更轻松。喜欢:

def head(x,k = 3):
    return x.head(k)

python 中的什么函数可以帮助我在函数中使用类似参数的方法?

#some data
import numpy as np
import pandas as pd
from pandas_datareader.data import DataReader
from datetime import datetime
ibm = DataReader('IBM',  'yahoo', datetime(2000,1,1), datetime(2016,1,1))

ibm2 = rolling(ibm,'rr', 5, 'sum') # something like this

【问题讨论】:

    标签: python r function pandas methods


    【解决方案1】:

    您可以将getattr 与方法名称的str 一起使用。这会从对象中获取具有该名称的属性(在本例中为方法)

    def rolling (df, prefix='r', window=3, method='sum'):
        for name in df.columns:
            df[prefix + name] = getattr(df[name].rolling(window), method)()
        return df
    

    或者你可以直接传入方法。调用时,第一个参数为self

    def rolling (df, prefix='r', window=3, method=DataReader.sum):
        for name in df.columns:
            df[prefix + name] = method(df[name].rolling(window))
        return df
    

    【讨论】:

      【解决方案2】:

      我这样做

      def rolling (df, prefix='r', window=3, method='method_name'):
          for name in df.columns:
              df[prefix + name] = df[name].rolling(window).__getattribute__(method)()
          return df
      

      【讨论】:

        【解决方案3】:

        方法和其他任何属性一样是一个属性(它只是在绑定到对象时可调用),因此您可以使用getattr。 (None 的默认值当然是无稽之谈,但我不想重新排序您的签名以使 method 在没有默认值的情况下更早出现。)

        def rolling (df, prefix='r', window=3, method=None):
            for name in df.columns:
                obj = df[name].rolling(window)
                m = getattr(obj, method)
                df[prefix + name] = m()
            return df
        

        【讨论】:

        • 嗯,None 的默认值可能是捕获错误的好方法。
        • 真;我将把关于不存在方法的错误处理的任何讨论留给读者自行决定。
        猜你喜欢
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 2015-02-09
        • 2023-03-09
        • 2020-04-06
        • 2012-07-09
        • 1970-01-01
        相关资源
        最近更新 更多