在Python中转换表格数据
作者:互联网
介绍
这一切都从简陋的桌子开始。一个从未真正“发明”过的概念,因为它从最早的记录保存形式中不断完善。即使在今天,或者更确切地说,特别是在今天,在表中存储和转换数据的方法也在不断发展。从比以往任何时候都更强大的PostgreSQL等关系数据库,到Dask或Spark等极其可扩展的地图减少解决方案。当然,还有古老的电子表格。
但回到你的困境:你想在Python中工作并保持简单,所以没有独立的SQL或分布式系统。在这种情况下,有所有数据框架和数据表框架可供选择。让我们比较四个流行的:Pandas(现任者)、Polars(挑战者)、PyArrow(低级柱状)和DuckDB(正在进行/嵌入式分析SQL)。
文档和生态系统
与任何要尝试的新库一样,易用性和开始黑客攻击的速度是一个很大的考虑因素。在这方面,最强的竞争者是Pandas和DuckDB。Pandas拥有庞大的文档、教程和问答线程生态系统。如果某些数据类型没有内置,很有可能有人已经为它编写了一个库。DuckDB的比较方式取决于您对SQL的熟悉程度(请查看我们之前的博客文章以了解一些上下文)。对于那些熟悉古代咒语的人来说,开始使用可能比熊猫更快。双重地考虑到DuckDB的示例丰富文档。
极地也有广泛的记录。但在生态系统和支持方面,它无法与熊猫竞争(它在StackOverflow上的问题减少了200多倍)。来自Polars的错误消息有时也可能非常神秘,因为它使用额外的抽象层(Rust和Arrow)。这一切都使首次用户的实验变得更加困难。
最后,PyArrow故意是一个较低级别的框架。它在很大程度上是其他图书馆的积木。这反映在文档中,文档更具技术性,更不像教程。不过,如果你愿意付出努力,它是一个特别强大的工具。
必须快点走
熊猫只能以大约30公里/小时的速度奔跑,所以它们无法与一些鸭子可以达到的80公里/小时+空速相媲美......啊,等等,不,Python库,不是动物群。让我们再试一次。
使用大约2.5 GB / 8,500,000行带有分类信息的鸟类目击数据集,我在四个库上运行了一些基准。第一次测试执行一个简单的分组操作,使用数据集的一部分计算每个物种的目击次数。在我的机器(M2 Pro MacBook,16GB RAM)上,这种转换与PyArrow相当相当的60毫秒,Polars为130毫秒,DuckDB为160毫秒。不过,Pandas是一个有趣的案例:使用其默认的c引擎,它是迄今为止最慢的,需要超过1.6秒才能完成。不过,使用其实验性的PyArrow引擎,结果将得到震荡:熊猫只花了80毫秒,击败了除PyArrow以外的所有人。虽然绝对数字并不重要,但库之间的相对差异很能说明问题。这也很好地转化为其他简单的操作和小数据集。
看着一个使用整个分类表的更复杂的转换,事情确实发生了一些变化。第二次测试执行两个连接和一些列计算,计算每个分类群和特定地理区域内每个物种的目击次数。不幸的是,这里还不能使用PyArrow引擎;所以你只需要想象带有PyArrow的熊猫会在这里表现得与Polars相似[1]。
不过,这两项测试的大局是一样的:Polars、DuckDB和(可能还有)PyArrow的Pandas的性能具有可比性,而具有默认引擎的Pandas则要慢得多。对于非常小的数据集,这种差异可以忽略不计。但对于像这样的中型数据集,特别是对于大型数据集或重复性任务,影响可能很大。
使用Polars或DuckDB over PyArrow等更高级别的库也是一个好主意,因为后者需要更多关注才能优化性能。与此相关,Dataroots鲁汶办公室周围的大多数水鸟物种都属于鸭子/鹅/天鹅科。这里绝对没有北极熊。对我来说,这听起来像是科学证明DuckDB的去向
标签:Pandas, Python, PostgreSQL 来源: