📢 转载信息
原文链接:https://www.kdnuggets.com/10-polars-one-liners-for-speeding-up-data-workflows
原文作者:Iván Palomares Carrascosa
Image by Editor
# 介绍
Pandas无疑是用于管理和分析数据工作流的强大而通用的库,在数据科学的宏大图景中具有基础性作用。然而,当数据集变得非常大时,它可能不是最高效的选择,因为它主要在单个线程中运行,并严重依赖 Python 解释器,这可能导致显著的处理时间。
本文将焦点转移到一个可以加速类似 Pandas 操作的新库:Polars。特别是,我将分享10个富有洞察力的 Polars 单行代码,以简化和加速日常的数据操作和处理任务。
在开始之前,别忘了首先import polars as pl!
# 1. 加载 CSV 文件
Polars 从 CSV 文件读取数据集的方法看起来与其 Pandas 对应项非常相似,但它是多线程的(内部用 Rust 编写),使其能够以更有效的方式加载数据。此示例展示了如何将 CSV 文件加载到 Polars DataFrame 中。
df = pl.read_csv("dataset.csv")
即使对于中等大小的数据集(不仅仅是超大型数据集),使用 Polars 读取文件所需的时间差异可能比使用 Pandas 快大约 5 倍。
# 2. 惰性加载以实现更具可扩展性的工作流
创建所谓的“惰性数据帧”(lazy dataframe)而不是一次性急切读取它,是一种允许在整个数据工作流中链接后续操作的方法,只有当collect()方法最终被调用时才会执行这些操作——这对于大规模数据管道来说是一个非常方便的策略!以下是如何使用scan_csv()方法应用惰性数据帧加载的方法:
df_lazy = pl.scan_csv("dataset.csv")
# 3. 选择和重命名相关列
为了使后续处理更轻松、更清晰,确保你只处理数据集中与你的数据科学或分析项目相关的列是个好主意。以下是如何使用 Polars 数据帧高效地完成此操作。假设你正在使用一个客户数据集,例如这个。然后,你可以使用以下单行代码来选择你选择的相关列:
df = df.select([pl.col("Customer Id"), pl.col("First Name")])
# 4. 筛选出行子集
当然,我们也可以以 Polars 的方式筛选特定的行,例如客户。此单行代码用于筛选居住在特定城市的客户。
df_filtered = df.filter(pl.col("City") == "Hatfieldshire")
你可能想使用display()或head()等方法来查看此“查询”的结果,即满足指定标准的行。
# 5. 按类别分组并计算聚合
在使用分组和聚合等操作时,Polars 效率的价值在大数据集上真正开始显现。以这个单行代码为例:关键在于在分类列上结合使用group_by,并使用agg()为每组的所有行执行聚合,例如对数值列求平均值,或者简单地计算每组的行数,如下所示:
df_city = df.group_by("City").agg([pl.len().alias("num_customers")])
请注意!在 Pandas 中,groupby()没有下划线符号,但在 Polars 中是有下划线的。
# 6. 创建派生列(简单的特征工程)
得益于 Polars 的向量化计算能力,基于现有列的算术运算创建新列要快得多。此单行代码演示了这一点(现在以流行的加州住房数据集为例进行后续示例!):
df = df.with_columns((pl.col("total_rooms") / pl.col("households")).alias("rooms_per_household"))
# 7. 应用条件逻辑
连续属性,如收入水平或类似属性,可以被分类并转化为标记的段,所有这些都以向量化且无开销的方式完成。此示例根据加州每个区的平均收入创建了一个income_category列:
df = df.with_columns(pl.when(pl.col("median_income") > 5).then(pl.lit("High")).otherwise(pl.lit("Low")).alias("income_category"))
# 8. 执行惰性管道
这个单行代码虽然稍大一些,但它整合了前面示例中的一些思想,以创建一个通过collect方法执行的惰性管道。请记住:要使这种惰性方法生效,你需要使用单行代码 2 以“惰性方式”读取数据集文件。
result = (pl.scan_csv("https://raw.githubusercontent.com/ageron/handson-ml/master/datasets/housing/housing.csv") .filter(pl.col("median_house_value") > 200000) .with_columns((pl.col("total_rooms") / pl.col("households")).alias("rooms_per_household")) .group_by("ocean_proximity").agg(pl.mean("rooms_per_household").alias("avg_rooms_per_household")) .sort("avg_rooms_per_household", descending=True) .collect())
# 9. 连接数据集
假设我们有一个名为region_stats.csv的附加数据集,其中包含为加州各区收集的统计信息。然后我们可以使用如下的单行代码,基于特定的分类列执行连接操作:
df_joined = df.join(pl.read_csv("region_stats.csv"), on="ocean_proximity", how="left")
结果将是住房数据与区级元数据的高效组合,这得益于 Polars 的多线程连接,即使在处理大型数据集时也能保持性能。
# 10. 执行滚动计算
在波动剧烈的数据变量中,滚动聚合有助于平滑例如跨经度和纬度的平均房价。此单行代码说明了如何应用这种快速的向量化操作:非常适合时间序列或地理序列数据。
df = df.sort("longitude").with_columns(pl.col("median_house_value").rolling_mean(window_size=7).alias("rolling_value_avg"))
收尾
在本文中,我们列出了 10 个便捷的单行代码,用于将 Polars 作为 Pandas 的快速替代方案来高效地处理大型数据集。这些单行代码封装了快速、优化的策略,以更少的时间处理大量数据。下次在项目中处理 Polars 时使用它们,你无疑会看到各种改进。
Iván Palomares Carrascosa 是一位在人工智能、机器学习、深度学习和大型语言模型(LLMs)领域的领导者、作家、演讲者和顾问。他负责培训和指导他人如何在现实世界中利用人工智能。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区