Скользящие средние и работа с временными рядами

Работа с временными рядами (time series) — одна из сильных сторон библиотеки pandas. В этом разделе рассмотрим, как использовать pandas для обработки временных рядов и вычисления скользящих средних.

Временные ряды в pandas

Создание временных рядов

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

Пример:

import pandas as pd
import numpy as np

# Создадим временной ряд с датами в качестве индекса
dates = pd.date_range(start='2023-01-01', periods=10, freq='D')
data = np.random.randint(1, 10, size=10)
df = pd.DataFrame(data, index=dates, columns=['Value'])

print(df)

Вывод:

            Value
2023-01-01      7
2023-01-02      3
2023-01-03      9
2023-01-04      2
2023-01-05      5
2023-01-06      4
2023-01-07      1
2023-01-08      6
2023-01-09      8
2023-01-10      9

Основные операции с временными рядами

  • Ресемплирование (resample): изменение частоты временного ряда (например, агрегация по неделям, месяцам и т.д.).

  • Сдвиги (shift): сдвиг временного ряда на определенное количество временных единиц.

  • Операции скользящих окон: применение функций к скользящим окнам в данных.

Пример ресемплирования:

# Агрегация по неделям (вычисление суммы значений за каждую неделю)
weekly_sum = df.resample('W').sum()
print(weekly_sum)

Вывод:

            Value
2023-01-01      7
2023-01-08     30
2023-01-15     23

Скользящие средние

Что такое скользящие средние?

Скользящее среднее — это среднее значение по определенному окну данных. Этот метод часто используется для сглаживания временных рядов и выявления трендов.

Вычисление скользящих средних

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

Пример:

# Вычисление скользящего среднего с окном 3
df['Moving_Average'] = df['Value'].rolling(window=3).mean()

print(df)

Вывод:

            Value  Moving_Average
2023-01-01      7             NaN
2023-01-02      3             NaN
2023-01-03      9             6.33
2023-01-04      2             4.67
2023-01-05      5             5.33
2023-01-06      4             3.67
2023-01-07      1             3.33
2023-01-08      6             3.67
2023-01-09      8             5.00
2023-01-10      9             7.67

Описание:

  • Первая и вторая строки имеют значение NaN, так как для вычисления скользящего среднего по окну из 3 элементов нужно минимум 3 точки данных.

  • Третья строка — это среднее значение первых трех элементов: (7+3+9)/3 = 6.33.

Взвешенные скользящие средние

Иногда требуется придать больший вес более новым значениям в окне. Это можно сделать с помощью метода .apply().

Пример:

weights = np.array([0.1, 0.3, 0.6])
df['Weighted_MA'] = df['Value'].rolling(window=3).apply(lambda x: np.sum(weights * x))

print(df)

Вывод:

            Value  Moving_Average  Weighted_MA
2023-01-01      7             NaN          NaN
2023-01-02      3             NaN          NaN
2023-01-03      9             6.33     6.600000
2023-01-04      2             4.67     4.000000
2023-01-05      5             5.33     3.700000
2023-01-06      4             3.67     3.500000
2023-01-07      1             3.33     2.600000
2023-01-08      6             3.67     4.500000
2023-01-09      8             5.00     6.100000
2023-01-10      9             7.67     7.100000

Описание:

  • Взвешенное скользящее среднее вычисляется с учетом весов: 0.1, 0.3 и 0.6, где 0.6 соответствует самому последнему значению в окне.

Другие методы работы с временными рядами

Сдвиг временных рядов

Метод .shift() позволяет сдвинуть данные на определенное количество временных единиц. Это полезно, например, для расчета изменений или для создания лагов.

Пример:

df['Shifted_1'] = df['Value'].shift(1)
print(df)

Вывод:

            Value  Moving_Average  Weighted_MA  Shifted_1
2023-01-01      7             NaN          NaN        NaN
2023-01-02      3             NaN          NaN        7.0
2023-01-03      9             6.33     6.600000        3.0
2023-01-04      2             4.67     4.000000        9.0
2023-01-05      5             5.33     3.700000        2.0
2023-01-06      4             3.67     3.500000        5.0
2023-01-07      1             3.33     2.600000        4.0
2023-01-08      6             3.67     4.500000        1.0
2023-01-09      8             5.00     6.100000        6.0
2023-01-10      9             7.67     7.100000        8.0

Описание:

  • Значение столбца Shifted_1 на одну строку отстает от значения Value.

Дифференцирование временных рядов

Метод .diff() вычисляет разницу между значениями временного ряда. Это полезно для анализа изменений или расчета первой разности ряда.

Пример:

df['Diff'] = df['Value'].diff()
print(df)

Вывод:

            Value  Moving_Average  Weighted_MA  Shifted_1  Diff
2023-01-01      7             NaN          NaN        NaN   NaN
2023-01-02      3             NaN          NaN        7.0  -4.0
2023-01-03      9             6.33     6.600000        3.0   6.0
2023-01-04      2             4.67     4.000000        9.0  -7.0
2023-01-05      5             5.33     3.700000        2.0   3.0
2023-01-06      4             3.67     3.500000        5.0  -1.0
2023-01-07      1             3.33     2.600000        4.0  -3.0
2023-01-08      6             3.67     4.500000        1.0   5.0
2023-01-09      8             5.00     6.100000        6.0   2.0
2023-01-10      9             7.67     7.100000        8.0   1.0

Описание:

  • Разница между текущим и предыдущим значением отображается в столбце

Diff.

Заключение

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

Last updated