Python 在数据帧上传递带有为resample()方法指定的参数的函数

Python 在数据帧上传递带有为resample()方法指定的参数的函数,python,function,datetime,pandas,Python,Function,Datetime,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

我想在数据帧上传递一个函数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
这就是我想用它做的事情

df.resample('M', how=spell(kind='dry',how='max',threshold=0.7))
但是我得到了一个错误
TypeError:spell()至少接受一个参数(给定3个)
。我希望能够通过指定的这些参数(输入数组除外)传递此函数。有办法做到这一点吗

编辑:

X是在对数据帧对象(如so
df)调用重采样方法时传递给函数的输入数组。重采样('M',how=my_func)
用于每月重采样间隔

如果我尝试
df.resample('M',how=拼写)
我会得到:

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

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

我认为这可能就是您要查找的,尽管有点难说。。让我知道这是否有帮助。首先,示例数据帧:

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
要获得:

               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

你的问题缺少了一些有用的东西。什么是X-您是否尝试将数据帧传递给此函数?pandas resample函数要求将特定字符串传递给how参数。比如“mean”或“max”。你的函数似乎只返回一个值-res?我已经编辑了这个问题。基本上,在数据帧上调用resample()时,会为所选的重新采样间隔传递numpy数组,此处为每月一次,因此X将是numpy数组。函数可以传递给how参数,如我上面所示,但我需要一种方法,在传递之前更改默认参数,而不必重新定义或定义具有不同默认参数的新函数。通常,传递给“how”参数的函数会返回单个值,这就是我在这里所做的。我还没有尝试过,但是我认为重采样方法也可以返回python对象。有趣的方法,但是这实际上并不能完成函数正在做的事情。该函数计算序列中超过阈值的值的出现次数,并获取传递给它的数组的平均值(对应于每个月)。我一直在考虑如何修改这个函数,但我总是不得不将函数传递给重采样(除了基本上重写重采样函数外),并尝试调整how参数。您可以传递多个函数。例如,count不会这样做,而不仅仅是mean-maybe['mean','count']?因为
length=[sum(1代表组中的x)对于key,在itertools中分组。groupby(condition)if key]
是查找阈值条件内的所有数字序列,并以天为单位计算它们各自的长度。似乎唯一的选择是为每一组参数创建单独的函数。您是否尝试查看阈值上方和下方的组?current函数根据kind参数消除高于/低于阈值(基于kind参数高于或低于阈值)的数字,但它需要按顺序计数数字,即相邻的数字,而不是符合一个条件的所有数字。我之所以更新这个问题,是因为我提到的这一行实际上应该是itertools.groupby(条件)中的key和group的长度=[sum(如果x==True,那么x在group中为nan)]
               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