Введение
В этом лабаратории показано, как эффективно визуализировать большое количество временных рядов таким образом, чтобы потенциально выявить скрытую структуру и паттерны, которые не сразу очевидны, и отобразить их в визуально привлекательном виде.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку 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 гистограммы с логарифмической и линейной шкалами цвета.