Я хотел бы использовать функции уменьшения и накопления в Pandas таким же образом, как они применяются в нативном питоне со списками.В реализациях itertools и functools для уменьшения и накопления (иногда называемого сложением и накопительным сложением в других языках) требуется функция с двумя аргументами.В Pandas нет аналогичной реализации.Функция принимает два параметра: f (аккумулированное_значение, popped_value)
Итак, у меня есть список двоичных переменных и я хочу вычислить число длительностей, когда мы находимся в состоянии 1:
In [1]: from itertools import accumulate
import pandas as pd
drawdown_periods = [0,1,1,1,0,0,0,1,1,1,1,0,1,1,0]
применение накопления к этому с помощью лямбда-функции
lambda x,y: (x+y)*y
дает
In [2]: list(accumulate(drawdown_periods, lambda x,y: (x+y)*y))
Out[2]: [0, 1, 2, 3, 0, 0, 0, 1, 2, 3, 4, 0, 1, 2, 0]
подсчет длины каждого drawdown_period.
Есть ли умный, но изворотливый способпредоставить лямбда-функцию с двумя аргументами?Я могу пропустить трюк здесь.
Я знаю, что есть прекрасный рецепт с groupby (см. StackOverflow Как рассчитать последовательные равные значения в Pandas / Как эмулировать itertools.groupby с серией / dataframe ).Я повторю это, потому что это так мило:
In [3]: df = pd.DataFrame(data=drawdown_periods, columns=['dd'])
df['dd'].groupby((df['dd'] != df['dd'].shift()).cumsum()).cumsum()
Out[3]:
0 0
1 1
2 2
3 3
4 0
5 0
6 0
7 1
8 2
9 3
10 4
11 0
12 1
13 2
14 0
Name: dd, dtype: int64
Это не решение, которое я хочу.Мне нужен способ передачи двухпараметрической лямбда-функции в нативные функции уменьшения / накопления панд, поскольку это также будет работать для многих других рецептов функционального программирования.