Formatador de Ticks Personalizado para Séries Temporais

Beginner

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

Introdução

Ao plotar dados diários, como séries temporais financeiras, muitas vezes se deseja omitir os dias em que não há dados, como fins de semana. Isso permite que os dados sejam plotados em intervalos regulares, sem espaços extras para os dias sem dados. Neste laboratório, aprenderemos como usar um 'index formatter' (formatador de índice) para obter o gráfico desejado.

Dicas da VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar Bibliotecas e Dados Necessários

Primeiramente, precisamos importar as bibliotecas necessárias, que são matplotlib, numpy e matplotlib.cbook. Também precisamos carregar um array de registro numpy a partir de dados CSV do Yahoo com os campos date (data), open (abertura), high (máxima), low (mínima), close (fechamento), volume, adj_close (fechamento ajustado) do diretório mpl-data/sample_data. O array de registro armazena a data como um np.datetime64 com uma unidade de dia ('D') na coluna de data. Usaremos esses dados para plotar a série temporal financeira.

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

## Load data from sample_data directory
r = cbook.get_sample_data('goog.npz')['price_data'].view(np.recarray)
r = r[:9]  ## get the first 9 days

Plotando Dados com Lacunas Padrão nos Fins de Semana

Primeiramente, plotaremos os dados com as lacunas padrão nos fins de semana usando a função plot em matplotlib. Também destacaremos as lacunas nos dados diários usando linhas tracejadas brancas.

## Plot data with gaps on weekends
fig, ax1 = plt.subplots(figsize=(6, 3))
ax1.plot(r.date, r.adj_close, 'o-')

## Highlight gaps in daily data
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='Gaps in daily data')])

ax1.set_title("Plotando Dados com Lacunas Padrão nos Fins de Semana")
ax1.xaxis.set_major_locator(DayLocator())
ax1.xaxis.set_major_formatter(DateFormatter('%a'))

Criando um Formatador de Índice Personalizado

Para plotar os dados em relação a um índice que vai de 0, 1, ... len(data), criaremos um formatador de índice personalizado. Este formatador formatará as marcas de escala (tick marks) como horários em vez de inteiros.

## Create custom index formatter
fig, ax2 = plt.subplots(figsize=(6, 3))
ax2.plot(r.adj_close, 'o-')

## Format x-axis as times
def format_date(x, _):
    try:
        ## convert datetime64 to datetime, and use datetime's strftime:
        return r.date[round(x)].item().strftime('%a')
    except IndexError:
        pass

ax2.set_title("Creating Custom Index Formatter")
ax2.xaxis.set_major_formatter(format_date)  ## internally creates FuncFormatter

Usando um Callable para o Formatador

Em vez de passar uma função para .Axis.set_major_formatter, podemos usar qualquer outro callable, como uma instância de uma classe que implementa __call__. Neste passo, criaremos uma classe MyFormatter que formata as marcas de escala (tick marks) como horários.

## Use a callable for formatter
class MyFormatter(Formatter):
    def __init__(self, dates, fmt='%a'):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        """Return the label for time x at position pos."""
        try:
            return self.dates[round(x)].item().strftime(self.fmt)
        except IndexError:
            pass

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

Exibindo o Gráfico

Agora exibiremos o gráfico usando a função show em matplotlib.

plt.show()

Resumo

Neste laboratório, aprendemos como usar um formatador de índice (index formatter) personalizado para plotar séries temporais financeiras sem lacunas nos fins de semana. Também aprendemos como usar um callable para o formatador em vez de uma função. Ao usar essas técnicas, podemos criar gráficos de dados diários mais atraentes visualmente.