Histograma de Séries Temporais com Matplotlib

Beginner

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

Introdução

Este laboratório demonstra como visualizar eficientemente um grande número de séries temporais de forma a potencialmente revelar subestruturas e padrões ocultos que não são imediatamente óbvios, exibindo-os de maneira visualmente atraente.

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 Necessárias

Nesta etapa, importaremos as bibliotecas necessárias para este laboratório.

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

Gerar Dados

Nesta etapa, geraremos múltiplas séries "sinal" sinusoidais que estão enterradas sob um número maior de séries "ruído/fundo" de caminhada aleatória. Geraremos caminhadas aleatórias gaussianas não enviesadas e sinais sinusoidais.

## Fix random state for reproducibility
np.random.seed(19680801)

## Make some data; a 1D random walk + small fraction of sine waves
num_series = 1000
num_points = 100
SNR = 0.10  ## Signal to Noise Ratio
x = np.linspace(0, 4 * np.pi, num_points)

## Generate unbiased Gaussian random walks
Y = np.cumsum(np.random.randn(num_series, num_points), axis=-1)

## Generate sinusoidal signals
num_signal = round(SNR * num_series)
phi = (np.pi / 8) * np.random.randn(num_signal, 1)  ## small random offset
Y[-num_signal:] = (
    np.sqrt(np.arange(num_points))  ## random walk RMS scaling factor
    * (np.sin(x - phi)
       + 0.05 * np.random.randn(num_signal, num_points))  ## small random noise
)

Visualizar Dados com Gráfico de Linha

Nesta etapa, visualizaremos os dados gerados com um gráfico de linha.

## Plot series using `plot` and a small value of `alpha`.
## With this view, it is very difficult to observe the sinusoidal behavior because of how many overlapping series there are.
## It also takes a bit of time to run because so many individual artists need to be generated.
tic = time.time()
plt.plot(x, Y.T, color="C0", alpha=0.1)
toc = time.time()
plt.title("Line plot with alpha")
plt.show()
print(f"{toc-tic:.3f} sec. elapsed")

Visualizar Dados com Histograma 2D - Escala de Cores Logarítmica

Nesta etapa, converteremos as múltiplas séries temporais em um histograma. Não apenas o sinal oculto será mais visível, mas também é um procedimento muito mais rápido. Plotaremos pontos (x, y) em um histograma 2D com uma escala de cores logarítmica.

tic = time.time()

## Linearly interpolate between the points in each time series
num_fine = 800
x_fine = np.linspace(x.min(), x.max(), num_fine)
y_fine = np.concatenate([np.interp(x_fine, x, y_row) for y_row in Y])
x_fine = np.broadcast_to(x_fine, (num_series, num_fine)).ravel()

## Plot (x, y) points in 2d histogram with log colorscale
## It is pretty evident that there is some kind of structure under the noise
## You can tune vmax to make signal more visible
cmap = plt.colormaps["plasma"]
cmap = cmap.with_extremes(bad=cmap(0))
h, xedges, yedges = np.histogram2d(x_fine, y_fine, bins=[400, 100])
pcm = plt.pcolormesh(xedges, yedges, h.T, cmap=cmap,
                         norm="log", vmax=1.5e2, rasterized=True)
plt.colorbar(pcm, label="## points", pad=0)
plt.title("2D Histogram and Log Color Scale")
plt.show()

toc = time.time()
print(f"{toc-tic:.3f} sec. elapsed")

Visualizar Dados com Histograma 2D - Escala de Cores Linear

Nesta etapa, visualizaremos os dados com uma escala de cores linear.

## Same data but on linear color scale
pcm = plt.pcolormesh(xedges, yedges, h.T, cmap=cmap,
                         vmax=1.5e2, rasterized=True)
plt.colorbar(pcm, label="## points", pad=0)
plt.title("2D Histogram and Linear Color Scale")
plt.show()

Resumo

Neste laboratório, aprendemos como visualizar eficientemente um grande número de séries temporais de uma forma que pode potencialmente revelar subestruturas e padrões ocultos que não são imediatamente óbvios e exibi-los de uma forma visualmente atraente. Geramos múltiplas séries "sinal" senoidais que estão enterradas sob um número maior de séries "ruído/fundo" de caminhada aleatória, e visualizamos os dados com um gráfico de linhas e um histograma 2D com escalas de cores logarítmicas e lineares.