比较 pandas 和 Polars 的处理速度和易用性

如果使用 Python,肯定会使用的库之一就是 pandas。
这是一个优秀的库,可以轻松处理表数据,其中一个后继者的库是 Polars。

尤其是在速度方面比pandas有优势,可以看作是能够解决pandas的弱点。

这次,想测量一下 pandas 和 Polars 之间的处理速度,并验证哪一个更好,包括易用性。
最后总结以下三点:

  • 执行速度
  • library的便利
  • 可以用polar取代pandas吗?

使用的数据集

将使用 Kaggle 的 Home Credit Default Risk。 选择它是因为窃以为这是试用财务表数据的各种流程的好方法。

pandas 和 Polars 处理的比较

将用 pandas 和 Polars 来比较处理速度和编程写法。 环境是本地jupyter,所以环境的不同可能会有差异。

pip install polars pandas

import

import pandas as pd
import polars as pl

1. 加载数据

首先,尝试加载数据。 可以正常使用 read_csv 来调用两者。

# pandas
pd_application_train = pd.read_csv('./home-credit-default-risk/application_train.csv')
# 1.17s
# polars
pl_application_train = pl.read_csv('./home-credit-default-risk/application_train.csv')
# 966ms

Pandas 的处理时间为 1.17 秒,Polars 的处理时间为 966 毫秒,所以 Polars 获胜。 (约1.2倍差异)

顺便说一句,两种情况下统计数据的写入方式和第一行的写入方式是相同的。

# describe(pandas稍微快一点)
pd_application_train.describe() # 789ms
pl_application_train.describe() # 939ms

# head(polars稍微快一点)
pd_application_train.head() # 151us
pl_application_train.head() # 116us

2.表格操作

从这里开始,使用基于特征工程的表操作进行各种比较。 首先,将继续进行特征工程并从其他表进行连接。

由于可以在其他表中看到过去的历史记录,所以提取 ID 的出现频率。
所以虽然处理是一样的,但这里pandas和polars的写法不一样。

# pandas
previous_loan_counts_pd = bureau_pd.groupby('SK_ID_CURR', as_index=False)['SK_ID_BUREAU'].count().rename(columns={
    
    'SK_ID_BUREAU': 'previous_loan_counts'})
# 76.3 ms

↑ 大约1.18倍的差异 ↓

# polars
previous_loan_counts_pl = (
    bureau_pl.groupby('SK_ID_CURR')
    .agg(pl.col('SK_ID_BUREAU').count().alias('previous_loan_counts'))
# 90.3 ms

代码下面列出了执行时间,但 pandas 在这个过程中速度更快。

3.表连接

连接上面创建的表和加载的表。
写法略有变化。

# pandas
pd_application_train = pd.merge(
	pd_application_train, previous_loan_counts_pd, 
	on='SK_ID_CURR', how='left')
# 139ms

↑ 大约4.74倍的差异 ↓

# polars
pl_application_train = pl_application_train.join(
    previous_loan_counts_pl,
    on='SK_ID_CURR',how="left"
)
# 29.3ms

Polars 在这里显然更快。
由于上述过程是用Polars重现的,因此行为是否完全相同值得商榷。

4.填写缺失值

将上面合并表中的缺失值填入 0。 在这里,两者的写法也略有不同。

# pandas
pd_application_train = pd_application_train.fillna(0)
# 557ms

↑ 大约20.3倍的差异 ↓

# polars
pl_application_train = pl_application_train.fill_null(0)
# 27.4ms

Polars 填充缺失值的速度也更快。
内部处理是否相同值得商榷,但简单的比较显示速度有相当大的差异。

顺便说一句,当删除包含缺失值的记录时,得到以下结果。

# pandas
pd_application_train.dropna(subset=["previous_loan_counts"])
# 93.5ms

↑ 大约10.2倍的差异 ↓

# polars
pl_application_train.drop_nulls(subset=["previous_loan_counts"])
# 9.13ms

使用 Matplotlib 进行可视化

还想看看数据可视化。 尝试用 Matplotlib 可视化目标变量时是否有变化,以及它的编写方式是否发生变化。

# pandas
plt.figure(figsize=(8, 5))
sns.countplot(x='TARGET', data=pd_application_train )
plt.title('Distribution of TARGET Variable')
plt.show()
# 1.07s

↑ 大约6.0倍的差距 ↓

# polars
plt.figure(figsize=(8, 5))
sns.countplot(x=pl_application_train['TARGET'].to_numpy())
plt.title('Distribution of TARGET Variable')
plt.show()
# 178ms

polar更快,但似乎需要将其转换为 numpy 一次。
这可能是速度的一个因素,但是替换时要记住的一点是可视化改变时的写入方式。
显示的数字之间没有特别的差异。
在这里插入图片描述

One-Hot Encoding

还将研究如何对特定分类数据进行 one-hot 编码的差异。 有一个名为 CODE_GENDER 的列,它用标签表示性别,因此将每个列转换为虚拟变量,并在转换后删除该列。

# pandas
gender_dummies = pd.get_dummies(pd_application_train['CODE_GENDER'])
pd_application_train = pd.concat(
[pd_application_train.drop('CODE_GENDER', axis=1), gender_dummies], axis=1)
# 119ms

↑ 大约6.18倍的差异 ↓

# polars
gender_dummies = pl_application_train.select(pl.col("CODE_GENDER")).to_dummies()
pl_application_train = pl.concat(
[pl_application_train.drop("CODE_GENDER"),gender_dummies],how="horizontal")
# 19.3ms

仍是Polar较快。 由于只对一列进行了编码,因此其编写方式没有太大差异。
然而,Polar似乎很难用一两行代码同时编码多个分类变量。
从这方面来说,pandas 更方便。

概括

正如上面提到的,将根据三点比较Pandas和Polar:

执行速度

Polar 在速度方面具有明显的优势。 看起来pandas可能在某些处理上更胜一筹,但总体来说,就简单的处理速度而言,polars更胜一筹。 如果速度对您来说很重要,那么Polars可能是个好主意。

library的便利

接下来,pandas作为library更方便。 这特别方便,因为库将为您处理许多部分,而无需您自己指定。 至于polars,有很多用pandas可以轻松完成的事情却相当麻烦,无法仅用一行代码来复制。

从代码复杂度来说,polars很多地方的写法都比较麻烦。
如果想处理相当复杂的表格,pandas 并不难,但如果想用 Polars 来做,可能会用更多的时间来搜索和调查。 因此意识到 pandas 的稳定性是因为是次研究的两种写法是不同的。

可以替换吗?

在某些情况下,可能会使用polar来加速,比如 pandas 需要很长时间处理的内容。 问题是这种更换能否顺利进行。

总而言之,看来要替换它并不容易。
首先,有一些常见的写法,但是如果过程变得有点复杂,可能很难重现pandas过程。

此外,由于版本的差异,不能像现在分享的那样写。就稳定性而言,将其融入到产品中使用时需要小心。 此外,考虑到从 pandas 重写为 Polars 所需的工作量,过程越复杂,编写代码可能花费的时间就越多。

因此,看起来首选还是 pandas。
然而,如果只做非常简单的表操作,那么使用它来提高速度似乎是划算的。

猜你喜欢

转载自blog.csdn.net/Allan_lam/article/details/134947840