Расчёт скользящего среднего в Python: использование NumPy
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для вычисления скользящего среднего в NumPy применяется функция numpy.convolve
:
import numpy as np
data = np.array([ваш_набор_данных])
window_size = ваш_размер_окна
window = np.ones(window_size) / window_size
moving_average = np.convolve(data, window, 'valid')
Замените параметры ваш_набор_данных
и ваш_размер_окна
на интересующие вас значения. Используя данный метод, можно усреднить данные, предполагая равное влияние каждой их точки в окне, за исключением крайних значений.
Простота и производительность
Существуют различные подходы к расчёту скользящего среднего, каждый со своими преимуществами.
Кумулятивная сумма
Функция np.cumsum
позволяет быстро и просто получить невзвешенное скользящее среднее.
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.
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
:
import pandas as pd
series = pd.Series(data)
moving_average = series.rolling(window=window_size).mean()
Так, анализировать временные ряды становится эффективно и удобно.
Расширенные техники
Экспоненциальное скользящее среднее
Если актуальность данных имеет большой вес, то можно использовать экспоненциально-взвешенное скользящее среднее:
moving_average_ew = series.ewm(span=window_size).mean()
Высокопроизводительные методы
Когда скорость обработки данных стоит на первом месте, bottleneck.move_mean
значительно ускоряет вычисления, а numpy.lib.stride_tricks.sliding_window_view
предлагает современный подход к работе со скользящими окнами.
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)
Визуализация
Скользящее среднее позволяет сгладить колебания данных, подобно утюжке, проглаживающему складки на простыне:
Исходные данные (складчатая простыня): [ 7, 9, 5, 7, 3 ]
Окно скользящего среднего (утюг): [ 5 ]
Применение скользящего среднего на практике:
np.convolve(исходные_данные, np.ones(window_size)/window_size, 'valid')
И в результате получаем гладкую как шёлк простыню:
Сглаженные данные (наглаженная простыня): [ 7, 7, 6.33, 5 ]
# 3-элементное окно обеспечивает плавный переход данных
Многомерное сглаживание
При работе с двумерными массивами, например, изображениями, можно также использовать NumPy и SciPy:
# 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')
Полезные материалы
- numpy.convolve — Руководство NumPy v1.26 — глубокое изучение функции numpy.convolve.
- pandas.DataFrame.rolling — документация pandas 2.2.0 — обзор методов работы со скользящими окнами в Pandas.
- scipy.signal.convolve — Руководство SciPy v1.12.0 — подробное руководство по функции свертки в SciPy.
- Понимание расчётов со скользящими окнами — анализ применения скользящих окон в аналитике данных.
- Гистограммы, биннинг и плотность | Руководство по анализу данных на Python — практическое руководство по визуализации данных с использованием скользящих средних.
- Временные скользящие средние в Pandas — обсуждение методов расчета временных скользящих средних в Pandas.