首页后端开发Python使用polars进行数据分析

使用polars进行数据分析

时间2023-04-12 22:18:01发布访客分类Python浏览1571
导读:日常工作中我经常会收到数据分析的需求,目前大部分常规任务都可以在公司内部的 BI 平台(基于 superset)上完成。不过业务数据需要先同步到数据仓库后才能在 BI 平台内使用,偶尔还是需要在本地进行一些离线数据分析,我一般会使用 pan...

日常工作中我经常会收到数据分析的需求,目前大部分常规任务都可以在公司内部的 BI 平台(基于 superset)上完成。

不过业务数据需要先同步到数据仓库后才能在 BI 平台内使用,偶尔还是需要在本地进行一些离线数据分析,我一般会使用 pandas。作为老牌的数据分析工具,pandas 基本上可以满足日常的数据分析需求,但是在处理大数据时,pandas 的性能就显得不够优秀了,并且会占用大量的内存。另外在进行多个数据源的联合查询时,pandas 也不够灵活。

最近调研了一下 polars库,体验相当不错,已经可以说服我将 pandas 替换为 polars 了。今天就来简单介绍一下 polars。

polars 简介

polars是一个基于 Rust 的数据分析库,它的目标是提供一个高性能的数据分析工具,同时也提供了 Python 的接口。

polars 最核心的概念是表达式(expressions),也是其拥有快速性能的核心。polars 提供了一个强大的表达式 API。表达式 API 允许你创建和组合多种操作,例如过滤、排序、聚合、窗口函数等。表达式 API 也可以优化查询性能和内存使用。

polars VS pandas

polars 与 pandas 在许多方面具有截然不同的设计与实现。

  • 不像 pandas 中每个 DataFrame 都有一个索引列(pandas 的很多操作也是基于索引的,例如 join 两个 DataFrame 进行联合查询),polars 并没有 Index 概念。
  • polars 使用 Apache Arrow 作为内部数据格式,而 pandas 使用 NumPy 数组。
  • polars 提供比 pandas 更多的并发支持。
  • polars 支持惰性查询并提供查询优化。

polars 提供了与 pandas 相似的 API,以便于用户更快地上手。但是按照 pandas 语法编写的 polars 代码虽然可以工作,但很有可能会更慢(与推荐用法相比)。具体可以参考

官方文档

实战

下面我们用一个实际的例子来演示如何使用 polars 进行数据分析,并与 pandas 进行对比。

安装 polars

pip install polars

数据集选择

为了体现 polars 在处理大数据集时的优势,我从阿里天池平台下载了一份淘宝用户购物行为数据集,解压后有 3.4Gb,共一亿条数据。

载入数据集

我们使用 polars 的惰性计算 API 来载入数据集,可以有效减少内存开销,并且可以进行更有效的查询优化。

load data lazyload data

我们使用了scan_csv函数延迟加载数据集,并且指定了每一列的名称。

对比使用 pandas 将全部数据载入内存花费了一分钟,polars 的scan_csv方法可以瞬间执行完成。

!-- more -->

展示数据

可以通过head方法展示数据集的前 5 行,由于我们是延迟加载的数据,需要先通过collect方法将数据载入 Dataframe 中。

head

collect方法实际上载入了所有的数据,我们完全可以通过limit方法限制所需的行数。

collect

我们可以查看p.limit(5)的查询计划。

plan

在实际执行查询时,polars 会对计划进行一定的优化,可以通过describe_optimized_plan方法查看。

optimized plan

进行数据分析

我们可能想要知道不同的商品类目的访问数据,包括 UV 和 PV。可以分别使用 polars 和 pandas 进行聚合查询。

uv pv

在这个查询计划中,我们首先过滤出所有的 pv 行为,然后只关注 CATEGORY_ID 和 UID 两列数据,按照 CATEGORY_ID 分组,统计每个分组下的独立 UV 数量和 PV 数量,并按照 PV 数据从大到小排序,保留前二十条数据。可以看一下优化后的执行计划。

uv pv plan

调用collect方法执行查询,用时 11 秒。

uv pv result

使用 pandas 进行同样的查询,用时 42 秒。

pandas uv pv

可以看到在大数据集下,polars 拥有明显的性能优势。

在 polars 中使用 SQL 查询

polars 提供了 SQL 查询的支持,可以创建一个 SQLContext 对象,然后使用sql方法执行 SQL 查询。

sql context

然后编写 sql 语句查询商品类目的访问数据。

sql query

查看 sql 查询的执行计划,与之前之前使用 Python API 进行查询的执行计划基本相同。实际上 polars 会将 SQL 查询解析为一个语法树,然后将语法树转换为 polars 的表达式 API。

sql plan

执行查询,用时 9 秒。

sql result

使用 SQL 进行跨表联合查询

polars 提供 join 方法进行联合查询,不过 join API 比较繁琐,也不是很直观,我们可以使用 SQL 进行跨表联合查询。

首先定义一个 LazyFrame cat_info,包含商品类目的基本信息。

define lazy frame

然后将 cat_info 注册为一个临时表。

register new table

修改之前的 SQL 查询,使用cat_info表进行联合查询,在结果中包括每个类目的名字。

sql join

可以查看一下执行计划。

join plan

执行查询,用时 12 秒。

join result

利用 polars 的 SQL 查询功能,我们可以借助已有的 SQL 知识,快速进行数据分析。

总结

polars 是一个高性能的 DataFrame 库,提供了类似 pandas 的 API,可以很方便地进行数据分析。

polars 的惰性计算 API 可以有效减少内存开销,并且可以进行更有效的查询优化。

polars 还提供了 SQL 查询的支持,可以借助已有的 SQL 知识,快速进行数据分析。

PS

公司最近在招聘研发工程师,坐标杭州,欢迎大家踊跃投简历

招聘内推

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

python数据分析

若转载请注明出处: 使用polars进行数据分析
本文地址: https://pptw.com/jishu/2736.html
Python + edge-tts:一行代码,让你的文本轻松变成语音! [oeasy]python0129_unicode_中文字符序号_十三道大辙_字符编码解码_eval_火星文

游客 回复需填写必要信息