Метод apply аксессора expanding
Метод apply применяется к объекту Expanding,
который получается через аксессор expanding у Series или DataFrame.
Он позволяет применить произвольную пользовательскую функцию к каждому расширяющемуся окну данных.
В качестве первого параметра передаётся функция, которая будет применена к значениям окна.
Дополнительно можно передать аргументы в функцию через параметры args и kwargs.
Синтаксис
series.expanding(window).apply(func, raw=False, engine=None, engine_kwargs=None, args=None, kwargs=None)
Пример
Применим пользовательскую функцию для вычисления размаха (max - min) на расширяющемся окне:
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 5])
res = ser.expanding().apply(lambda x: x.max() - x.min())
print(res)
Результат выполнения кода:
0 0.0
1 1.0
2 2.0
3 3.0
4 4.0
dtype: float64
Пример
Используем функцию с дополнительным аргументом. Вычислим сумму, делённую на коэффициент:
import pandas as pd
ser = pd.Series([10, 20, 30, 40, 50])
res = ser.expanding().apply(lambda x, div: x.sum() / div, args=(2,))
print(res)
Результат выполнения кода:
0 5.0
1 15.0
2 30.0
3 50.0
4 75.0
dtype: float64
Пример
Применим пользовательскую функцию к каждому столбцу DataFrame. Вычислим произведение элементов в расширяющемся окне:
import pandas as pd
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': [2, 4, 6, 8, 10]
})
res = df.expanding().apply(lambda x: x.prod())
print(res)
Результат выполнения кода:
a b
0 1.0 2.0
1 2.0 8.0
2 6.0 48.0
3 24.0 384.0
4 120.0 3840.0
Пример
Используем параметр raw для работы с массивами NumPy вместо объектов Series. Это может ускорить вычисления:
import pandas as pd
import numpy as np
ser = pd.Series([1, 3, 5, 7, 9])
res = ser.expanding().apply(lambda x: np.mean(x), raw=True)
print(res)
Результат выполнения кода:
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
dtype: float64