Pandas:如何让你的代码性能飙升
在数据分析相关的工作中,Pandas
无疑是一个强大的工具,它的易用性和灵活性广受青睐。然而,随着数据量的不断增长和计算需求的日益复杂,Pandas
代码的性能问题也逐渐浮出水面。如何让Pandas
代码运行得更快、更高效,成为了每一个人使用者都需要面对的挑战。
今天,本文就一个简化版的实际分析案例,来一起探讨Pandas
代码如何写才能性能更好,让你的数据处理流程更加顺滑,不再为漫长的等待运行而烦恼。
1. 案例介绍
假设有个股票分析的场景,我们需要给所有的股票每天的交易情况做一个评估,评估的结果有 3 个级别:优,中,差。其中,“优”的条件是当天成交额大于 10 亿且收盘价大于开盘价,也就是股票上涨;“差”的条件是当天成交额小于 1 亿且收盘价小于开盘价,也就是股票下跌;除此之外的情况就是“中”。
再次强调一下,这是一个简化的评估方法,主要是为了下面演示 Pandas 的代码性能,真实的评估不会如此粗糙。
股票交易的数据来自 A 股 2024 年 1,2 月份的日交易数据,大约 20 多万条。数据可从地址 https://databook.top/stock/2024 下载。
导入数据:
2. 不同写法的性能比较
下面是 3 种代码的写法都是基于pandas
的,完成的功能也是一样的。
2.1. 循环遍历
给每条数据加一个评估的指标,最直接想到的方法就是遍历所有的数据,然后根据每条数据的情况,给予一个评估指标(优,中,差)。
首先,封装一个评估一条数据的函数:
然后用遍历的方式评估我们准备的数据(A 股 2024 年 1,2 月份的日交易数据)。
虽然只有 20 多万条数据,但是执行时间还挺长的,在jupyter notebook
中用 %%timeit
魔法函数测试性能如下。
运行结果:
执行一次要 36 秒多,效率很低。
2.2. apply 方法
apply
方法是pandas
提供的一种灵活处理数据的接口,它允许我们传入一个自定义函数来处理数据。下面我们看看这种方式的性能如何。
运行结果:
性能提升非常明显(36.4 秒->4.9 秒),代码也变得更加简洁。
2.3. 向量化方法
最后,我们看看终极的写法,这种写法把pandas
的数据结构DataFrame
看成是一个一维的向量数组(每列一个向量),而不是一个二维的数值数组。这样,我们操作数据是以列为单位来操作,看看这样写的性能如何:
运行结果:
运行时间几乎可以忽略不计。
3. 总结
同样使用pandas
写数据分析的代码,性能差距居然会如此天差地别。
可见,学习pandas
,不仅仅是学习它的各种接口和函数,更重要的是了解从pandas
执行的角度应该如何看待数据,是把数据看成一个一个独立的值,还是一行一行或一列一列的向量。只有这样,才能用pandas
高效的处理数据,这在数据量膨胀之后,会大大提高我们分析的效率。
文章转载自:wang_yb
评论