Гистограмма временных рядов в Matplotlib

PythonPythonBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабаратории показано, как эффективно визуализировать большое количество временных рядов таким образом, чтобы потенциально выявить скрытую структуру и паттерны, которые не сразу очевидны, и отобразить их в визуально привлекательном виде.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортировать необходимые библиотеки

В этом шаге мы импортируем необходимые библиотеки для этой лабораторной работы.

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

Генерация данных

В этом шаге мы сгенерируем несколько синусоидальных "сигнальных" рядов, которые скрыты под большим количеством случайных блужданий "шум/фон". Мы сгенерируем неискаженные гауссовские случайные блуждания и синусоидальные сигналы.

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

Визуализация данных с помощью линейного графика

В этом шаге мы визуализируем сгенерированные данные с помощью линейного графика.

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

Визуализация данных с помощью 2D гистограммы - логарифмическая шкала цвета

В этом шаге мы преобразуем несколько временных рядов в гистограмму. Не только скрытый сигнал станет более видимым, но это также гораздо быстрейший процесс. Мы построим точки (x, y) в 2D гистограмме с логарифмической шкалой цвета.

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

Визуализация данных с помощью 2D гистограммы - линейная шкала цвета

В этом шаге мы визуализируем данные с линейной шкалой цвета.

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

Резюме

В этом лабораторном занятии мы узнали, как эффективно визуализировать большое количество временных рядов таким образом, чтобы можно было выявить скрытую подструктуру и паттерны, которые не сразу очевидны, и представить их в визуально привлекательном виде. Мы сгенерировали несколько синусоидальных "сигнальных" рядов, которые скрыты под большим количеством случайных блужданий "шум/фон", и визуализировали данные с помощью линейного графика и 2D гистограммы с логарифмической и линейной шкалами цвета.