Как рассчитать скользящие средние в Python
Скользящее среднее — это метод, который можно использовать для сглаживания данных временных рядов, чтобы уменьшить «шум» в данных и упростить выявление закономерностей и тенденций.
Идея скользящей средней состоит в том, чтобы взять среднее значение за определенное количество предыдущих периодов, чтобы получить «скользящую среднюю» для данного периода.
В этом руководстве объясняется, как рассчитать скользящие средние в Python.
Пример: скользящие средние в Python
Предположим, у нас есть следующий массив, который показывает общий объем продаж определенной компании за 10 периодов:
x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104]
Способ 1: Используйте функцию cumsum().
Один из способов вычислить скользящее среднее — использовать функцию cumsum():
import numpy as np
#define moving average function
def moving_avg(x, n):
cumsum = np.cumsum(np.insert(x, 0, 0))
return (cumsum[n:] - cumsum[:-n]) / float(n)
#calculate moving average using previous 3 time periods
n = 3
moving_avg(x, n):
array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])
Вот как интерпретировать вывод:
- Скользящее среднее в третьем периоде равно 47. Оно рассчитывается как среднее первых трех периодов: (50+55+36)/3 = 47 .
- Скользящая средняя в четвертом периоде равна 46,67. Это рассчитывается как среднее значение за предыдущие три периода: (55+36+49)/3 = 46,67 .
И так далее.
Способ 2: Используйте панд.
Другой способ вычислить скользящее среднее — написать функцию на основе pandas:
import pandas as pd
#define array to use and number of previous periods to use in calculation
x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104]
n=3
#calculate moving average
pd.Series(x).rolling(window=n).mean().iloc[n-1:].values
array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])
Этот метод дает те же результаты, что и предыдущий метод, но работает быстрее на больших массивах.
Обратите внимание, что вы также можете указать любое количество предыдущих периодов времени для использования в расчете скользящей средней. Например, возможно, вы предпочитаете использовать n=5:
#use 5 previous periods to calculate moving average
n=5
#calculate moving average
pd.Series(x).rolling(window=n).mean().iloc[n-1:].values
array([54.8, 59.8, 69. , 79. , 85.2, 89.2])
Чем больше периодов вы используете для расчета скользящей средней, тем более «сглаженной» будет линия скользящей средней.