当前位置: 首页 > news >正文

Polars数据聚合与旋转实战教程

在这篇博文中,我们的目标是解决数据爱好者提出的一个常见问题:如何有效地从Polars DataFrame中创建汇总视图,以便在不同时间段或类别之间轻松进行比较。我们将使用一个实际的数据集示例来探索实现这一目标的各种方法。

Polars简介

Polars 是一个用 Rust 编写的高性能数据处理库,用于 Python 和 R 等语言。它在处理大型数据集时能够提供高效的数据处理能力,并且具有类似于 Pandas 的数据处理接口,方便数据科学家和分析师使用。
在这里插入图片描述

性能优势

并行计算:Polars 能够利用多核处理器进行并行计算。例如,在进行数据聚合操作(如计算列的平均值、总和等)或者数据筛选操作时,它可以将任务分配到多个核心上同时执行,大大提高了计算速度。相比传统的数据处理库,在处理大规模数据时这种并行计算的优势更加明显。

高效的内存管理:它对内存的使用非常高效,通过优化数据存储结构和算法,减少了不必要的内存占用。例如,在处理包含大量重复数据或者稀疏数据的数据集时,Polars 能够以更紧凑的方式存储数据,从而节省内存资源,并且能够更快地进行数据读写操作。

编译时优化:由于是用 Rust 编写,在编译阶段就可以进行许多性能优化。Rust 的编译器能够对代码进行诸如消除冗余计算、优化循环等操作,使得生成的机器码在执行时能够更高效地处理数据。

适用场景

大数据处理:在处理海量数据(如日志数据、物联网数据等)时,Polars 的高性能和高效内存管理能够发挥巨大优势,快速地进行数据清洗、转换和分析。

数据科学和分析:无论是进行探索性数据分析、数据建模还是数据可视化的前期数据处理,Polars 都可以作为一个高效的数据处理工具,帮助数据科学家更快地获取数据洞察。

数据管道构建:在构建数据管道时,需要对数据进行一系列的转换和处理操作。Polars 的高效性和丰富的数据操作方法使其成为构建数据管道的有力工具,可以确保数据在不同处理阶段的快速流动和处理。

数据聚合与旋转案例

为了说明聚合和旋转技术,让我们考虑一个简单的数据集。该数据集在几个月内跟踪不同渠道的发送和唯一id。这是我们初始数据集的样子:

import polars as pl
df = pl.DataFrame({"Channel": ["X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y"],"ID": ["a", "b", "b", "a", "e", "b", "g", "h", "a", "a", "k", "a", "b", "n", "o", "p"],"Month": ["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2"]
})

在这里插入图片描述

转换目标

我们的目标是聚合数据并计算值,例如每个通道和每个月的唯一id数量和发送总数,并以一种方便进行月与月比较的方式显示它们。

所需的格式是数据透视表,显示不同的聚合功能,如“唯一ID”和“总发送”,每月作为列:

| Channels | agg_func    | 1 | 2 |
|----------|-------------|---|---|
| X        | Uniques ID  | 3 | 3 |
| X        | Total sends | 4 | 4 |
| Y        | Uniques ID  | 4 | 3 |
| Y        | Total sends | 4 | 4 |

实现转换

  • 使用PivotAggregate 函数

使用polar实现这一目标的强大方法是利用pivot函数与聚合函数相结合来生成所需格式。下面将深入介绍如何有效地执行这些操作。

pv = df.pivot(on="Month",values="ID",aggregate_function=pl.concat_list(pl.element().n_unique().alias("value"),pl.element().count().alias("value"))
).with_columns(agg_func=["Uniques ID","Total sends"]).explode(pl.exclude("Channel"))
pv

该脚本在“Month”列上执行旋转操作,其中多个聚合函数连接在一个列表中。将结果展开,以便分离每个聚合值,输出结果如下:

