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