Histogramme de séries temporelles avec Matplotlib

PythonPythonBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce laboratoire montre comment visualiser efficacement un grand nombre de séries temporelles de manière à révéler potentiellement des sous-structures et des motifs cachés qui ne sont pas immédiatement évidents et à les afficher de manière visuellement attrayante.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Importation des bibliothèques requises

Dans cette étape, nous allons importer les bibliothèques requises pour ce laboratoire.

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

Générer des données

Dans cette étape, nous allons générer de multiples séries de "signaux" sinusoidaux qui sont enterrés sous un plus grand nombre de séries de "bruit/fond" de marche aléatoire. Nous allons générer des marches aléatoires gaussiennes non biaisées et des signaux sinusoidaux.

## 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
)

Visualiser les données avec un graphique en ligne

Dans cette étape, nous allons visualiser les données générées avec un graphique en ligne.

## 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")

Visualiser les données avec un histogramme 2D - Échelle de couleur logarithmique

Dans cette étape, nous allons convertir les multiples séries temporelles en un histogramme. Non seulement le signal caché sera plus visible, mais c'est également une procédure beaucoup plus rapide. Nous allons tracer des points (x, y) dans un histogramme 2D avec une échelle de couleur logarithmique.

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")

Visualiser les données avec un histogramme 2D - Échelle de couleur linéaire

Dans cette étape, nous allons visualiser les données avec une échelle de couleur linéaire.

## 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()

Sommaire

Dans ce laboratoire, nous avons appris à visualiser efficacement un grand nombre de séries temporelles de manière à révéler potentiellement des sous-structures et des motifs cachés qui ne sont pas immédiatement évidents et à les afficher de manière visuellement attrayante. Nous avons généré de multiples séries de "signaux" sinusoidaux enterrées sous un plus grand nombre de séries de "bruit/fond" de marche aléatoire, et nous avons visualisé les données avec un graphique en ligne et un histogramme 2D avec des échelles de couleur logarithmique et linéaire.