Расчёт скользящего среднего в Python: использование NumPy

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для вычисления скользящего среднего в NumPy применяется функция numpy.convolve:

Python
Скопировать код
import numpy as np

data = np.array([ваш_набор_данных])
window_size = ваш_размер_окна
window = np.ones(window_size) / window_size
moving_average = np.convolve(data, window, 'valid')

Замените параметры ваш_набор_данных и ваш_размер_окна на интересующие вас значения. Используя данный метод, можно усреднить данные, предполагая равное влияние каждой их точки в окне, за исключением крайних значений.

Кинга Идем в IT: пошаговый план для смены профессии

Простота и производительность

Существуют различные подходы к расчёту скользящего среднего, каждый со своими преимуществами.

Кумулятивная сумма

Функция np.cumsum позволяет быстро и просто получить невзвешенное скользящее среднее.

Python
Скопировать код
def moving_average_cumsum(data, window_size):
    cumsum_vec = np.cumsum(np.insert(data, 0, 0)) 
    return (cumsum_vec[window_size:] – cumsum_vec[:-window_size]) / window_size

Данный метод обладает очарованием непосредственности.

FFT и SciPy

Для работы с огромными массивами данных предпочтительным оказывается использование быстрого преобразования Фурье. Незаменимым инструментом в этом случае выступает SciPy.

Python
Скопировать код
from scipy.signal import convolve

def moving_average_fft(data, window_size):
    window = np.ones(window_size) / window_size
    return convolve(data, window, mode='same', method='fft')

Таким образом, обрабока данных происходит на высокой скорости.

Временные ряды и Pandas

Для анализа временных рядов идеально подходит Pandas с его функцией rolling:

Python
Скопировать код
import pandas as pd

series = pd.Series(data)
moving_average = series.rolling(window=window_size).mean()

Так, анализировать временные ряды становится эффективно и удобно.

Расширенные техники

Экспоненциальное скользящее среднее

Если актуальность данных имеет большой вес, то можно использовать экспоненциально-взвешенное скользящее среднее:

Python
Скопировать код
moving_average_ew = series.ewm(span=window_size).mean()

Высокопроизводительные методы

Когда скорость обработки данных стоит на первом месте, bottleneck.move_mean значительно ускоряет вычисления, а numpy.lib.stride_tricks.sliding_window_view предлагает современный подход к работе со скользящими окнами.

Python
Скопировать код
import bottleneck as bn

moving_average_bn = bn.move_mean(data, window=window_size, min_count=1)

from numpy.lib.stride_tricks import sliding_window_view

def moving_average_sliding_window(data, window_size):
    return np.mean(sliding_window_view(data, window_shape=window_size), axis=-1)

Визуализация

Скользящее среднее позволяет сгладить колебания данных, подобно утюжке, проглаживающему складки на простыне:

Markdown
Скопировать код
Исходные данные (складчатая простыня):    [ 7, 9, 5, 7, 3 ]
Окно скользящего среднего (утюг):    [   5   ]

Применение скользящего среднего на практике:

Python
Скопировать код
np.convolve(исходные_данные, np.ones(window_size)/window_size, 'valid')

И в результате получаем гладкую как шёлк простыню:

Markdown
Скопировать код
Сглаженные данные (наглаженная простыня): [ 7, 7, 6.33, 5 ]
# 3-элементное окно обеспечивает плавный переход данных

Многомерное сглаживание

При работе с двумерными массивами, например, изображениями, можно также использовать NumPy и SciPy:

Python
Скопировать код
# 2D свертка для сглаживания изображений
from scipy.signal import convolve2d

image_data = np.random.rand(5, 5) # Пример двумерного массива
kernel = np.ones((3, 3)) / 9      # Определение сглаживающего ядра размером 3x3

smoothed_image = convolve2d(image_data, kernel, boundary='fill', fillvalue=0, mode='same')

Полезные материалы

  1. numpy.convolve — Руководство NumPy v1.26 — глубокое изучение функции numpy.convolve.
  2. pandas.DataFrame.rolling — документация pandas 2.2.0 — обзор методов работы со скользящими окнами в Pandas.
  3. scipy.signal.convolve — Руководство SciPy v1.12.0 — подробное руководство по функции свертки в SciPy.
  4. Понимание расчётов со скользящими окнами — анализ применения скользящих окон в аналитике данных.
  5. Гистограммы, биннинг и плотность | Руководство по анализу данных на Python — практическое руководство по визуализации данных с использованием скользящих средних.
  6. Временные скользящие средние в Pandas — обсуждение методов расчета временных скользящих средних в Pandas.