改进这个问题,该问题提供了一种在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
哪个完成速度大约快了3000倍:
%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
,这可以应用于更广泛的问题集。
编辑:性能计时校正