Curso
Uma série temporal é uma coleção de observações de dados indexadas por tempo em ordem cronológica. Essas observações de dados são normalmente (mas não necessariamente) registradas em intervalos de tempo regulares. As séries temporais são usadas com frequência em bancos, comércio, marketing, ciências e outros setores. A representação visual mais comum dos dados de séries temporais é um gráfico de linhas em que o tempo é colocado no eixo x e o valor medido, no eixo y.
Neste tutorial, exploraremos como criar e personalizar gráficos de linha de séries temporais no matplotlib, uma biblioteca de plotagem principal do Python.
Primeiros passos com a plotagem de séries temporais do matplotlib
Importação de bibliotecas e carregamento de dados
Primeiro, importaremos as bibliotecas Python necessárias e carregaremos os dados - um conjunto de dados do Kaggle Daily Exchange Rates per Euro 1999-2023. Também realizaremos uma limpeza básica dos dados:
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()}')
Saída:
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
Conversão de strings de data/hora em objetos de data/hora
Para trabalhar de forma eficiente com séries temporais, precisamos converter strings de data ou hora em objetos datetime usando a função pandas.to_datetime
:
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dtypes)
Saída:
datetime64[ns]
Se precisar de uma atualização sobre como trabalhar com séries temporais em Python, você pode achar útil o curso Manipulating Time Series Data in Python.
Definição de uma coluna datetime como um índice de dataframe
Agora, vamos definir a coluna Date
como um índice de dataframe usando o método set_index:
df = df.set_index('Date')
print(df.head(3))
Saída:
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
Criação de um gráfico básico de série temporal de linha única no matplotlib
Para criar um gráfico de linha de série temporal básica, usamos o método padrão matplotlib.pyplot.plot(x, y)
:
plt.plot(df.index, df['CAD'])
Saída:
Criação de um gráfico de série temporal matplotlib de várias linhas
Para criar um gráfico de série temporal com várias linhas, basta executar o método matplotlib.pyplot.plot(x, y)
o número necessário de vezes:
plt.plot(df.index, df['CAD'])
plt.plot(df.index, df['NZD'])
plt.plot(df.index, df['USD'])
O uso do loop for otimiza o código acima:
for col in ['CAD', 'NZD', 'USD']:
plt.plot(df.index, df[col])
Saída:
Personalização de gráficos de séries temporais do matplotlib
Para tornar nosso gráfico de linha de série temporal mais legível e atraente, precisamos personalizá-lo. Podemos aplicar a ele alguns ajustes comuns do matplotlib, como personalizar o tamanho da figura, adicionar e personalizar um título de gráfico e rótulos de eixo, modificar as propriedades da linha, adicionar e personalizar marcadores etc. Outros ajustes são específicos dos gráficos de linha de séries temporais, como a personalização dos ticks do eixo temporal e seus rótulos ou o destaque de determinados períodos de tempo.
Personalização da figura e dos eixos
Usando os métodos padrão do matplotlib, podemos personalizar a figura e os eixos de um gráfico de linha de série temporal de várias maneiras, conforme descrito nos comentários do código abaixo:
# 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'))
Saída:
Personalização das propriedades da linha
Assim como nos gráficos de linha comuns, é possível alterar as propriedades da linha de um gráfico de linha de série temporal, como a cor, o estilo ou a largura da linha:
plt.plot(df.index, df['CAD'], color='green', linestyle='dashed', linewidth=3)
Saída:
Adição e personalização de marcadores
Como em qualquer gráfico de linha, podemos colocar marcadores em um gráfico de linha de série temporal e personalizar seu símbolo, cor, cor da borda e tamanho:
plt.plot(df.index, df['CAD'], marker='o', markerfacecolor='yellow', markeredgecolor='red', markersize=8)
Personalização dos ticks do eixo do tempo
Vamos primeiro criar um gráfico de linha de série temporal básico do matplotlib com algumas personalizações essenciais:
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())
Saída:
Vemos que, por padrão, o matplotlib exibe alguns ticks aleatórios, juntamente com seus rótulos. No entanto, talvez queiramos ter controle sobre quais ticks são exibidos no eixo do tempo. Nesse caso, precisamos fornecer uma lista das datas (ou horas) necessárias como cadeias de caracteres ou carimbos de data/hora do pandas para o 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)
Saída:
Acima, o matplotlib mostrou os ticks selecionados e os rotulou automaticamente.
Se quisermos exibir todos ticks, devemos fornecer uma lista dos índices da série temporal para o 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)
Saída:
Personalização dos rótulos de marcação do eixo do tempo
Os rótulos dos ticks do eixo de tempo no gráfico de linhas acima podem parecer exagerados. Talvez queiramos formatá-los para torná-los mais legíveis. Para isso, podemos usar a classe matplotlib.dates.DateFormatter
passando para ela uma string de formato strftime que reflete como gostaríamos de ver as datas/horas. Em seguida, fornecemos esse formatador para o 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'))
Saída:
Esta página de documentação fornece uma lista exaustiva de todos os códigos de formato strftime possíveis.
Destaque de determinados períodos de tempo
Às vezes, podemos querer sombrear determinados períodos de tempo em um gráfico de linha de série temporal. Para isso, podemos usar o método matplotlib.pyplot.axvspan
. Ele recebe dois argumentos obrigatórios: os pontos de tempo inicial e final de um período de interesse em um formato de data e hora. O método também pode receber alguns parâmetros opcionais para personalizar a aparência de uma área destacada, como cor, cor da borda, transparência, largura da linha ou padrão de preenchimento.
Vamos aplicar essa técnica ao gráfico da seção 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)
Saída:
Salvando um gráfico de linha de série temporal do matplotlib em um arquivo
Podemos optar por salvar um gráfico de linha de série temporal em um arquivo de imagem em vez de apenas exibi-lo. Para isso, usamos o método matplotlib.pyplot.savefig passando o nome do arquivo. Por exemplo, vamos voltar ao nosso primeiro gráfico básico:
plt.plot(df.index, df['CAD'])
# Saving the resulting plot to a file
plt.savefig('time series line plot.png')
Acima, salvamos o gráfico em um arquivo chamado time series line plot.png e localizado no mesmo local do nosso programa atual.
Conclusão
Em resumo, neste tutorial, discutimos como criar e personalizar gráficos de linha de séries temporais no matplotlib, usando métodos comuns do matplotlib e outros mais avançados, específicos apenas para visualizações de séries temporais.
Depois de aprender essas técnicas fundamentais, talvez você queira se aprofundar no trabalho com dados de séries temporais e visualizá-los em Python. Nesse caso, considere explorar os seguintes recursos abrangentes, amigáveis para iniciantes e completos: