4 votes

rééchantillonner dans pandas avec la méthode dans une variable

Pandas a modifié son API de rééchantillonnage dans la version 18.1. Les méthodes de réduction ne sont plus un argument de la méthode de rééchantillonnage, mais sont leurs propres méthodes.

Exemple :

import pandas as pd
import numpy as np

rng = pd.date_range('1/1/2012', periods=100, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)

#Old API
ts.resample('5Min', how='sum')

#New API
ts.resample('5Min').sum()

J'avais un code qui se comportait comme suit :

def my_func(my_series, how="sum"):
    #Do some stuff before
    my_series.resample('5Min' how=how)

Comment faire avec la nouvelle API ? Je veux my_func pour pouvoir appeler la méthode de rééchantillonnage avec différentes méthodes de réduction.

Un répondre couvre déjà le cas où le "comment" est une simple fonction d'agrégation. J'avais davantage à l'esprit les cas où nous voulons effectuer un suréchantillonnage.

Par exemple

#Old API:
ts.resample('250L', fill_method='ffill')
#New API
ts.resample('250L').ffill()

Notez que dans mon code réel, j'ai quelque chose de plus proche de cela :

def my_func(dummy_df, freq="10Min", how="last", label="right", closed="right", fill_method="ffill"):
    dummy_df.resample(freq, how=how, label=label, closed=closed, fill_method=fill_method)

et souhaite le réécrire avec la nouvelle API.

Il est déconcertant de constater que le la documentation encore (26.07.2016) comporte cette ligne :

Toute fonction disponible via le dispatching peut être donnée au paramètre how par son nom, y compris sum, mean, std, sem, max, min, median, first, last, ohlc.

Mais le how est censé devenir obsolète.

4voto

jezrael Points 290608

Solution avec Resampler.agg :

print (ts.resample('5Min').agg('sum'))

print (ts.resample('5Min').sum())
2012-01-01    24223
Freq: 5T, dtype: int32

print (ts.resample('5Min').agg('sum'))
2012-01-01    24223
Freq: 5T, dtype: int32

La fonction personnalisée est donc :

def my_func(my_series, how="sum"):
    #Do some stuff before
    return my_series.resample('5Min').agg(how)

print (my_func(ts))
2012-01-01    24223
Freq: 5T, dtype: int32

2voto

piRSquared Points 159

Séparer how y fill_method et les faire passer par getattr :

def my_func(dummy_df, freq="10Min", how="last",
            label="right", closed="right", fill_method="ffill"):
    resample = dummy_df.resample(freq, label=label, closed=closed)
    return getattr(getattr(resample, how)(), fill_method)()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X