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

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

Polars简介

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

性能优势

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

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

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

适用场景

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

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

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

数据聚合与旋转案例

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

python 复制代码
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函数与聚合函数相结合来生成所需格式。下面将深入介绍如何有效地执行这些操作。

python 复制代码
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 函数

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

python 复制代码
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"预聚合数据:

python 复制代码
(
    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以提高清晰度,这些策略都可以增强输出的可读性和可用性,特别是在处理大容量数据时。

相关推荐
梦想画家1 个月前
dbt 数据分析工程实战教程(汇总篇)
数据治理·数据工程·分析工程
梦想画家2 个月前
理解dbt artifacts及其实际应用
数据治理·数据转换·1024程序员节·数据工程·分析工程
梦想画家2 个月前
Dbt增量策略模型实践指南
大数据·数据治理·数据工程·分析工程
梦想画家2 个月前
DBT hook 实战教程
数据治理·数据工程·分析工程
叶庭云2 个月前
数据异质性与数据异构性的本质和举例说明
人工智能·数据科学·数据异构性·数据工程·数据异质性
梦想画家3 个月前
dbt compile 命令及应用
数据仓库·数据转换·分析工程
梦想画家3 个月前
dbt seed 命令及应用示例
数据转换·数据工程·分析工程
jia V iuww5204 个月前
Large Scale Data Engineering EMATM0051
数据工程
数字化营销工兵7 个月前
微软如何打造数字零售力航母系列科普11 - 什么是Microsoft Fabric中的数据工程?
microsoft·fabric·数据工程·lakehouse·apachespark·datapipeline