我可以动态选择应用于pandas Resampler对象的方法吗



我正在尝试创建一个函数,对pandas中的时间序列数据进行重新采样。我想根据我发送的数据类型来指定聚合的类型(例如,对于某些数据,取每个bin的总和是合适的,而对于其他数据,取平均值是必要的,等等(

import pandas as pd
import numpy as np
dr = pd.date_range('01-01-2020', '01-03-2020', freq='1H')
df = pd.DataFrame(np.random.rand(len(dr)), index=dr)

我可以有这样的功能:

def process(df, freq='3H', method='sum'):
r = df.resample(freq)
if method == 'sum':
r = r.sum()
elif method == 'mean':
r = r.mean()
#...
#more options
#...
return r

对于少量的聚合方法,这是可以的,但如果我想从所有可能的选择中进行选择,这似乎会很乏味。

我希望使用getattr来实现类似于这篇文章的东西(在"让它发挥作用:泛化方法调用"下(。然而,我找不到这样做的方法:

def process2(df, freq='3H', method='sum'):
r = df.resample(freq)
foo = getattr(r, method)
return r.foo()
#fails with:
#AttributeError: 'DatetimeIndexResampler' object has no attribute 'foo'
def process3(df, freq='3H', method='sum'):
r = df.resample(freq)
foo = getattr(r, method)
return foo(r)
#fails with:
#TypeError: __init__() missing 1 required positional argument: 'obj'

我知道process2失败的原因(调用r.foo()查找r的方法foo(),而不是变量foo(。但我不明白process3失败的原因。

我知道另一种方法是将函数传递给参数method,然后将apply传递给r上的那些函数。我的倾向是这样效率会降低吗?它仍然不允许我直接访问内置的Resample方法。

有没有一种有效的、更简洁的方法来实现这一点?谢谢

尝试.resample().apply(method)

但是,除非您计划在函数中进行更多的计算,否则只对这一行进行硬编码可能会更容易。

最新更新