Аналитика данных
October 8, 2023

Анализ трендов и сезонности данных с помощью вейвлет-преобразования

Временные ряды представляют собой последовательные данные, собранные или записанные в последовательности времени. Анализ временных рядов играет важную роль в понимании изменений и паттернов в данных. Один из способов анализа временных рядов — использование вейвлет-преобразования. В этой статье мы рассмотрим, как вейвлет-преобразование может помочь выявить тренды и сезонные компоненты в данных.

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

Начнем с импорта необходимых библиотек для работы с данными и визуализации:

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

Результат выполнения кода:

Объяснение кода:

  • Импорт библиотек:
    В этом шаге мы импортируем несколько библиотек, которые нам понадобятся для работы с данными и визуализации:
  1. numpy (сокращение от Numeric Python) — это библиотека для работы с массивами и числовыми данными удобным образом.
  2. matplotlib.pyplot — это библиотека для создания графиков и визуализации данных.
  3. pywt — библиотека PyWavelets, которая используется для вейвлет-преобразования.
  • Создание временного ряда:
    В этом шаге мы создаем временной ряд, представляющий продажи:
  1. np.arange(0, 100, 1) создает массив времени от 0 до 99 с шагом 1.
  2. sales создает данные о продажах, используя синусоидальную функцию с добавлением шума для реалистичности.
  • Вейвлет-преобразование:
    Здесь мы применяем вейвлет-преобразование к временному ряду:
  1. pywt.wavedec() применяет вейвлет-преобразование к временному ряду.
  2. 'db4' указывает на использование вейвлета Добеши 4 порядка.
  3. level=3 указывает на уровень разложения.
  • Отображение результатов:
    В этом шаге мы визуализируем результаты на графиках:
  1. plt.figure(figsize=(12, 6)) создает новый график с размерами 12x6 дюймов.
  2. plt.subplot(2, 2, 1) задает область для отображения первого графика (2 строки, 2 столбца, 1-й график). Этот график представляет исходный временной ряд.
  3. plt.plot(time, sales, label='Исходный временной ряд') строит график исходного временного ряда (продаж) в зависимости от времени.
  4. plt.legend() добавляет легенду к графику, показывающую, что это исходный временной ряд.
  5. Затем мы проходим по коэффициентам вейвлет-разложения с помощью цикла и строим графики для каждого уровня разложения.
  6. plt.subplot(2, 2, i + 2) задает область для отображения графика текущего уровня разложения.
  7. plt.plot(coeffs[i]) строит график текущего уровня разложения (вейвлет-коэффициенты).
  8. plt.title('Уровень ' + str(i + 1)) добавляет заголовок к текущему графику, указывая его уровень.
  9. plt.tight_layout() автоматически корректирует параметры подграфиков так, чтобы они плотно заполняли доступное пространство.
  10. plt.show() отображает все построенные графики.