您现在的位置是:首页 >技术杂谈 >基于中文在线文档的Polars工具介绍网站首页技术杂谈

基于中文在线文档的Polars工具介绍

DeeGLMath 2024-06-17 11:27:01
简介基于中文在线文档的Polars工具介绍

Polars学习简介

Polars是一个能够提取(Extract)、转换(Transform)与加载(Load)大规模数据集的工具(快速多线程、单指令多数据流、延迟/即时执行、查询优化、混合流等)。根据官方开发人员的Benchmark结果,Polars版本号为0.8.8时,能够在143s左右导入维度在1,000,000,000*9左右,内存为50GB的数据集。与此同时,Pandas在1.2.2版本导入同样的数据集会出现out of memory的报错。

下载Polars并与工具交互

下载最新版的Polars:

pip install polars

下载Polars相关的依赖工具:

pip install 'polars[pandas]'
# pip install 'polars[numpy, pandas, pyarrow]'

参考依赖如下:

工具名描述
all下载所有的可选择依赖(下面出现的全部选项)
pandas安装Pandas用于在Pandas数据帧/系列之间转换数据
numpy安装numpy用于将数据转换到numpy数组和从numpy数组转换数据
pyarrow使用PyArrow读取数据格式
fsspec支持从远程文件系统(remote file systems)读取
connectorx支持从SQL数据库(database)中读取
xlsx2csv支持从Excel文件(files)中读取
deltalake支持从Delta Lake表中读取
timezone时区支持,只有在Python<3.9或Windows上时才需要

从源码编译Polars

如果需要一个最前沿的版本或最大的性能,你应该从源码编译Polars。首先,使用Git版本控制工具克隆源代码仓库(但是不要把编译完成的版本发布到你的个人账号或者用于商用了):

git clone https://github.com/pola-rs/polars.git

其次下载最新版的Rust编译器(因为python版本的Polars也是以Rust高性能语言作为编程后端) → Rust compiler
之后下载 maturin,使用如下命令:

pip install maturin

选择下面任意一个选项来编译你需要的Python版本的Polars:

  • 最新的二进制版本,较长的编译时间
$ cd py-polars && maturin develop --release -- -C target-cpu=native
  • 快的二进制版本,短些的编译时间
$ cd py-polars && maturin develop --release -- -C codegen-units=16 -C lto=thin -C target-cpu=native

用法案例

  • 构造DataFrame
df = pl.DataFrame(
    {
        "A": [1, 2, 3, 4, 5],
        "fruits": ["banana", "banana", "apple", "apple", "banana"],
        "B": [5, 4, 3, 2, 1],
        "cars": ["beetle", "audi", "beetle", "beetle", "beetle"],
        "optional": [28, 300, None, 2, -30],
    }
)
  • 选择上下文
(df.select([
    pl.col("A"),
    "B",
    pl.lit("B"),
    pl.col("fruits"),
]))
  • 求和
(df.select([
    pl.col("^A|B$").sum()
]))
  • 逆序选择
(df.select([
    pl.all(),
    pl.all().reverse().suffix("_reverse")
]))
  • 广播
(df.select([
    pl.all(),
    pl.all().sum().suffix("_sum")
]))
  • 用谓词过滤
predicate = pl.col("fruits").str.contains("^b.*")

df.filter(predicate)
  • 组合列
(df.select([
    "fruits",
    "B",
    pl.when(pl.col("fruits") == "banana").then(pl.col("B")).otherwise(-1).alias("b")
]))
  • 聚合
(df.groupby("fruits")
    .agg([
        pl.col("B").sum().alias("B_sum"),
        pl.sum("B").alias("B_sum2"),
        pl.first("fruits").alias("fruits_first"),
        pl.count(),
        pl.col("B").shift().alias("B_shifted")
    ])
 .explode("B_shifted")
)
  • 窗口函数
(df.select([
    "fruits",
    "cars",
    "B",
    pl.col("B").sum().over("fruits").alias("B_sum_by_fruits"),
    pl.col("B").sum().over("cars").alias("B_sum_by_cars"),
]))

这里下载可运行的Jupyter Notebook教程。

资料参考

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。