在Pandas DataFrame上更快的rolling_apply?

 剪子61_199 发布于 2022-12-25 08:24

改进这个问题提供了一个聪明的解决方案,用于在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,可以应用于更广泛的问题集

编辑:性能计时校正

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有