Pandas & NumPy Academy · Leçon

Rééchantillonner des séries temporelles

Réduisez la fréquence de données quotidiennes à mensuelle avec resample('ME').sum() et augmentez-la avec un remplissage vers l’avant pour compléter les intervalles manquants.

Leçon 2 sur 413 étapes

Rééchantillonner des séries temporelles est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Pandas & NumPy Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Pandas & NumPy Academy comprend 4 leçons au total.

Qu’est-ce que le rééchantillonnage ?

Le rééchantillonnage modifie la fréquence d’une série temporelle. La réduction de fréquence diminue la fréquence — par exemple, en convertissant des données quotidiennes en totaux mensuels. L’augmentation de fréquence accroît la fréquence — par exemple, en convertissant des données mensuelles en données quotidiennes et en comblant les intervalles avec des valeurs interpolées. Ces deux opérations nécessitent un DatetimeIndex et s’effectuent avec la méthode resample(), la version de Pandas tenant compte du temps pour groupby().

La méthode resample()

df.resample(rule) crée un objet DatetimeIndexResampler, où rule est un alias de décalage de fréquence. Comme avec groupby(), aucun calcul n’est effectué tant que vous n’enchaînez pas une méthode d’agrégation. Règles courantes : 'D' (jour), 'W' (semaine), 'ME' (fin du mois), 'QE' (fin du trimestre) et 'YE' (fin de l’année). Le DataFrame doit avoir un DatetimeIndex.

import pandas as pd
import numpy as np

np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({'sales': np.random.randint(100, 500, 90)}, index=dates)

print(df.head())
print('Shape:', df.shape)  # (90, 1) -- 90 daily rows

Réduire la fréquence : du quotidien au mensuel

Pour réduire la fréquence de données quotidiennes vers une fréquence mensuelle, appelez resample('ME') et enchaînez une agrégation. sum() fournit les totaux mensuels ; mean() fournit les moyennes mensuelles ; last() fournit la dernière valeur de chaque période. Le résultat contient une ligne par période, la date de fin de période servant d’étiquette d’index.

# Monthly totals
monthly_sum = df.resample('ME').sum()
print(monthly_sum)
# sales
# 2024-01-31    9876
# 2024-02-29    8765
# 2024-03-31    9234

# Monthly averages
monthly_mean = df.resample('ME').mean().round(1)
print(monthly_mean)

Réduire la fréquence à la semaine

Effectuez un rééchantillonnage avec 'W' pour agréger par semaine calendaire se terminant le dimanche. Utilisez 'W-MON' si vous souhaitez des semaines se terminant le lundi. Pandas regroupe toutes les dates de chaque semaine et applique l’agrégation. Cette méthode est utile pour les rapports hebdomadaires qui nécessitent une ligne récapitulative par semaine.

# Weekly sum
weekly = df.resample('W').sum()
print(weekly.head())
# sales
# 2024-01-07    2010  <- Jan 1-7
# 2024-01-14    2340  <- Jan 8-14
# ...

# Weekly max and count using agg()
weekly_stats = df.resample('W').agg(['sum', 'mean', 'max'])
print(weekly_stats.head())

Appliquer plusieurs agrégations

Tout comme avec groupby(), vous pouvez enchaîner .agg() sur un rééchantillonneur pour calculer plusieurs statistiques en une seule passe. Transmettez une liste de noms de fonctions ou un dictionnaire pour effectuer des agrégations nommées. C’est la manière la plus efficace de créer un tableau récapitulatif complet d’une série temporelle.

monthly_stats = df.resample('ME').agg(
    total_sales=('sales', 'sum'),
    avg_sales=('sales', 'mean'),
    peak_sales=('sales', 'max'),
    days_counted=('sales', 'count')
)
print(monthly_stats.round(1))
#             total_sales  avg_sales  peak_sales  days_counted
# 2024-01-31         9876      318.6         499            31

Rééchantillonnage OHLC pour les données financières

Pour les séries temporelles financières, la méthode .ohlc() rééchantillonne les données afin d’obtenir les valeurs Open, High, Low et Close (OHLC) pour chaque période — la représentation standard en chandeliers. Cela n’a de sens que pour des données numériques représentant un prix ou un niveau. Chaque colonne de l’entrée produit quatre colonnes OHLC dans le résultat.

# OHLC monthly resampling
ohlc = df['sales'].resample('ME').ohlc()
print(ohlc)
#             open  high   low  close
# 2024-01-31   365   499   101    243
# 2024-02-29   ...

Augmenter la fréquence : du mensuel au quotidien

L’augmentation de fréquence accroît la fréquence, ce qui crée des lignes pour des horodatages qui n’existaient pas dans les données d’origine. Ces nouvelles lignes contiennent initialement NaN. Vous devez ensuite les remplir avec une méthode adaptée à vos données : ffill() (propagation vers l’avant — reporter la dernière valeur connue) ou bfill() (propagation vers l’arrière — utiliser la prochaine valeur connue), ou encore interpolate() pour une interpolation progressive.

