# Как рассчитать скользящее среднее (среднее арифметическое) в Pandas

В этом посте вы узнаете, **как рассчитать скользящее среднее в Pandas с использованием функции rolling().** Скользящие средние также известны как переменные средние

Создание скользящего среднего позволяет "сгладить" небольшие колебания в наборах данных, позволяя при этом прослеживать тенденции. Часто это используется в макроэкономике, например, при анализе уровня безработицы, валового внутреннего продукта и цен на акции. Скользящее среднее используется для создания подмножества полных данных и расчета среднего для этого подмножества. Это позволяет сгладить данные с высокой степенью колебаний.

К концу этого учебного пособия вы научитесь:

* Как рассчитать скользящее среднее в Pandas
* Как понять синтаксис метода `.rolling()`
* Как изменить центр скользящего среднего
* Как рассчитать скользящее среднее значение групп с помощью Pandas `.groupby()`
* Как использовать другие параметры, такие как относительно новый параметр `step=`

**Обновлено в 2023 году** для включения более продвинутых способов использования, включая вычисление скользящего среднего по группам ваших данных и новый параметр `step=` , введенный в версии Pandas 1.5.

<figure><img src="https://3188902851-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ8ZgobqrSJWaGpehFarf%2Fuploads%2FjUt7jth0kHAwnIQNUSlb%2F0aeafd9f-6472-4680-88b9-ed944aa3ddb0.png?alt=media&#x26;token=b844730b-5bd7-4e4d-bd55-5defa156861d" alt=""><figcaption><p>Влияние скользящего среднего на ваши данные</p></figcaption></figure>

Оглавление

