Как быстро рассчитать медиану фрейма данных на скользящем окне данных?

Генерирую случайный датасет и на скользящем окне в 1000 значений считаю медиану:

%%time
sr = pd.Series(np.random.randint(0,100, size=20000)) 
for i in range(10): 
    sr.rolling(1000).apply(lambda x: np.median(x))

Результат:

Wall time: 28.8 s

Целых 3 секунды на 1 проход. Подобных вычислений нужно много. Да и реальный датасет 0.5М строк, а не 20к.

Как считать скользящую медиану быстрее?


Ответы (1 шт):

Автор решения: MaxU

Воспользуйтесь встроенными методами Pandas:

In [265]: %timeit sr.rolling(1000).median()
14.4 ms ± 513 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [266]: %timeit sr.rolling(1000).apply(lambda x: np.median(x))
1.72 s ± 88.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

на моем ноуте разница в 119 раз...

PS также возникает вопрос - зачем делать это много раз? Если речь идет о медианных значениях разных столбцов в одном скользящем окне, то это тоже делается векторизированными методами Pandas без циклов.

→ Ссылка