Je souhaite avoir une application continue sur une trame de données, mais j'ai un problème avec ma fonction personnalisée pour laquelle je souhaite avoir une entrée supplémentaire :

df_test = pd.DataFrame(columns=['amount'])
df_test['amount'] = [1, 2, 3, 4, 5]
mean = df_test['amount'].mean()

def rule(x,mean):
   x = x-mean
   return sum(x)

df_test['amount'].rolling(3).apply(rule,mean=mean)

Cela revient

TypeError: apply() got an unexpected keyword argument 'mean'
1
s900n 9 nov. 2020 à 16:09

1 réponse

Meilleure réponse

C'est différent de **kwargs normal, ici, dans rolling.apply, il s'agit essentiellement d'un paramètre qui prend les arguments des mots clés dans un dict.

Documents rolling.apply :

  • kwargs : dict, par défaut Aucun.

    Arguments de mots clés à transmettre à func.

df_test['amount'].rolling(3).apply(rule,kwargs={'mean':mean})

0    NaN
1    NaN
2   -3.0
3    0.0
4    3.0
Name: amount, dtype: float64

Une autre façon est d'utiliser functools.partial ici .

from functools import partial
rule_mean = partial(rule, mean=mean)
df_test['amount'].rolling(3).apply(rule_mean)

0    NaN
1    NaN
2   -3.0
3    0.0
4    3.0
Name: amount, dtype: float64
2
Ch3steR 9 nov. 2020 à 13:27