shape: (4, 4)
┌─────────┬─────┬─────┬─────────────┐
│ Channel ┆ 1   ┆ 2   ┆ agg_func    │
│ ---     ┆ --- ┆ --- ┆ ---         │
│ str     ┆ u32 ┆ u32 ┆ str         │
╞═════════╪═════╪═════╪═════════════╡
│ X       ┆ 3   ┆ 3   ┆ Uniques ID  │
│ X       ┆ 4   ┆ 4   ┆ Total sends │
│ Y       ┆ 4   ┆ 3   ┆ Uniques ID  │
│ Y       ┆ 4   ┆ 4   ┆ Total sends │
└─────────┴─────┴─────┴─────────────┘
  • 使用多个Pivot 函数

另一种方法(手动但有效)是为每个想要应用的聚合函数执行单独的枢轴:

pl.concat([df.pivot(on="Month",values="ID",aggregate_function=agg_func).with_columns(pl.lit(agg_func_name).alias("agg_func"))for agg_func, agg_func_name in [(pl.element().n_unique(), "Uniques ID"), (pl.element().count(), "Total sends")]
])

数据结果如下:

shape: (4, 4)
┌─────────┬─────┬─────┬─────────────┐
│ Channel ┆ 1   ┆ 2   ┆ agg_func    │
│ ---     ┆ --- ┆ --- ┆ ---         │
│ str     ┆ u32 ┆ u32 ┆ str         │
╞═════════╪═════╪═════╪═════════════╡
│ X       ┆ 3   ┆ 3   ┆ Uniques ID  │
│ Y       ┆ 4   ┆ 3   ┆ Uniques ID  │
│ X       ┆ 4   ┆ 4   ┆ Total sends │
│ Y       ┆ 4   ┆ 4   ┆ Total sends │
└─────────┴─────┴─────┴─────────────┘
  • 旋转之前分组

或者,你可以首先使用group_by操作,在pivot之前基于“Month”和“Channel”预聚合数据:

(df.group_by("Month","Channel").agg(pl.col("ID").n_unique().alias("Uniques ID"),pl.col("ID").count().alias("Total sends")).unpivot(index=["Month","Channel"], variable_name="agg_func").pivot(on="Month", values="value")
)

总结

使用这些方法,可以在polar中有效地转换和汇总大型数据集,从而提高你的数据分析能力。无论是使用聚合列表的pivot函数,还是执行多个pivot以提高清晰度,这些策略都可以增强输出的可读性和可用性,特别是在处理大容量数据时。

http://www.lryc.cn/news/503580.html

相关文章:

  • 引用类型集合的深拷贝,无需手动写循环:Apache Commons Lang (SerializationUtils)
  • HTML、CSS表格的斜表头样式设置title 画对角线
  • docker 安装mysql 5.7 详细保姆级教程
  • Kioptrix level3
  • UE5 Lyra项目源码分析-关卡配置加载
  • Cursor重置机器码-解决Too many free trials.
  • transformer学习笔记-自注意力机制(2)
  • 呼叫中心呼入大模型如何对接传统呼叫中心系统?
  • [Unity] Text文本首行缩进两个字符
  • 最新版Chrome浏览器加载ActiveX控件之Adobe PDF阅读器控件
  • springboot 对接 ollama
  • 【数据库】选择题+填空+简答
  • 从0开始写android 之xwindow
  • The Past, Present and Future of Apache Flink
  • 多模块应用、发布使用第三方库(持续更新中)
  • An error happened while trying to locate the file on the Hub and we cannot f
  • UE5安装Fab插件
  • Linux C语言操作sqlite3数据库
  • 【人工智能】因果推断与数据分析:用Python探索数据间的因果关系
  • freeswitch(30秒自动挂断)
  • 大模型呼入机器人有哪些功能特点?(转)
  • 网络工程师常用软件之配置对比软件
  • Linux之远程登录
  • #渗透测试#漏洞挖掘#红蓝攻防#js分析(上)
  • 数智读书笔记系列006 协同进化:人类与机器融合的未来
  • 操作系统(7)处理机调度
  • folly之侵入式链表
  • GPT-5 训练遇阻:预期目标难达成与交付延期的深度剖析
  • C缺陷与陷阱 — 3 深入理解表达式
  • Linux常用指令-----中