Метод apply аксессора rolling
Метод apply аксессора rolling применяет пользовательскую функцию к каждому скользящему окну. В отличие от встроенных методов, таких как mean или sum, apply позволяет выполнять произвольные вычисления. Первым параметром передаётся функция, которая принимает массив значений окна и возвращает скалярный результат. Вторым параметром можно указать raw (булево значение): если False, функция получает Series; если True - массив numpy. Параметр engine определяет движок выполнения ('cython' или 'numba'), а engine_kwargs позволяет передать дополнительные аргументы движку. Метод возвращает Series или DataFrame той же длины, что и исходный объект.
Синтаксис
rolling_object.apply(func, raw=False, engine=None, engine_kwargs=None)
Пример
Применим пользовательскую функцию для вычисления среднего арифметического с условием (игнорируем отрицательные значения):
import pandas as pd
ser = pd.Series([1, -2, 3, -4, 5])
res = ser.rolling(3).apply(lambda x: x[x > 0].mean())
print(res)
Результат выполнения кода:
0 NaN
1 NaN
2 2.0
3 3.0
4 4.0
dtype: float64
Пример
Используем функцию с параметром raw=True для работы с массивом NumPy. Вычислим размах (максимум минус минимум) в каждом окне:
import pandas as pd
ser = pd.Series([5, 1, 8, 3, 9])
res = ser.rolling(3).apply(lambda x: x.max() - x.min(), raw=True)
print(res)
Результат выполнения кода:
0 NaN
1 NaN
2 7.0
3 7.0
4 6.0
dtype: float64
Пример
Применим пользовательскую функцию к DataFrame. Вычислим среднее геометрическое для каждого скользящего окна:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, 4, 9, 16, 25],
'b': [2, 8, 18, 32, 50]
})
res = df.rolling(2).apply(lambda x: np.exp(np.log(x).mean()))
print(res)
Результат выполнения кода:
a b
0 NaN NaN
1 2.0 4.0
2 6.0 12.0
3 12.0 24.0
4 20.0 40.0