* [Загрузка нашего набора данных](#zagruzka-nashego-nabora-dannykh)
* [Объяснение функции Pandas Rolling()](#obyasnenie-funkcii-pandas-rolling)
* [Создание скользящего среднего в Pandas](#sozdanie-skolzyashego-srednego-v-pandas)
* [Визуализация скользящей средней в Pandas](#vizualizaciya-skolzyashei-srednei-v-pandas)
* [Изменение центра скользящего среднего в Pandas](#izmenenie-centra-skolzyashego-srednego-v-pandas)
* [Понимание параметра min\_ periods в скользящем среднем Pandas](#ponimanie-parametra-min_-periods-v-skolzyashem-srednem-pandas)
* [Вычисление скользящего среднего с помощью объекта GroupBy в Pandas](#vychislenie-skolzyashego-srednego-s-pomoshyu-obekta-groupby-v-pandas)
* [Вычислить скользящее среднее в Pandas с подсчетом шагов](#vychislit-skolzyashee-srednee-v-pandas-s-podschetom-shagov)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Загрузка нашего набора данных

Давайте загрузим набор данных для исследования функции сдвига. Мы использовать функцию `date_range` в Pandas для создания диапазона дат

```python
import pandas as pd

prices = [62, 64, 63, 69, 71, 73, 74, 76, 75, 74, 72, 86, 98, 85, 103, 92, 93, 96, 96, 75, 84, 91, 71, 108, 106, 106, 115, 116, 122, 108, 101, 125, 119, 107, 123, 109, 163, 149, 99, 137, 110, 187, 116, 123, 144, 119, 176, 155, 179, 179, 123, 133, 200, 193, 136, 167, 131, 179, 200, 192, 138, 164, 210, 174, 257, 180, 173, 221, 204, 187, 283, 198, 223, 218, 198, 168, 279, 187, 261, 210, 221, 201, 257, 160, 312, 169, 239, 277, 148, 236, 255]

dates = pd.date_range('2022-04-01', periods=len(prices))

df = pd.DataFrame(data=zip(dates, prices), columns=['Date', 'Price'])
print(df.head())
```

Мы вывели на печать первые пять строк, используя функцию head:

```python
#         Date  Price
# 0 2022-04-01     62
# 1 2022-04-02     64
# 2 2022-04-03     63
# 3 2022-04-04     69
# 4 2022-04-05     71
```

### Объяснение функции Pandas Rolling()

Для расчета скользящего среднего в Pandas используется сочетание функций rolling() и mean(). Давайте рассмотрим функцию rolling() в Pandas подробнее:

```python
# Понимание метода Pandas .rolling()
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, step=None, method='single')
```

В таблице ниже представлены различные параметры метода .`rolling(),` включая их значения по умолчанию и принятые значения:

| Параметр     | Значение по умолчанию | Описание                                                                                                                                                                                                      | Принятые значения                                                                                                                                                                                                                               |
| ------------ | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| window       | Required              | Размер скользящего окна (количество периодов, включаемых в расчет среднего значения)                                                                                                                          | Integer > 0                                                                                                                                                                                                                                     |
| min\_periods | 1                     | Минимальное количество периодов, необходимое для получения достоверного результата (гарантирует, что в окне достаточно периодов для приемлемого среднего расчета).                                            | Integer >= 0 (If None, defaults to window value)                                                                                                                                                                                                |
| center       | False                 | Указывает, следует ли установить окно в центре точек данных или использовать завершающее окно (True устанавливает центр окна, False использует завершающее окно)                                              | Boolean (True or False)                                                                                                                                                                                                                         |
| win\_type    | None                  | Тип окна, используемый для расчета среднего значения, влияющий на определение границ окна. Если нет, все баллы имеют одинаковый вес.                                                                          | None or string: {‘boxcar’, ‘triang’, ‘blackman’, ‘hamming’, ‘bartlett’, ‘parzen’, ‘bohman’, ‘blackmanharris’, ‘nuttall’, ‘barthann’, ‘kaiser’, ‘gaussian’, ‘general\_gaussian’, ‘slepian’, ‘dpss’, ‘chebwin’, ‘exponential’, ‘tukey’, ‘taylor’} |
| on           | None                  | Для DataFrame — столбец, по которому рассчитывается скользящее среднее. Если нет, используется индекс.                                                                                                        | Column label or None                                                                                                                                                                                                                            |
| axis         | 0                     | Ось, по которой вычисляется скользящее среднее                                                                                                                                                                | Integer {0 or 1} or string {‘index’, ‘columns’}                                                                                                                                                                                                 |
| closed       | ‘right’               | Сторона интервала окна, которую нужно закрыть (либо оба конца, либо только правый конец, либо только левый конец). Определяет, какие точки данных включены, при этом «право» является значением по умолчанию. | {‘right’, ‘left’, ‘both’, ‘neither’}                                                                                                                                                                                                            |
| step         | None                  | размер шага окна                                                                                                                                                                                              |                                                                                                                                                                                                                                                 |
| method       | 'single'              | метод вычисления окна                                                                                                                                                                                         | 'single' используется для обычных оконных функций, 'table' для более сложных операций.                                                                                                                                                          |

Теперь, когда у вас есть хорошее понимание метода `.rolling()`, давайте начнем вычислять скользящее среднее в Pandas.

### Создание скользящего среднего в Pandas

В предыдущем разделе вы узнали, что метод `.rolling()` в Pandas возвращает скользящее окно заданного `размера`. Предположим, мы хотим рассчитать скользящее окно размера 7, мы можем просто передать целое число 7.

```python
# Вычисление скользящего среднего с помощью Pandas
df['Rolling'] = df['Price'].rolling(7).mean()

print(df.head(10))
```

Возвращает это:

```python
        Date  Price    Rolling
0 2022-04-01     62        NaN
1 2022-04-02     64        NaN
2 2022-04-03     63        NaN
3 2022-04-04     69        NaN
4 2022-04-05     71        NaN
5 2022-04-06     73        NaN
6 2022-04-07     74  68.000000
7 2022-04-08     76  70.000000
8 2022-04-09     75  71.571429
9 2022-04-10     74  73.142857
```

Давайте разберем, что мы здесь сделали:

1. Мы создали новый столбец, используя метод `rolling()`
2. Мы использовали значение 7 для создания скользящего 7-дневного окна.
3. Мы затем применили метод `.mean()` для расчёта среднего значения этого скользящего окна.

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

### Визуализация скользящей средней в Pandas

Давайте создадим визуализацию, чтобы продемонстрировать преимущества использования скользящего среднего. Чтобы визуализировать данные без использования скользящего среднего, мы можем написать следующий код:

```python
# Визуализация данных без скользящих средних
import matplotlib.pyplot as plt
plt.plot(df['Date'], df['Price'])
plt.title('Данные без скользящего среднего')

plt.show()
```

<figure><img src="https://3188902851-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ8ZgobqrSJWaGpehFarf%2Fuploads%2F1qnjCcpfHhF8a26bqEbr%2FData-without-Rolling-Average-in-Pandas.png?alt=media&#x26;token=a9d247e2-2fdd-41a7-9c04-5209d7a692e1" alt=""><figcaption><p>Данные без скользящего среднего</p></figcaption></figure>

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

```python
# Построение графика с учетом эффекта скользящего среднего
import matplotlib.pyplot as plt
plt.plot(df['Date'], df['Price'])
plt.plot(df['Date'], df['Rolling'])
plt.title('Данные со скользящим средним')

plt.show()
```

Это возвращает следующее изображение:

<figure><img src="https://3188902851-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ8ZgobqrSJWaGpehFarf%2Fuploads%2F4SvrArg7A6mhKOhyEUxz%2FData-with-Rolling-Average-in-Pandas.png?alt=media&#x26;token=41473781-19c3-427d-b245-9039719c988e" alt=""><figcaption><p>Эффект скользящего среднего в Pandas</p></figcaption></figure>

### Изменение центра скользящего среднего в Pandas

По умолчанию Pandas использует крайнее правое значение для результатов, полученных в окне. Поэтому наши данные начинаются с седьмого дня, так как данных за первые шесть дней не существует. Мы можем изменить это поведение, модифицируя аргумент `center=` на `True`. Это приведет к тому, что значение "сдвинется" к центру индекса окна.

Давайте посмотрим, как мы можем сделать это в Pandas:

```python
# Модификация центра окна
df = pd.DataFrame(data=zip(dates, prices), columns=['Date', 'Price'])
df['Rolling'] = df['Price'].rolling(7).mean()

df['Rolling Center'] = df['Price'].rolling(7, center=True).mean()

print(df.head(10))

# Returns:
#         Date  Price    Rolling  Rolling Center
# 0 2022-04-01     62        NaN             NaN
# 1 2022-04-02     64        NaN             NaN
# 2 2022-04-03     63        NaN             NaN
# 3 2022-04-04     69        NaN       68.000000
# 4 2022-04-05     71        NaN       70.000000
# 5 2022-04-06     73        NaN       71.571429
# 6 2022-04-07     74  68.000000       73.142857
# 7 2022-04-08     76  70.000000       73.571429
# 8 2022-04-09     75  71.571429       75.714286
# 9 2022-04-10     74  73.142857       79.285714
```

Мы видим, что окно было скорректировано. В результате этой коррекции, прокручиваемые данные начались с центра окна (который в данном случае был 4-й записью).

### Понимание параметра min\_ periods в скользящем среднем Pandas

Параметр `min_periods` играет ключевую роль в расчете скользящих средних в конкретных сценариях. Иногда для получения значимых результатов необходимо иметь достаточное количество данных в движущемся окне.

**Параметр `min_periods` позволяет указать минимальное количество периодов, необходимых для получения допустимого результата при расчете скользящего среднего.** Если в окне недостаточно периодов, функция вернет NaN (не число) для данного скользящего окна.

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

Давайте исследуем параметр `min_periods` с нашим предыдущим набором данных:

```python
# Изменение минимального количества периодов
import pandas as pd

prices = [62, 64, 63, 69, 71, 73, 74, 76, 75, 74, 72, 86, 98, 85, 103, 92, 93, 96, 96, 75, 84, 91, 71, 108, 106, 106, 115, 116, 122, 108, 101, 125, 119, 107, 123, 109, 163, 149, 99, 137, 110, 187, 116, 123, 144, 119, 176, 155, 179, 179, 123, 133, 200, 193, 136, 167, 131, 179, 200, 192, 138, 164, 210, 174, 257, 180, 173, 221, 204, 187, 283, 198, 223, 218, 198, 168, 279, 187, 261, 210, 221, 201, 257, 160, 312, 169, 239, 277, 148, 236, 255]

dates = pd.date_range('2022-04-01', periods=len(prices))
df = pd.DataFrame(data=zip(dates, prices), columns=['Date', 'Price'])

df['With Min Periods'] = df['Price'].rolling(window=4, min_periods=2).mean()
print(df.head())

# Returns:
#         Date  Price  With Min Periods
# 0 2022-04-01     62               NaN
# 1 2022-04-02     64             63.00
# 2 2022-04-03     63             63.00
# 3 2022-04-04     69             64.50
# 4 2022-04-05     71             66.75

```

Давайте разберем, что делает этот блок кода:

1. Начнем с создания DataFrame `df` с нашими образцами данных.
2. Затем мы вызываем метод `rolling()` для столбца `'Price'` с размером окна в 4 периода и аргументом `min_periods=2`. Это указывает на то, что для получения допустимого результата нам требуется минимум 2 точки данных внутри скользящего окна. Если точек данных меньше 2, расчет приведет к NaN.
3. Затем мы используем функцию `mean()` для расчета скользящего среднего для каждого окна.
4. Наконец, мы присваиваем это новому столбцу, \`'С минимальным количеством периодов'

Используя параметр `min_periods`, мы можем эффективно управлять ситуациями, когда для значимых расчетов скользящего среднего необходим минимальный объем данных. Это полезно для избежания потенциальных предвзятостей или ошибок при обработке нерегулярных или неполных данных в анализе.

### Вычисление скользящего среднего с помощью объекта GroupBy в Pandas

В некоторых случаях вам может потребоваться вычислить скользящее среднее для различных групп в вашем наборе данных. Это тот случай, когда сочетание метода `groupby` со скользящим средним оказывается очень полезным. В этом разделе мы продемонстрируем, как использовать объект `groupby` для расчета скользящих средних для отдельных групп, используя набор данных, где мы добавляем дополнительный столбец для представления каждой группы.

Сначала давайте создадим образец DataFrame Pandas с колонкой 'group':

```python
# Добавление группы в наш DataFrame
import pandas as pd

data = {
    'date': pd.date_range(start='1/1/2021', periods=15),
    'value': [1, 4, 6, 4, 5, 3, 6, 8, 10, 7, 6, 4, 2, 1, 3],
    'group': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A', 'B']
}

df = pd.DataFrame(data)
```

Теперь давайте вычислим скользящее среднее для каждой группы, используя окно из 3 периодов:

```python
# Вычисление скользящего среднего по группам
df['Avg'] = df.groupby('group')['value'].transform(lambda x: x.rolling(3, 3).mean())
print(df.head(7))

# Returns:
#          date  value group       Avg
# 0  2021-01-01      1     A       NaN
# 1  2021-01-02      4     A       NaN
# 2  2021-01-03      6     B       NaN
# 3  2021-01-04      4     B       NaN
# 4  2021-01-05      5     A  3.333333
# 5  2021-01-06      3     A  4.000000
# 6  2021-01-07      6     B  5.333333
```

Давайте разберем, что мы сделали в приведенном выше блоке кода:

1. Сначала мы используем `df.groupby('group')` для группировки данных по столбцу ‘group’. В нашем примере есть две группы: ‘A’ и ‘B’.
2. После этого мы применяем вычисление скользящего среднего для столбца `value`, используя построение цепочки `['value'].rolling(window=3, min_periods=3)`. Это указывает Pandas вычислять скользящее среднее для каждой группы отдельно, используя окно из 3 периодов и минимум 3 периода для получения допустимого результата.
3. Мы используем функцию `mean()` для расчета фактического скользящего среднего для каждого окна внутри групп.

DataFrame `rolling_avg_group` теперь содержит значения скользящего среднего для каждой группы (A и B), рассчитанные независимо.

### Вычислить скользящее среднее в Pandas с подсчетом шагов

Если вы хотите вычислить скользящее среднее, используя количество шагов, вы можете использовать параметр `step=`. Этот параметр относительно новый и был введен только в Pandas версии 1.5.

Это работает так же, как и первоначальное разделение данных с помощью `[::step]`, но избавляет вас от необходимости пропускать данные в вашем DataFrame. Чтобы рассчитать скользящее среднее с шагом в Pandas, вы можете использовать следующее:

```python
df['Stepped Rolling'] = df['Price'].rolling(3, step=3).mean()
print(df.head(7))

# Returns:
#         Date  Price  Stepped Rolling
# 0 2022-04-01     62              NaN
# 1 2022-04-02     64              NaN
# 2 2022-04-03     63              NaN
# 3 2022-04-04     69        65.333333
# 4 2022-04-05     71              NaN
# 5 2022-04-06     73              NaN
# 6 2022-04-07     74        72.666667
```

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

### Заключение

В этом уроке вы научились вычислять скользящее среднее с использованием Pandas. Вы узнали, что такое скользящее среднее и почему оно полезно. Затем вы научились использовать функцию `.rolling()` в Pandas для создания скользящего окна, к которому применялся метод `.mean()`. Вы также научились визуализировать данные, а также изменять центр скользящего окна.

### Дополнительные ресурсы

Чтобы узнать больше о схожих темах, ознакомьтесь с приведенными ниже учебными материалами:

* Среднее значение Pandas: рассчитать среднее значение Pandas для одного или нескольких столбцов
* Линейные диаграммы Matplotlib – узнайте все, что вам нужно знать
* Чтобы узнать больше о функции прокрутки, ознакомьтесь [с официальной документацией](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rolling.html).
* [Ссылка на код статьи ](https://github.com/BeMindYou/Lesson/blob/main/Pandas/how_to_calculate_moving_average_simple_average_in_pandas.ipynb)
