在pandas数据帧上传递一个带有resample()方法指定参数的函数

时间:2014-08-04 15:27:33

标签: python function datetime pandas

我想将一个函数传递给pandas数据帧上的resample(),并在传递时指定某些参数(而不是定义几个单独的函数)。

这是功能

import itertools
def spell(X, kind='wet', how='mean', threshold=0.5): 

    if kind=='wet':
        condition = X>threshold
    else:
        condition = X<=threshold

    length = [sum(1 if x==True else nan for x in group) for key,group in itertools.groupby(condition)]

    if not length: 
        res = 0
    elif how=='mean': 
        res = np.mean(length)
    else:
        res = np.max(length)

    return res

这是一个数据框

idx = pd.DatetimeIndex(start='1960-01-01', periods=100, freq='d')
values = np.random.random(100)
df = pd.DataFrame(values, index=idx)

而且这是我想用它做什么

df.resample('M', how=spell(kind='dry',how='max',threshold=0.7))

但我收到错误TypeError: spell() takes at least 1 argument (3 given)。我希望能够使用指定的这些参数传递此函数,输入数组除外。有没有办法做到这一点?

编辑:

X是在数据框对象上调用resample方法时传递给函数的输入数组,如df.resample('M', how=my_func)所示每月重新采样间隔。

如果我尝试df.resample('M', how=spell),我会:

0
1960-01-31  1.875000
1960-02-29  1.500000
1960-03-31  1.888889
1960-04-30  3.000000

这正是我想要的默认参数,但我希望能够在传递函数之前指定函数的输入参数。这可能包括将定义存储在另一个变量中,但我不确定如何在更改默认参数的情况下执行此操作。

1 个答案:

答案 0 :(得分:0)

我认为这可能是你正在寻找的东西,虽然它有点难以辨别..如果这有帮助,请告诉我。首先,示例数据框:

idx = pd.DatetimeIndex(start='1960-01-01', periods=100, freq='d')
values = np.random.random(100)
df = pd.DataFrame(values, index=idx)

编辑 - 有一个大于而不是小于或等于原来...... 接下来,功能:

def spell(df, column='', kind='wet', rule='M', how='mean', threshold=0.5): 
    if kind=='wet':
        df = df[df[column] > threshold]
    else:
        df = df[df[column] <= threshold]

    df = df.resample(rule=rule, how=how)
    return df

所以,你可以通过以下方式来称呼它:

spell(df, 0)

获得:

               0
1960-01-31  0.721519
1960-02-29  0.754054
1960-03-31  0.746341
1960-04-30  0.654872

您也可以更改参数:

spell(df, 0, kind='something else', rule='W', how='max', threshold=0.7)


            0
1960-01-03  0.570638
1960-01-10  0.529357
1960-01-17  0.565959
1960-01-24  0.682973
1960-01-31  0.676349
1960-02-07  0.379397
1960-02-14  0.680303
1960-02-21  0.654014
1960-02-28  0.546587
1960-03-06  0.699459
1960-03-13  0.626460
1960-03-20  0.611464
1960-03-27  0.685950
1960-04-03  0.688385
1960-04-10  0.697602