Улучшение на this question, которое обеспечило умное решение для применения функции по нескольким столбцам в DataFrame, мне интересно, можно ли оптимизировать решение для скорости.Быстрее roll_apply на Pandas DataFrame?
Окружающая среда: Python 2.7.8, Pandas 14.1, Numpy 1.8.
Вот пример настройки:
import pandas as pd
import numpy as np
import random
def meanmax(ii,df):
xdf = df.iloc[map(int,ii)]
n = max(xdf['A']) + max(xdf['B'])
return n/2.0
df = pd.DataFrame(np.random.randn(2500,2)/10000,
index=pd.date_range('2001-01-01',periods=2500),
columns=['A','B'])
df['ii'] = range(len(df))
res = pd.rolling_apply(df.ii, 26, lambda x: meanmax(x, df))
Обратите внимание, что функция meanmax
не попарно, что-то вроде rolling_mean(df['A'] + df['B'],26)
не будет работать.
Однако я могу сделать что-то вроде:
res2 = (pd.rolling_max(df['A'],26) + pd.rolling_max(df['B'],26))/2
который завершает примерно 3000X быстрее:
%timeit res = pd.rolling_apply(df.ii, 26, lambda x: meanmax(x, df))
1 loops, best of 3: 1 s per loop
%timeit res2 = (pd.rolling_max(df['A'],26) + pd.rolling_max(df['B'],26))/2
1000 loops, best of 3: 325 µs per loop
Есть ли что-нибудь лучше/эквивалент, чем второй вариант выше, учитывая пример функции и используя rolling_apply
? В то время как второй вариант быстрее, он не использует rolling_apply
, который может быть применен к более широкой задаче установить
Редактировать: Производительность коррекция времени
Er ..это 325 микросекунд против 1 секунды, что более чем в 1000 раз быстрее, чем вы понимаете. – EdChum
Действительно, я даже не удосужился заметить «μ» там ... Спасибо за исправление – bazel