# Monthly data
monthly = pd.Series(
    [100, 120, 115],
    index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
print(monthly)

# Upsample to daily (creates NaN rows)
daily = monthly.resample('D').asfreq()
print(daily.head(10))
# 2024-01-31    100.0
# 2024-02-01      NaN  <- new row
# ...

Combler les intervalles après une augmentation de fréquence

Après une augmentation de fréquence, comblez les intervalles NaN créés pour les nouveaux horodatages. ffill() propage la dernière valeur connue jusqu’à l’observation réelle suivante — ce qui convient aux prix lorsque le dernier prix négocié reste valide. interpolate(method='linear') remplit les intervalles avec des valeurs régulièrement espacées entre les observations — ce qui convient aux variables continues et progressives.

# Forward fill: carry monthly value forward to every day
daily_ffill = monthly.resample('D').ffill()
print(daily_ffill.head(35))
# 2024-01-31    100
# 2024-02-01    100  <- forward filled
# ...
# 2024-02-29    120  <- new month value

# Linear interpolation
daily_interp = monthly.resample('D').interpolate(method='linear')
print(daily_interp.head(10))

Rééchantillonner au sein de groupes

Vous pouvez combiner groupby() et resample() pour rééchantillonner séparément chaque groupe. Appelez groupby(column).resample(rule) sur un DataFrame doté d’un DatetimeIndex. Cela produit un résultat avec un MultiIndex, dont le niveau externe est la clé du groupe et le niveau interne la période temporelle rééchantillonnée — ce qui est très utile pour l’analyse de séries temporelles par produit ou par région.

df2 = pd.DataFrame({
    'product': ['A', 'B', 'A', 'B', 'A', 'B'],
    'sales': [100, 150, 120, 130, 110, 160]
}, index=pd.date_range('2024-01-01', periods=6, freq='ME'))

# Monthly sum per product
result = df2.groupby('product').resample('QE').sum()
print(result)

Définir des ancrages de décalage personnalisés

Par défaut, 'ME' s’ancre sur les dates de fin des mois calendaires. Pour les périodes financières non standard, utilisez des décalages comme 'QS-APR' (trimestre commençant en avril) ou 'YS-OCT' (année commençant en octobre). Pandas prend en charge de nombreux alias de décalage ancrés. Consultez la documentation de Pandas pour obtenir la liste complète lorsque vous travaillez avec des périodes financières non calendaires.

# Fiscal year starting in April
fiscal_annual = df.resample('YE-MAR').sum()
print(fiscal_annual)
# sales
# 2024-03-31    XXXX  <- April 2023 to March 2024

# Quarter starting in April
fiscal_q = df.resample('QE-MAR').mean().round(0)
print(fiscal_q)

Vérifier l’intégrité du résultat rééchantillonné

Après un rééchantillonnage, vérifiez toujours que le résultat est cohérent. Vérifiez que le nombre de périodes produites correspond aux attentes, qu’aucune période ne manque (cherchez les NaN dans le résultat) et que la somme des totaux mensuels est égale à la somme des données quotidiennes d’origine lorsque vous réduisez la fréquence avec sum(). Ces contrôles de cohérence permettent de détecter les erreurs de décalage d’une unité dans les chaînes de fréquence et les plages de dates incomplètes.

monthly = df.resample('ME').sum()

# Verify: monthly totals should sum to daily total
assert monthly['sales'].sum() == df['sales'].sum(), 'Sum mismatch!'

# Verify: expected number of months
print('Months:', len(monthly))  # should be 3 for 90 days Jan-Mar

# Check for any NaN
print('NaN count:', monthly.isna().sum().sum())

Vérification rapide

Testez votre compréhension du rééchantillonnage des séries temporelles présenté dans cette leçon.

Récapitulatif de la leçon

Dans cette leçon, vous avez appris que resample() est l’équivalent de groupby() tenant compte du temps pour modifier la fréquence d’une série temporelle ; que la réduction de fréquence agrège les données (du quotidien au mensuel avec sum/mean) ; que l’augmentation de fréquence crée de nouveaux horodatages qui doivent être remplis avec ffill() ou interpolate() ; et que vous pouvez combiner groupby() et resample() pour agréger les données temporelles par groupe. Nous allons maintenant découvrir les décalages et les variables retardées.

Gratuit pour commencer

Apprends Python avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
30
Leçons
120

Questions Fréquemment Posées

La leçon « Rééchantillonner des séries temporelles » est-elle gratuite ?

Oui — le texte complet de « Rééchantillonner des séries temporelles » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Pandas & NumPy Academy, passe à CoddyKit PRO. Le cours Pandas & NumPy Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Rééchantillonner des séries temporelles » ?

Réduisez la fréquence de données quotidiennes à mensuelle avec resample('ME').sum() et augmentez-la avec un remplissage vers l’avant pour compléter les intervalles manquants. Tu pratiques Pandas & NumPy Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Pandas & NumPy Academy ?

Aucune expérience préalable n'est requise. Pandas & NumPy Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Rééchantillonner des séries temporelles » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Pandas & NumPy Academy ?

Oui. Chaque leçon Pandas & NumPy Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. DatetimeIndex et intervalles de périodes
  2. Rééchantillonner des séries temporelles
  3. Décalages et variables retardées
  4. Extraire des caractéristiques temporelles
← Retour à Pandas & NumPy Academy