Formateador personalizado de marcas de graduación para series temporales

Beginner

This tutorial is from open-source community. Access the source code

Introducción

Cuando se traza datos diarios, como series temporales financieras, a menudo se desea omitir los días en los que no hay datos, como los fines de semana. Esto permite trazar los datos a intervalos regulares sin espacios adicionales para los días sin datos. En este laboratorio, aprenderemos a usar un 'formateador de índice' para obtener la representación gráfica deseada.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar las bibliotecas y datos necesarios

En primer lugar, necesitamos importar las bibliotecas necesarias, que son matplotlib, numpy y matplotlib.cbook. También necesitamos cargar una matriz de registros de numpy a partir de datos csv de yahoo con los campos fecha, apertura, alta, baja, cierre, volumen, cierre ajustado desde el directorio mpl-data/sample_data. La matriz de registros almacena la fecha como un np.datetime64 con una unidad de día ('D') en la columna de fecha. Utilizaremos estos datos para trazar la serie temporal financiera.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook

## Cargar datos desde el directorio sample_data
r = cbook.get_sample_data('goog.npz')['price_data'].view(np.recarray)
r = r[:9]  ## obtener los primeros 9 días

Representación gráfica de datos con espacios en blanco predeterminados los fines de semana

En primer lugar, representaremos los datos con los espacios en blanco predeterminados los fines de semana utilizando la función plot de matplotlib. También destacaremos los espacios en blanco en los datos diarios utilizando líneas discontinuas en blanco.

## Representación gráfica de datos con espacios en blanco los fines de semana
fig, ax1 = plt.subplots(figsize=(6, 3))
ax1.plot(r.date, r.adj_close, 'o-')

## Destacar los espacios en blanco en los datos diarios
gaps = np.flatnonzero(np.diff(r.date) > np.timedelta64(1, 'D'))
for gap in r[['date', 'adj_close']][np.stack((gaps, gaps + 1)).T]:
    ax1.plot(gap.date, gap.adj_close, 'w--', lw=2)
ax1.legend(handles=[ml.Line2D([], [], ls='--', label='Espacios en blanco en los datos diarios')])

ax1.set_title("Representación gráfica de datos con espacios en blanco predeterminados los fines de semana")
ax1.xaxis.set_major_locator(DayLocator())
ax1.xaxis.set_major_formatter(DateFormatter('%a'))

Creación de un formateador de índice personalizado

Para representar los datos en función de un índice que va de 0, 1,... len(data), crearemos un formateador de índice personalizado. Este formateador formateará las marcas de graduación como fechas en lugar de enteros.

## Crear formateador de índice personalizado
fig, ax2 = plt.subplots(figsize=(6, 3))
ax2.plot(r.adj_close, 'o-')

## Formatear el eje x como fechas
def format_date(x, _):
    try:
        ## convertir datetime64 a datetime y usar strftime de datetime:
        return r.date[round(x)].item().strftime('%a')
    except IndexError:
        pass

ax2.set_title("Creación de un formateador de índice personalizado")
ax2.xaxis.set_major_formatter(format_date)  ## internamente crea FuncFormatter

Usar un objeto llamable para el formateador

En lugar de pasar una función a .Axis.set_major_formatter, podemos usar cualquier otro objeto llamable, como una instancia de una clase que implemente __call__. En este paso, crearemos una clase MyFormatter que formatea las marcas de graduación como fechas.

## Usar un objeto llamable para el formateador
class MyFormatter(Formatter):
    def __init__(self, dates, fmt='%a'):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        """Devuelve la etiqueta para el tiempo x en la posición pos."""
        try:
            return self.dates[round(x)].item().strftime(self.fmt)
        except IndexError:
            pass

ax2.xaxis.set_major_formatter(MyFormatter(r.date, '%a'))

Mostrar la gráfica

Ahora mostraremos la gráfica utilizando la función show de matplotlib.

plt.show()

Resumen

En este laboratorio, aprendimos cómo utilizar un formateador de índice personalizado para representar series temporales financieras sin espacios en blanco los fines de semana. También aprendimos cómo utilizar un objeto llamable para el formateador en lugar de una función. Al utilizar estas técnicas, podemos crear gráficas de datos diarios más atractivas visualmente.