Saltar al contenido

# series-de-tiempo-con-python

Series de Tiempo con Python

Volver a la portada del curso
Lectura (Markdown)

Tipos de Series de Tiempo

Sección 1 · Introducción a Series de Tiempo

Tipos de series de tiempo

Una serie de tiempo es una lista de observaciones ordenadas por fecha. Hasta ahí todas se parecen. Pero los pedidos diarios de PyShop y el CO2 de Mauna Loa no se tratan igual: uno se suma y el otro se promedia, uno tiene huecos y el otro no, en uno la estacionalidad crece con el nivel y en el otro se mantiene fija. Reconocer el tipo de serie antes de escribir código evita errores que no producen ningún mensaje de error, solo números equivocados.

Univariadas y multivariadas

Una serie univariada registra una sola variable en el tiempo: los pedidos diarios de PyShop, con índice fecha y una columna pedidos. Una multivariada registra varias variables con el mismo índice: pedidos, visitas al sitio y gasto en publicidad, día por día. En este curso se trabaja con series univariadas; los modelos que se ven (Holt-Winters, SARIMA) pronostican una variable a partir de su propia historia.

Regulares e irregulares

Una serie regular tiene una observación cada intervalo fijo: cada día, cada mes. Una irregular tiene huecos o fechas sin patrón, como las transacciones de una tarjeta. La serie de PyShop debería ser regular, pero tiene 1443 filas entre 2022-01-01 y 2025-12-31, cuando esos cuatro años suman 1461 días: faltan 18 días por caídas del sistema. pandas lo detecta: pd.infer_freq(s.index) devuelve None porque no encuentra una frecuencia constante. Después de s.asfreq("D") la frecuencia queda en diaria y los 18 días aparecen como NaN, listos para interpolarse. El CO2 semanal de statsmodels también trae huecos (59 semanas sin medición de 2284); cargar_co2() lo pasa a mensual y los interpola.

Conteos y mediciones continuas

Los pedidos son conteos: números enteros, nunca negativos. El CO2 es una medición continua en partes por millón (ppm), con decimales. La diferencia importa al final del curso: un conteo con muchos ceros vuelve inútil al MAPE, que divide entre el valor real. En PyShop el mínimo diario es 119 pedidos, así que no hay ese problema.

Flujo y stock: sumar o promediar

Esta es la distinción que más se usa en pandas. Una variable de flujo se acumula durante el periodo: los pedidos de un mes son la suma de los pedidos de cada día. Una variable de stock describe un estado en un instante: el CO2 de un año no es la suma de sus meses, es su nivel típico. Al cambiar de frecuencia con resample, el flujo se agrega con .sum() y el stock con .mean().

pedidos = generar_pedidos().asfreq("D").interpolate()   # flujo
co2 = cargar_co2()                                      # stock

print(round(pedidos.resample("YS").sum().iloc[-1]))     # 90418
print(round(pedidos.resample("YS").mean().iloc[-1], 1)) # 247.7
print(round(co2.resample("YS").mean().iloc[-1], 2))     # 370.85
print(round(co2.resample("YS").sum().iloc[-1], 1))      # 4450.2

PyShop recibió 90,418 pedidos en 2025, un promedio de 247.7 por día; ambas cifras tienen sentido. El CO2 promedio de 2001 fue 370.85 ppm. En cambio, 4450.2 ppm es la suma de doce lecturas mensuales y no describe nada real: el código corre sin error, pero el número no significa nada.

Estacionarias y no estacionarias

Una serie es estacionaria, en términos intuitivos, cuando su nivel y su variabilidad no cambian con el tiempo: fluctúa alrededor del mismo valor. Ninguna de las dos series del curso lo es. Los pedidos promedian 181.8 por día en 2022 y 247.7 en 2025; el CO2 sube de 316.0 ppm en 1959 a 370.85 en 2001. Muchos modelos, como ARIMA, suponen estacionariedad, y por eso se diferencia la serie (restar a cada valor el anterior) antes de ajustarlos. En la sección de análisis verás cómo comprobarlo con la prueba ADF.

Aditivas y multiplicativas

Si la serie tiene estacionalidad, la pregunta es cómo se combina con la tendencia. En una serie aditiva, el efecto estacional es una cantidad fija: $y_t = T_t + S_t + R_t$. En una multiplicativa es un porcentaje del nivel: $y_t = T_t \times S_t \times R_t$. La prueba práctica es comparar el pico de cada año con su promedio mensual:

AñoNoviembreMedia mensualDiferenciaCociente
20227,7495,529+2,2201.40
20237,6865,552+2,1331.38
20248,9966,361+2,6351.41
202510,8667,535+3,3311.44

La diferencia crece con el negocio (de +2,220 a +3,331 pedidos), pero el cociente se mantiene cerca de 1.4: noviembre, con el pico del Buen Fin (en estos datos sintéticos, 5 días a mediados de mes), vende alrededor de 40 % más que un mes promedio. Eso es multiplicativo. El CO2 se comporta al revés: la distancia entre el máximo y el mínimo de cada año es 6.08 ppm en 1960 y 5.11 ppm en 2000, aunque el nivel subió más de 50 ppm. Su estacionalidad es aditiva.

Trampas comunes

  • Promediar un flujo o sumar un stock. pandas no avisa; el resultado simplemente no significa nada.
  • Suponer que la serie es regular. Revisa len(s) contra el número de días del periodo antes de calcular medias móviles o desfases.
  • Interpretar huecos como ceros. Un día sin registro no es un día sin pedidos; se interpola, no se rellena con 0.
  • Elegir aditivo por costumbre. Compara diferencias y cocientes del pico por año; la tabla de arriba toma un minuto.

Antes de modelar, responde cuatro preguntas sobre la serie: ¿flujo o stock?, ¿tiene huecos?, ¿el nivel cambia?, ¿la estacionalidad crece con el nivel? Para PyShop las respuestas son flujo, sí, sí y sí; para el CO2, stock, sí (en la versión semanal), sí y no.