Как векторизовать Pandas операции прокатки и сдвига для повышения производительности - PullRequest
1 голос
/ 17 июня 2020

Используя 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 под капюшон, и он работает плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...