Histograma de series de tiempo con Matplotlib

PythonPythonBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo visualizar eficientemente grandes cantidades de series de tiempo de manera que pueda revelar subestructuras y patrones ocultos que no son inmediatamente obvios y mostrarlos de manera visualmente atractiva.

Consejos sobre la VM

Una vez que se haya iniciado 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 operaciones no puede automatizarse debido a las limitaciones de Jupyter Notebook.

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

Importar las bibliotecas necesarias

En este paso, importaremos las bibliotecas necesarias para esta práctica.

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

Generar datos

En este paso, generaremos múltiples series de "señales" sinusoidales que se encuentran enterradas debajo de un mayor número de series de "ruido/fondo" de caminata aleatoria. Generaremos caminatas aleatorias gaussianas no sesgadas y señales sinusoidales.

## Fije el estado aleatorio para la reproducibilidad
np.random.seed(19680801)

## Cree algunos datos; una caminata aleatoria 1D + una pequeña fracción de ondas sinusoidales
num_series = 1000
num_points = 100
SNR = 0.10  ## Relación señal-ruido
x = np.linspace(0, 4 * np.pi, num_points)

## Genere caminatas aleatorias gaussianas no sesgadas
Y = np.cumsum(np.random.randn(num_series, num_points), axis=-1)

## Genere señales sinusoidales
num_signal = round(SNR * num_series)
phi = (np.pi / 8) * np.random.randn(num_signal, 1)  ## pequeño desplazamiento aleatorio
Y[-num_signal:] = (
    np.sqrt(np.arange(num_points))  ## factor de escala RMS de la caminata aleatoria
    * (np.sin(x - phi)
       + 0.05 * np.random.randn(num_signal, num_points))  ## pequeño ruido aleatorio
)

Visualizar datos con un gráfico de líneas

En este paso, visualizaremos los datos generados con un gráfico de líneas.

## Grafique las series usando `plot` y un valor pequeño de `alpha`.
## Con esta vista, es muy difícil observar el comportamiento sinusoidal debido a la gran cantidad de series superpuestas.
## También tarda un poco en ejecutarse porque se deben generar muchos artistas individuales.
tic = time.time()
plt.plot(x, Y.T, color="C0", alpha=0.1)
toc = time.time()
plt.title("Gráfico de líneas con alpha")
plt.show()
print(f"{toc-tic:.3f} sec. transcurridos")

Visualizar datos con un histograma 2D - escala de color logarítmica

En este paso, convertiremos las múltiples series de tiempo en un histograma. No solo será más visible la señal oculta, sino que también es un procedimiento mucho más rápido. Representaremos los puntos (x, y) en un histograma 2D con una escala de color logarítmica.

tic = time.time()

## Interpole linealmente entre los puntos de cada serie de tiempo
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()

## Grafique los puntos (x, y) en un histograma 2D con escala de color logarítmica
## Es bastante evidente que hay alguna clase de estructura debajo del ruido
## Puede ajustar vmax para que la señal sea más 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="## puntos", pad=0)
plt.title("Histograma 2D y escala de color logarítmica")
plt.show()

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

Visualizar datos con un histograma 2D - escala de color lineal

En este paso, visualizaremos los datos con una escala de color lineal.

## Los mismos datos pero con una escala de color lineal
pcm = plt.pcolormesh(xedges, yedges, h.T, cmap=cmap,
                         vmax=1.5e2, rasterized=True)
plt.colorbar(pcm, label="## puntos", pad=0)
plt.title("Histograma 2D y escala de color lineal")
plt.show()

Resumen

En este laboratorio, aprendimos cómo visualizar eficientemente grandes cantidades de series de tiempo de manera que podría revelar subestructuras y patrones ocultos que no son inmediatamente obvios y mostrarlos de una manera visualmente atractiva. Generamos múltiples series de "señales" sinusoidales que se encuentran enterradas debajo de un mayor número de series de "ruido/fondo" de caminata aleatoria, y visualizamos los datos con un gráfico de líneas y un histograma 2D con escalas de color logarítmicas y lineales.