Tu primera serie temporal en Python
El capítulo anterior te explicó qué es una serie temporal. Ahora vas a tocar código de verdad. No necesitas un dataset enorme ni una base de datos: con un archivo CSV y dos librerías tienes suficiente para empezar a ver patrones en el tiempo.
Este subcapítulo es práctico. Al finalizar habrás instalado el entorno, cargado datos reales y generado tu primera visualización.
Instala lo imprescindible
Necesitas tres herramientas: pandas para manipular datos, matplotlib para graficar y seaborn si quieres estilos más pulidos (opcional pero recomendable).
python -m venv venv
source venv/bin/activate # en Windows: venv\Scripts\activate
pip install pandas matplotlib seaborn
Si usas Jupyter Notebook o Google Colab, puedes saltarte la creación del entorno virtual. En Colab estas librerías ya vienen instaladas.
Carga un CSV con fecha
Imagina que tienes un archivo ventas.csv con dos columnas: fecha y ventas.
fecha,ventas
2024-01-01,120
2024-01-02,135
2024-01-03,118
2024-01-04,142
2024-01-05,156
El objetivo es convertir la columna fecha en el índice temporal del DataFrame.
import pandas as pd
# Cargamos el CSV y parseamos la fecha
df = pd.read_csv('ventas.csv', parse_dates=['fecha'], index_col='fecha')
# Ordenamos por fecha (por si el CSV no lo está)
df = df.sort_index()
print(df.head())
Si todo va bien, verás algo como esto:
ventas
fecha
2024-01-01 120
2024-01-02 135
2024-01-03 118
2024-01-04 142
2024-01-05 156
Fíjate en que fecha ahora es el índice del DataFrame, no una columna más. Ese es el paso más importante.
Dibuja tu primera serie
Con matplotlib puedes graficar la serie en tres líneas.
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
plt.plot(df.index, df['ventas'], color='#1a1a1a', linewidth=2)
plt.title('Ventas diarias')
plt.xlabel('Fecha')
plt.ylabel('Ventas')
plt.grid(True, alpha=0.3)
plt.show()
No busques perfección visual en este punto. Lo importante es ver la línea en el tiempo: ¿sube? ¿baja? ¿tiene picos regulares?
Si no tienes un CSV a mano
Puedes generar datos sintéticos en el mismo script para practicar:
import numpy as np
fechas = pd.date_range(start='2024-01-01', periods=60, freq='D')
ventas = 100 + np.cumsum(np.random.randn(60) * 5)
df = pd.DataFrame({'ventas': ventas}, index=fechas)
Esto crea 60 días de datos con una tendencia leve y ruido aleatorio. Es suficiente para practicar todo lo que verás en los próximos capítulos.
Ejemplo con datos públicos: pasajeros aéreos
Si no tienes un CSV propio, puedes practicar con el clásico dataset de pasajeros aéreos de Seaborn. Es una serie mensual con tendencia y estacionalidad claras.
import seaborn as sns
# Cargamos el dataset de pasajeros aéreos
flights = sns.load_dataset("flights")
flights['month'] = pd.to_datetime(flights['month'], format='%b')
flights['fecha'] = flights['year'].astype(str) + '-' + flights['month'].dt.month.astype(str) + '-01'
flights['fecha'] = pd.to_datetime(flights['fecha'])
flights = flights.set_index('fecha').sort_index()
plt.figure(figsize=(10, 5))
plt.plot(flights['passengers'], color='#1a1a1a', linewidth=2)
plt.title('Pasajeros aéreos mensuales (1949-1960)')
plt.xlabel('Fecha')
plt.ylabel('Pasajeros')
plt.grid(True, alpha=0.3)
plt.show()
Este dataset es perfecto para practicar porque tiene todo lo que verás en los próximos capítulos: tendencia alcista, estacionalidad anual y varianza creciente.
Agregaciones rápidas por mes y año
Una vez que tienes un índice temporal, resumir por periodos es trivial:
# Media anual de pasajeros
media_anual = flights['passengers'].resample('YE').mean()
print(media_anual.head())
# Mes con más pasajeros de cada año
maximo_anual = flights['passengers'].resample('YE').max()
print(maximo_anual.head())
# Comparar enero de cada año
eneros = flights[flights.index.month == 1]['passengers']
print(eneros.head())
Estas operaciones son útiles para validar intuiciones: ¿crece cada año? ¿enero siempre es un mes bajo? ¿cuál fue el mejor año?
Guarda tu primera figura
Para no tener que regenerar la gráfica cada vez, puedes guardarla directamente:
plt.figure(figsize=(10, 5))
plt.plot(flights['passengers'], color='#1a1a1a', linewidth=2)
plt.title('Pasajeros aéreos mensuales')
plt.xlabel('Fecha')
plt.ylabel('Pasajeros')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('pasajeros_aereos.png', dpi=150)
plt.show()
Tip: usa
tight_layout()antes de guardar para evitar que los títulos o etiquetas se corten.
Resumen
En este subcapítulo has instalado el entorno básico, cargado un CSV con una columna de fecha y dibujado tu primera serie temporal. El siguiente paso es aprender a detectar si esa serie es estacionaria, porque de eso depende qué modelo puedes aplicarle.