Анализ трендов и сезонности данных с помощью вейвлет-преобразования
Временные ряды представляют собой последовательные данные, собранные или записанные в последовательности времени. Анализ временных рядов играет важную роль в понимании изменений и паттернов в данных. Один из способов анализа временных рядов — использование вейвлет-преобразования. В этой статье мы рассмотрим, как вейвлет-преобразование может помочь выявить тренды и сезонные компоненты в данных.
Импорт необходимых библиотек
Начнем с импорта необходимых библиотек для работы с данными и визуализации:
import numpy as np import matplotlib.pyplot as plt import pywt
Если у вас не установлен pywt, то вы можете установить его следующим образом:
pip install PyWavelets
Создание временного ряда
Создадим временной ряд, представляющий продажи за определенные периоды времени, используя синусоидальную функцию с добавлением шума:
time = np.arange(0, 100, 1) sales = 50 + 10 * np.sin(0.2 * time) + np.random.normal(scale=5, size=len(time))
Вейвлет-преобразование
Применим вейвлет-преобразование к временному ряду с уровнем разложения 3 и вейвлетом Добеши 4 порядка:
coeffs = pywt.wavedec(sales, 'db4', level=3)
Отображение результатов
Отобразим исходный временной ряд и его вейвлет-коэффициенты на различных уровнях разложения:
plt.figure(figsize=(12, 6)) plt.subplot(3, 2, 1) plt.plot(time, sales, label='Исходный временной ряд') plt.legend() for i in range(len(coeffs)): plt.subplot(3, 2, i + 2) plt.plot(coeffs[i]) plt.title('Уровень ' + str(i + 1)) plt.tight_layout() plt.show()
- Импорт библиотек:
В этом шаге мы импортируем несколько библиотек, которые нам понадобятся для работы с данными и визуализации:
numpy
(сокращение от Numeric Python) — это библиотека для работы с массивами и числовыми данными удобным образом.matplotlib.pyplot
— это библиотека для создания графиков и визуализации данных.pywt
— библиотека PyWavelets, которая используется для вейвлет-преобразования.
np.arange(0, 100, 1)
создает массив времени от 0 до 99 с шагом 1.sales
создает данные о продажах, используя синусоидальную функцию с добавлением шума для реалистичности.
pywt.wavedec()
применяет вейвлет-преобразование к временному ряду.'db4'
указывает на использование вейвлета Добеши 4 порядка.level=3
указывает на уровень разложения.
plt.figure(figsize=(12, 6))
создает новый график с размерами 12x6 дюймов.plt.subplot(2, 2, 1)
задает область для отображения первого графика (2 строки, 2 столбца, 1-й график). Этот график представляет исходный временной ряд.plt.plot(time, sales, label='Исходный временной ряд')
строит график исходного временного ряда (продаж) в зависимости от времени.plt.legend()
добавляет легенду к графику, показывающую, что это исходный временной ряд.- Затем мы проходим по коэффициентам вейвлет-разложения с помощью цикла и строим графики для каждого уровня разложения.
plt.subplot(2, 2, i + 2)
задает область для отображения графика текущего уровня разложения.plt.plot(coeffs[i])
строит график текущего уровня разложения (вейвлет-коэффициенты).plt.title('Уровень ' + str(i + 1))
добавляет заголовок к текущему графику, указывая его уровень.plt.tight_layout()
автоматически корректирует параметры подграфиков так, чтобы они плотно заполняли доступное пространство.plt.show()
отображает все построенные графики.