改进这个问题提供了一个聪明的解决方案,用于在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
?虽然第二个选项更快,但它不使用a rolling_apply
,可以应用于更广泛的问题集
编辑:性能计时校正