数据零拷贝,设计更现代,性能翻10倍!在用Pandas的同学赶紧换库

Adair品科技 2024-09-04 15:31:10

智能化、流媒体快速增长的时代,每天都会产生海量数据。在处理这些数据时,我们需要的从上而下的系统性设计,包括存储、维护、分析、查询、展示等等。回归到个人,日常工作中我们也会经常有一些重复性的数据分析工作,Python作为一种入门门槛低,使用简单,拥有丰富的操作库。它不仅能够处理复杂数据,甚至于当前火热的人工智能,在引入Python库后也能几行代码实现。

回归正题,在大数据处理领域Pandas库绝对是人人都应该用过且非常熟悉的。它是很多科学库的依赖库,Pandas的优势是:发布早,具有更好的兼容性,Pandas是与整个Python数据科学生态系统一起成长的,与构成机器学习流水线的其他软件包具有最大的互操作性。在看到它的优势的同时,我们也逐渐发现了Pandas的不足,其中Pandas最大的不足:性能。

Pandas VS Polars

相反,Polars最大的优势就是性能,它执行常见运算的速度是Pandas的5~10 倍,且同时Polars运算内存需求远低于Pandas:通常Pandas需要输入数据集5~10倍左右的RAM来执行运算,而Polars只用 2~4倍。

为什么Polars会有这么好的性能呢?主要还是因为Polars底层是Rust语言(一种和C/C++一样快的低级语言)编写。而Pandas是在NumPy这样的Python库基础上编写的,虽然NumPy的核心是C编写,但它仍然受到 Python 处理内存中某些类型时的固有问题的影响。另外,Rust语言允许安全并发,并行能力更强。而Pandas只有一个核心执行运算,自然性能要差不少。

内存占用方面,Polars采用了Apache Arrow(一种独立于语言的内存格式),具有互操作性优势,数据无需通过序列化和反序列化以进行传递,进程间无需创建副本,直接共享相同的数据。此外,Pandas基于NumPy,在处理整数和浮点列方面非常出色,但难以应对其他数据类型,在处理大数据集时,Pandas可能会使用大量内存。

为了方便换库,Polars还提供了类似于Pandas的API,使得学习和迁移到Polars的成本相对较低。并且Polars是一个开源项目,鼓励社区参与和贡献。

使用举例

安装Polars

pip3 install polars

Polars 举例

Polars 提供了从各种来源加载数据的便捷方法,包括 CSV 文件、Parquet 文件和 Pandas DataFrames。读取 CSV 或 parquet 文件的方法与 Pandas 库相同。

例子1:我们先设计一张泰坦尼克号乘客数据集的 CSV 文件。这个数据集通常包含乘客的各种信息,如性别、年龄、票务类别等,以及他们是否存活。

# read a csv file from localimport polars as pldf = pl.read_csv('d://test.csv')# 打印出csv文件的前5行print(df.head())# 分组和聚合操作survival_rate_by_gender = df.groupby("Sex").agg([ pl.col("Survived").mean().alias("Survival Rate")])print(survival_rate_by_gender)# 复杂操作:按年龄类别分组,并计算存活率df = df.with_column( pl.when(pl.col("Age") < 12).then("Child") .when((pl.col("Age") >= 12) & (pl.col("Age") < 18)).then("Teenager") .when((pl.col("Age") >= 18) & (pl.col("Age") < 60)).then("Adult") .when(pl.col("Age") >= 60).then("Senior") .otherwise("Unknown") .alias("Age Group"))survival_rate_by_age_group = df.groupby("Age Group").agg([ pl.col("Survived").mean().alias("Survival Rate")])print(survival_rate_by_age_group)

例子2:我们有一张英雄信息表,包括名字、武力、门派等信息。

import polars as pl# 读取江湖中的英雄帖(数据集)df = pl.read_csv("heroes.csv")# 选出武功高强的侠客high_skill_heroes = df.filter(pl.col("武力") > 90)# 计算各门派高手数量,如同点名江湖中的豪杰sect_heroes_count = high_skill_heroes.groupby("门派").agg(pl.count())# 显示结果,一览英雄盟主print(sect_heroes_count)

总结

总的来说,Pandas是一个经过时间验证的数据处理工具,而Polars则更适用于大规模数据处理和需要更高性能的场景。选择使用哪个库取决于你对数据规模、性能和现有生态系统的需求。Polars生态上也在快速成长,未来可期。

2 阅读:127

Adair品科技

简介:软硬件工程师,评测达人,为您带来客观专业的黑科技分析