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

news/2024/12/18 21:12:29/

在这篇博文中,我们的目标是解决数据爱好者提出的一个常见问题:如何有效地从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.ppmy.cn/news/1556206.html

相关文章

Spring Boot应用开发深度解析与实战案例

Spring Boot应用开发深度解析与实战案例 在当今快速发展的软件开发领域,Spring Boot凭借其“约定优于配置”的理念,极大地简化了Java应用的开发、配置和部署过程,成为了微服务架构下不可或缺的技术选型。本文将深入探讨Spring Boot的核心特性、最佳实践,并通过一个具体的…

rabbitMq举例

新来个技术总监,把 RabbitMQ 讲的那叫一个透彻,佩服! 生产者 代码举例 public String sendMsg(final String exchangeName,final String routingKey,final String msg) {} /*** 发送消息* param exchangeName exchangeName* param routin…

【网络安全设备系列】7、流量监控设备

0x00 定义: 网络流量控制是一种利用软件或硬件方式来实现对电脑网络流量的控制。它的最主要方法,是引入QoS的概念,从通过为不同类型的 网络数据包标记,从而决定数据包通行的优先次序。 0x01 类型: 流控技术分为两种: 一种是…

【Rust自学】3.2. 数据类型:标量类型

3.2.0. 写在正文之前 欢迎来到Rust自学的第三章,一共有6个小节,分别是: 变量与可变性数据类型:标量类型(本文)数据类型:复合类型函数和注释控制流:if else控制流:循环 通过第二章…

探索Django:从项目创建到图片上传的全方位指南

Django是什么 Django 是一个流行的 Python Web 开发框架,它提供了一系列工具和库,用于帮助开发人员构建高效、可扩展的 Web 应用程序。Django 的目标是让开发者能够以快速和简单的方式构建复杂的 Web 应用,通过提供许多预构建的组件和功能&a…

xshell连接虚拟机,更换网络模式:NAT->桥接模式

NAT模式:虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码,只要宿主机能够访问网络,虚拟机也能够访问。对外部网络而言,它看到的是宿主机的IP地址,而不是虚拟机的IP。但是,宿主机可…

鸿蒙NEXT开发案例:经纬度距离计算

【引言】 在鸿蒙NEXT平台上,我们可以轻松地开发出一个经纬度距离计算器,帮助用户快速计算两点之间的距离。本文将详细介绍如何在鸿蒙NEXT中实现这一功能,通过简单的用户界面和高效的计算逻辑,为用户提供便捷的服务。 【环境准备…

400G/800G光模块崛起:AI时代的网络基础设施革命

随着AI技术的不断成熟,各行各业都在大规模投入AI。医疗行业通过AI技术实现了更精准的诊断和治疗;金融行业通过AI技术提高了风险管理能力;制造行业通过AI技术优化了生产流程;娱乐行业通过AI技术创造了更加丰富的用户体验。AI在医疗…