Как быстро рассчитать медиану фрейма данных на скользящем окне данных?
Генерирую случайный датасет и на скользящем окне в 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 без циклов.