当前位置: 首页 > 后端技术 > Python

本文带你掌握常用的Pandas性能优化方法,让你的pandas飞起来!

时间:2023-03-26 17:05:47 Python

微信公众号:《Python读金融》有什么问题或者建议欢迎留言公众号Pandas是Python数据处理分析的神龙刀。有一些技巧和注意事项,特别是对于较大的数据集,如果您不正确使用它们,可能会使Pandas变得非常慢。对于程序员/元来说,时间就是生命。本文总结了一些常见的pandas性能优化方法,希望对大家有所帮助!1.数据读取优化读取数据是数据分析前的必要环节。pandas也内置了很多数据读取功能。最常见的是使用pd.read_csv()函数从csv文件中读取数据,读取不同格式的文件有什么区别?哪种方式更快?让我们做一个实验来比较。这里使用的数据一共59万行,分别保存为xlsx、csv、hdf、pkl格式,每种格式读取10次得到如下结果。可以看出,同样的数据,pkl格式的数据读取速度最快,是读取csv格式数据的近6倍,其次是hdf格式的数据,xlsx格式的数据读取速度最差(这只是一个大小只有15M左右的数据集)。所以对于日常的数据集(多为csv格式),可以先用pandas读入,然后将数据转为pkl或者hdf格式,这样每次读数据的时候可以节省一些时间。代码如下:importpandasaspd#readcsvdf=pd.read_csv('xxx.csv')#pklformatdf.to_pickle('xxx.pkl')#saveformatdf=pd.read_pickle('xxx.pkl')#读取#hdf格式df.to_hdf('xxx.hdf','df')#保存格式df=pd.read_hdf('xxx.pkl','df')#读取2.进行聚合操作时优化使用agg和transform进行操作时,尽量使用Python自带的函数来提高操作效率。(以上测试用例仍然是数据)1.agg+Python内置函数2.agg+非内置函数可以看到对于agg方式,使用时运行效率提升了60%内置函数。3.transform+Python内置函数4.transform+非内置函数对于transform方法,使用内置函数时运行效率提高一倍。3、对数据进行逐行操作时的优化假设我们现在有这样一个用电量数据集和对应时间段的电价,如下图所示:数据集记录了每小时的用电量,比如第一行代表2001年1月13日零点,用电0.586kwh。电费的价格在不同的使用时段是不同的。我们现在的目标是求出总电费,那么我们需要计算相应时期的单位电费×用电量。下面给出三种写法。我们分别对这三种处理方式进行测试,比较这三种写法的差异和代码效率的差异。#写函数获取对应结果defget_cost(kwh,hour):if0<=hour<7:rate=0.6elif7<=hour<17:rate=0.68elif17<=hour<24:rate=0.75else:raiseValueError(f'Invalidhour:{hour}')returnrate*kwh#Method1:简单循环defloop(df):cost_list=[]foriinrange(len(df)):energy_used=df.iloc[i]['energy_kwh']hour=df.iloc[i]['date_time'].hourenergy_cost=get_cost(energy_used,hour)cost_list.append(energy_cost)df['cost']=cost_list#方法二:应用方法defapply_method(df):df['cost']=df.apply(lambdarow:get_cost(kwh=row['energy_kwh'],hour=row['date_time'].hour),axis=1)#方法三:用isin过滤出每个时间段,分段处理df.set_index('date_time',inplace=True)defisin_method(df):peak_hours=df.index.hour.isin(range(17,24)))simple_hours=df.index.hour.isin(range(7,17))off_peak_hours=df.index.hour.isin(range(0,7))df.loc[peak_hours,'cost']=df.loc[peak_hours,'energy_kwh']*0.75df.loc[simple_hours,'cost']=df.loc[simple_hours,'energy_kwh']*0.68df.loc[off_peak_hours,'cost']=df.loc[off_peak_hours,'energy_kwh']*0.6测试结果:可以看出使用isin()过滤掉相应数据后单独计算的速度是简单循环的近606倍。这并不意味着isin()有多强大?方法3速度快,因为它使用了向量化数据处理(这里的isin()是其中一种方法,还有其他方法,大家可以试试)。这是什么意思?这里画了一个简单的图,大家可以结合这个图和代码来理解是一个一个处理比较快,还是把能执行相同操作的分开处理比较快。4、使用numba进行加法如果你的数据处理过程涉及到大量的数值计算,那么使用numba可以大大加快代码的运行效率。numba使用起来也非常简单。让我为您演示一下。(代码处理没有实际意义,只是为了展示效果)首先需要安装numba模块>>>pipinstallnumba下面用一个简单的例子来测试一下numba的提速效果importnumba@numba.vectorizedeff_with_numba(x):returnx*2deff_without_numba(x):returnx*2#方法一:应用逐行操作df["double_energy"]=df.energy_kwh.apply(f_without_numba)#方法二:向量化操作df["double_energy"]=df.energy_kwh*2#方法三:使用numba加速#需要以numpy数组形式传入#否则会报错df["double_energy"]=f_with_numba(df.energy_kwh.to_numpy())从测试结果来看,向量化处理再次凸显,同时numba可以将本来就很快的向量化处理效率提高一倍以上。有关如何使用numba的更多信息,请参阅numba的文档。参考资料:1.https://pandas.pydata.org/pan...2。https://realpython.com/fast-f...3。https://www.cnblogs.com/wkang..原创不易。如果觉得有用,希望大家点个赞。谢谢大家。扫描二维码关注公众号《Python读钱》,干货第一时间获取!