Curso
Una serie temporal es una colección de observaciones de datos indexados por tiempo en orden cronológico. Estas observaciones de datos suelen registrarse (aunque no necesariamente) a intervalos de tiempo regulares. Las series temporales se utilizan a menudo en la banca, el comercio, el marketing, la ciencia y otros sectores. La representación visual más típica de los datos de series temporales es un gráfico de líneas en el que el tiempo se sitúa en el eje de abscisas y el valor medido, en el eje de ordenadas.
En este tutorial, exploraremos cómo crear y personalizar gráficos de líneas de series temporales en matplotlib, una biblioteca de gráficos primaria de Python.
Introducción al trazado de series temporales con matplotlib
Importación de bibliotecas y carga de datos
En primer lugar, importaremos las librerías Python necesarias y cargaremos los datos: un conjunto de datos de Kaggle Tipos de cambio diarios por euro 1999-2023. También realizaremos una limpieza básica de los datos:
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
df = pd.read_csv('euro-daily-hist_1999_2022.csv')
df = df.iloc[:, [0, 4, 28, -2]]
df.columns = ['Date', 'CAD', 'NZD', 'USD']
for col in ['CAD', 'NZD', 'USD']:
df = df[df[col] != '-']
df[col] = pd.to_numeric(df[col])
df = df[df['Date'] >= '2022-12-01'].reset_index(drop=True)
print(df.head(3))
print(f'\nThe date range: {df.Date.min()}/{ df.Date.max()}')
Salida:
Date CAD NZD USD
0 2023-01-27 1.4479 1.6759 1.0865
1 2023-01-26 1.4568 1.6799 1.0895
2 2023-01-25 1.4544 1.6792 1.0878
The date range: 2022-12-01/2023-01-27
Conversión de cadenas de fecha/hora en objetos datetime
Para trabajar eficazmente con series temporales, necesitamos convertir cadenas de fecha u hora en objetos datetime utilizando la función pandas.to_datetime
:
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dtypes)
Salida:
datetime64[ns]
Si necesitas un repaso sobre cómo trabajar con series temporales en Python, te puede resultar útil el curso Manipulating Time Series Data in Python.
Establecer una columna de fecha y hora como índice de un marco de datos
Ahora, vamos a establecer la columna Date
como un índice de marco de datos utilizando el método set_index:
df = df.set_index('Date')
print(df.head(3))
Salida:
CAD NZD USD
Date
2023-01-27 1.4479 1.6759 1.0865
2023-01-26 1.4568 1.6799 1.0895
2023-01-25 1.4544 1.6792 1.0878
Creación de un gráfico matplotlib básico de series temporales de una sola línea
Para crear un gráfico lineal básico de series temporales, utilizamos el método estándar matplotlib.pyplot.plot(x, y)
:
plt.plot(df.index, df['CAD'])
Salida:
Creación de un gráfico de series temporales matplotlib de varias líneas
Para crear un gráfico de series temporales de varias líneas, basta con ejecutar el método matplotlib.pyplot.plot(x, y)
el número de veces necesario:
plt.plot(df.index, df['CAD'])
plt.plot(df.index, df['NZD'])
plt.plot(df.index, df['USD'])
El uso del bucle for optimiza el código anterior:
for col in ['CAD', 'NZD', 'USD']:
plt.plot(df.index, df[col])
Salida:
Personalización de los gráficos de series temporales de matplotlib
Para que nuestro gráfico de líneas de series temporales sea más legible y atractivo, tenemos que personalizarlo. Podemos aplicarle algunos ajustes comunes de matplotlib, como personalizar el tamaño de la figura, añadir y personalizar un título para el gráfico y etiquetas para los ejes, modificar las propiedades de las líneas, añadir y personalizar marcadores, etc. Otros ajustes son específicos de los gráficos de líneas de series temporales, como personalizar las marcas de los ejes temporales y sus etiquetas o resaltar determinados periodos de tiempo.
Personalizar la figura y los ejes
Utilizando los métodos estándar de matplotlib, podemos personalizar la figura y los ejes de un gráfico lineal de series temporales de muchas maneras, como se describe en los comentarios de código a continuación:
# Adjusting the figure size
fig = plt.subplots(figsize=(16, 5))
# Creating a plot
plt.plot(df.index, df['CAD'])
# Adding a plot title and customizing its font size
plt.title('EUR-CAD rate', fontsize=20)
# Adding axis labels and customizing their font size
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
# Rotaing axis ticks and customizing their font size
plt.xticks(rotation=30, fontsize=15)
# Changing the plot resolution - zooming in the period from 15.12.2022 till 15.01.2023
plt.xlim(pd.Timestamp('2022-12-15'), pd.Timestamp('2023-01-15'))
Salida:
Personalizar las propiedades de las líneas
Al igual que con los gráficos de líneas comunes, es posible cambiar las propiedades de línea de un gráfico de líneas de series temporales, como el color, el estilo o la anchura de la línea:
plt.plot(df.index, df['CAD'], color='green', linestyle='dashed', linewidth=3)
Salida:
Añadir y personalizar marcadores
Como con cualquier gráfico de líneas, podemos poner marcadores en un gráfico de líneas de series temporales y personalizar su símbolo, color, color de borde y tamaño:
plt.plot(df.index, df['CAD'], marker='o', markerfacecolor='yellow', markeredgecolor='red', markersize=8)
Personalización de los ticks del eje temporal
Primero vamos a crear un gráfico básico de matplotlib de series temporales con algunas personalizaciones esenciales:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
Salida:
Vemos que por defecto matplotlib muestra algunos ticks aleatorios, junto con sus etiquetas. Sin embargo, es posible que queramos controlar qué ticks se muestran en el eje temporal. En este caso, necesitamos proporcionar una lista de las fechas (u horas) necesarias como cadenas o pandas timestamps al método matplotlib.pyplot.xticks
:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying time axis ticks
ticks = ['2022-12-05', '2023-01-02', '2023-01-20']
plt.xticks(ticks)
Salida:
Arriba, matplotlib mostraba las marcas seleccionadas y las etiquetaba automáticamente.
Si queremos mostrar todos los ticks, debemos proporcionar una lista de los índices de las series temporales al método matplotlib.pyplot.xticks
método:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying all time axis ticks
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
Salida:
Personalización de las etiquetas de los ejes temporales
Las etiquetas del eje temporal en el gráfico de líneas anterior pueden parecer abrumadoras. Es posible que queramos formatearlos para hacerlos más legibles. Para ello, podemos utilizar la clase matplotlib.dates.DateFormatter
pasándole una cadena de formato strftime que refleje cómo queremos ver las fechas/horas. A continuación, proporcionamos este formateador al método matplotlib.axis.XAxis.set_major_formatter
:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
# Formatting time axis tick labels
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
Salida:
Esta página de documentación proporciona una lista exhaustiva de todos los posibles códigos de formato strftime.
Resaltar determinados periodos de tiempo
A veces, es posible que queramos sombrear determinados periodos de tiempo en un gráfico de líneas de series temporales. Para ello, podemos utilizar el método matplotlib.pyplot.axvspan
. Requiere dos argumentos: los puntos de inicio y fin de un periodo de interés en formato fecha-hora. El método también puede tomar algunos parámetros opcionales para personalizar la apariencia de un área resaltada, como su color, el color del borde, la transparencia, el ancho de línea o el patrón de relleno.
Apliquemos esta técnica al gráfico de la sección anterior:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
# Highlighting the time period from 15.12.2022 to 1.01.2023 and customizing the shaded area
plt.axvspan(datetime(2022, 12, 15), datetime(2023, 1, 1), facecolor='yellow', alpha=0.5, hatch='/', edgecolor='red', linewidth=5)
Salida:
Guardar un gráfico de series temporales matplotlib en un archivo
Podemos optar por guardar un gráfico de líneas de series temporales en un archivo de imagen en lugar de simplemente visualizarlo. Para ello, utilizamos el método matplotlib.pyplot.savefig pasando el nombre del archivo. Por ejemplo, volvamos a nuestra primera trama básica:
plt.plot(df.index, df['CAD'])
# Saving the resulting plot to a file
plt.savefig('time series line plot.png')
Arriba, guardamos el gráfico en un archivo llamado gráfico de líneas de series temporales.png y ubicado en el mismo lugar que nuestro programa actual.
Conclusión
En resumen, en este tutorial hemos visto cómo crear y personalizar gráficos de líneas de series temporales en matplotlib, utilizando tanto métodos comunes de matplotlib como otros más avanzados, específicos sólo para visualizaciones de series temporales.
Después de aprender estas técnicas fundamentales, es posible que desee profundizar en el trabajo con datos de series temporales y su visualización en Python. En ese caso, considere la posibilidad de explorar los siguientes recursos completos, fáciles de usar para principiantes y de principio a fin: