Используя Pandas 1.0 и Numpy 1.18, мне нужно применить Rolling несколько раз с различным размером окна и функциями сводки к большому фрейму данных с большим количеством групп. Перед применением итоговой функции серия также сдвигается на 1, чтобы отбросить текущее значение строки. Это пример скользящего максимума, сдвинутого на 1:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [5,2,4,5,4,2,3,5,5,2,4,1], 'b': [18,37,60,45,40,40,50,10,30,2,46,19]})
df = df.sort_values('a').reset_index(drop=True)
df['max'] = df.groupby('a', sort=False, as_index=False)['b'].rolling(2, min_periods=1).apply(lambda x: np.max(x[:-1])).reset_index(drop=True)
Результат:
df
a b max
0 1 19 NaN
1 2 37 NaN
2 2 40 37.0
3 2 2 40.0
4 3 50 NaN
5 4 60 NaN
6 4 40 60.0
7 4 46 40.0
8 5 18 NaN
9 5 45 18.0
10 5 10 45.0
11 5 30 10.0
Результат правильный, но он занимает слишком много времени, когда применяется к большому кадру данных. и мне было интересно, есть ли способ реорганизовать этот logi c, чтобы использовать векторизацию вместо того, чтобы полагаться на apply
, который, как я читал, реализован как al oop под капюшон, и он работает плохо.