La teva primera sèrie temporal en Python
El capítol anterior t’ha explicat què és una sèrie temporal. Ara tocaràs codi de debò. No necessites un dataset enorme ni una base de dades: amb un fitxer CSV i dues llibreries tens suficient per començar a veure patrons en el temps.
Aquest subcapítol és pràctic. En finalitzar hauràs instal·lat l’entorn, carregat dades reals i generat la teva primera visualització.
Instal·la l’imprescindible
Necessites tres eines: pandas per manipular dades, matplotlib per graficar i seaborn si vols estils més politits (opcional però recomanable).
python -m venv venv
source venv/bin/activate # en Windows: venv\Scripts\activate
pip install pandas matplotlib seaborn
Si uses Jupyter Notebook o Google Colab, pots saltar-te la creació de l’entorn virtual. A Colab aquestes llibreries ja venen instal·lades.
Carrega un CSV amb data
Imagina que tens un fitxer vendes.csv amb dues columnes: data i vendes.
data,vendes
2024-01-01,120
2024-01-02,135
2024-01-03,118
2024-01-04,142
2024-01-05,156
L’objectiu és convertir la columna data en l’índex temporal del DataFrame.
import pandas as pd
# Carreguem el CSV i parsegem la data
df = pd.read_csv('vendes.csv', parse_dates=['data'], index_col='data')
# Ordenem per data (per si el CSV no ho està)
df = df.sort_index()
print(df.head())
Si tot va bé, veuràs alguna cosa així:
vendes
data
2024-01-01 120
2024-01-02 135
2024-01-03 118
2024-01-04 142
2024-01-05 156
Fixa’t que data ara és l’índex del DataFrame, no una columna més. Aquest és el pas més important.
Dibuixa la teva primera sèrie
Amb matplotlib pots graficar la sèrie en tres línies.
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
plt.plot(df.index, df['vendes'], color='#1a1a1a', linewidth=2)
plt.title('Vendes diàries')
plt.xlabel('Data')
plt.ylabel('Vendes')
plt.grid(True, alpha=0.3)
plt.show()
No busquis perfecció visual en aquest punt. L’important és veure la línia en el temps: ¿puja? ¿baixa? ¿té pics regulars?
Si no tens un CSV a mà
Pots generar dades sintètiques en el mateix script per practicar:
import numpy as np
dates = pd.date_range(start='2024-01-01', periods=60, freq='D')
vendes = 100 + np.cumsum(np.random.randn(60) * 5)
df = pd.DataFrame({'vendes': vendes}, index=dates)
Això crea 60 dies de dades amb una tendència lleu i soroll aleatori. És suficient per practicar tot el que veuràs en els propers capítols.
Exemple amb dades públiques: passatgers aeris
Si no tens un CSV propi, pots practicar amb el clàssic dataset de passatgers aeris de Seaborn. És una sèrie mensual amb tendència i estacionalitat clares.
import seaborn as sns
# Carreguem el dataset de passatgers aeris
flights = sns.load_dataset("flights")
flights['month'] = pd.to_datetime(flights['month'], format='%b')
flights['data'] = flights['year'].astype(str) + '-' + flights['month'].dt.month.astype(str) + '-01'
flights['data'] = pd.to_datetime(flights['data'])
flights = flights.set_index('data').sort_index()
plt.figure(figsize=(10, 5))
plt.plot(flights['passengers'], color='#1a1a1a', linewidth=2)
plt.title('Passatgers aeris mensuals (1949-1960)')
plt.xlabel('Data')
plt.ylabel('Passatgers')
plt.grid(True, alpha=0.3)
plt.show()
Aquest dataset és perfecte per practicar perquè té tot el que veuràs en els propers capítols: tendència alcista, estacionalitat anual i variància creixent.
Agregacions ràpides per mes i any
Un cop tens un índex temporal, resumir per períodes és trivial:
# Mitjana anual de passatgers
mitjana_anual = flights['passengers'].resample('YE').mean()
print(mitjana_anual.head())
# Mes amb més passatgers de cada any
maxim_anual = flights['passengers'].resample('YE').max()
print(maxim_anual.head())
# Comparar gener de cada any
geners = flights[flights.index.month == 1]['passengers']
print(geners.head())
Aquestes operacions són útils per validar intuïcions: ¿creix cada any? ¿gener sempre és un mes baix? ¿Quin va ser el millor any?
Guarda la teva primera figura
Per no haver de regenerar la gràfica cada vegada, pots guardar-la directament:
plt.figure(figsize=(10, 5))
plt.plot(flights['passengers'], color='#1a1a1a', linewidth=2)
plt.title('Passatgers aeris mensuals')
plt.xlabel('Data')
plt.ylabel('Passatgers')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('passatgers_aeris.png', dpi=150)
plt.show()
Tip: usa
tight_layout()abans de guardar per evitar que els títols o etiquetes es tallin.
Resum
En aquest subcapítol has instal·lat l’entorn bàsic, carregat un CSV amb una columna de data i dibuixat la teva primera sèrie temporal. El següent pas és aprendre a detectar si aquesta sèrie és estacionària, perquè d’això depèn quin model li pots aplicar.