Remuestrear series temporales
Reduzca datos diarios a datos mensuales con resample('ME').sum() y aumente la frecuencia usando un relleno hacia delante para completar los intervalos faltantes.
Remuestrear series temporales es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué es el remuestreo?
El remuestreo cambia la frecuencia de una serie temporal. El submuestreo reduce la frecuencia; por ejemplo, convierte datos diarios en totales mensuales. El sobremuestreo aumenta la frecuencia; por ejemplo, convierte datos mensuales en datos diarios y rellena los huecos con valores interpolados. Ambas operaciones requieren un DatetimeIndex y se realizan con el método resample(), la versión de groupby() de Pandas consciente del tiempo.
El método resample()
df.resample(rule) crea un objeto DatetimeIndexResampler, donde rule es un alias de desplazamiento de frecuencia. Al igual que con groupby(), no se calcula nada hasta encadenar un método de agregación. Reglas habituales: 'D' (día), 'W' (semana), 'ME' (fin de mes), 'QE' (fin de trimestre) y 'YE' (fin de año). El DataFrame debe tener 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 rowsSubmuestreo: de diario a mensual
Para aplicar submuestreo a datos diarios y convertirlos en mensuales, llame a resample('ME') y encadene una agregación. sum() proporciona los totales mensuales; mean(), los promedios mensuales; y last(), el último valor de cada periodo. El resultado tiene una fila por periodo, con la fecha de fin del periodo como etiqueta del índice.
# 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)Submuestreo semanal
Use 'W' en el remuestreo para agregar por semana natural, con final en domingo. Use 'W-MON' si desea semanas que terminen en lunes. Pandas agrupa todas las fechas de cada semana y aplica la agregación. Esto resulta útil para informes semanales en los que desea una fila de resumen por semana.
# 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())Aplicar varias agregaciones
Al igual que con groupby(), puede encadenar .agg() a un remuestreador para calcular varias estadísticas en una sola pasada. Pase una lista de nombres de funciones o un diccionario para realizar agregaciones con nombre. Esta es la forma más eficiente de crear una tabla completa de resumen de series temporales.
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 31Remuestreo OHLC para datos financieros
En las series temporales financieras, el método .ohlc() remuestrea los datos para obtener valores de apertura, máximo, mínimo y cierre (OHLC) por periodo, que constituyen la representación estándar de velas japonesas. Esto solo es significativo para datos numéricos que representan un precio o nivel. Cada columna de entrada genera cuatro columnas OHLC en la salida.
# 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 ...Sobremuestreo: de mensual a diario
El sobremuestreo aumenta la frecuencia, lo que crea filas para marcas temporales que no existían en los datos originales. Estas filas nuevas contienen inicialmente NaN. Después debe rellenarlas con un método adecuado para sus datos: ffill() (relleno hacia delante: propaga el último valor conocido) o bfill() (relleno hacia atrás: usa el siguiente valor conocido), o interpolate() para realizar una interpolación suave.
# 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
# ...Rellenar huecos creados por el sobremuestreo
Después del sobremuestreo, rellene los huecos NaN creados para las nuevas marcas temporales. ffill() propaga el último valor conocido hacia delante hasta la siguiente observación real, lo que resulta adecuado para precios cuyo último precio negociado sigue siendo válido. interpolate(method='linear') rellena con valores espaciados linealmente entre las observaciones, lo que resulta adecuado para variables continuas suaves.
# 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))Remuestreo dentro de grupos
Puede combinar groupby() y resample() para remuestrear cada grupo por separado. Llame a groupby(column).resample(rule) en un DataFrame con un DatetimeIndex. Esto produce un resultado con un MultiIndex cuyo nivel exterior es la clave del grupo y cuyo nivel interior es el periodo temporal remuestreado, algo muy útil para analizar series temporales por producto o por región.
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)Anclaje con desplazamientos personalizados
De forma predeterminada, 'ME' se ancla a las fechas de fin de mes del calendario. Para periodos fiscales no estándar, use desplazamientos como 'QS-APR' (trimestre que comienza en abril) o 'YS-OCT' (año que comienza en octubre). Pandas admite muchos alias de desplazamiento anclados. Consulte la documentación de Pandas para obtener la lista completa cuando trabaje con periodos fiscales no naturales.
# 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)Comprobar la integridad del resultado del remuestreo
Después del remuestreo, compruebe siempre que el resultado sea coherente. Verifique que el número de periodos de salida coincida con lo esperado, que no falte ningún periodo (busque valores NaN en la salida) y que la suma de los totales mensuales sea igual a la suma de los datos diarios originales cuando aplique un submuestreo con sum(). Estas comprobaciones de coherencia permiten detectar errores de desfase de una unidad en las cadenas de frecuencia y rangos de fechas incompletos.
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())Comprobación rápida
Compruebe su comprensión del remuestreo de series temporales de esta lección.
Resumen de la lección
En esta lección ha aprendido: que resample() es el equivalente de groupby() consciente del tiempo para cambiar la frecuencia de una serie temporal; que el submuestreo agrega datos (de diarios a mensuales mediante sum/mean); que el sobremuestreo crea nuevas marcas temporales que deben rellenarse con ffill() o interpolate(); y que puede combinar groupby() con resample() para agregar datos temporales por grupo. A continuación, exploraremos el desplazamiento y las variables de desfase.
Aprende Python con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Remuestrear series temporales» es gratis?
Sí — el texto completo de «Remuestrear series temporales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Remuestrear series temporales»?
Reduzca datos diarios a datos mensuales con resample('ME').sum() y aumente la frecuencia usando un relleno hacia delante para completar los intervalos faltantes. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Pandas & NumPy Academy?
No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Remuestrear series temporales»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?
Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- DatetimeIndex y rangos de periodos
- Remuestrear series temporales
- Desplazamientos y variables de retardo
- Extraer variables temporales