基于Rust的Polars学习笔记

发布于:2025-06-19 ⋅ 阅读:(15) ⋅ 点赞:(0)

基于Rust的Polars学习笔记

Polars 学习笔记

Cargo.toml通用配置

[package]
name = "rustP"
version = "0.1.0"
edition = "2024"

[dependencies]
polars = { version = "0.48.1", features = ["full"]}

Quickstart

use polars::prelude::*;

let lf1 = LazyFrame::scan_parquet("myfile_1.parquet", Default::default())?
    .group_by([col("ham")])
    .agg([
        // expressions can be combined into powerful aggregations
        col("foo")
            .sort_by([col("ham").rank(Default::default(), None)], SortMultipleOptions::default())
            .last()
            .alias("last_foo_ranked_by_ham"),
        // every expression runs in parallel
        col("foo").cum_min(false).alias("cumulative_min_per_group"),
        // every expression runs in parallel
        col("foo").reverse().implode().alias("reverse_group"),
    ]);

let lf2 = LazyFrame::scan_parquet("myfile_2.parquet", Default::default())?
    .select([col("ham"), col("spam")]);

let df = lf1
    .join(lf2, [col("reverse")], [col("foo")], JoinArgs::new(JoinType::Left))
    // now we finally materialize the result.
    .collect()?;

数据结构

 极坐标提供的基本数据结构是 DataFrame、Series 和 ChunkedArray<T>。我们将提供这些数据结构的简短、自上而下的视图。

DataFrame

DataFrame 是由 Series 支持的二维数据结构,可以看作是 Vec 上的抽象<Series>。可以在 DataFrame 上执行的作类似于在 SQL 中执行的作,例如查询。您可以 GROUP、JOIN、PIVOT 等。

Series

序列是极点的类型不可知的列式数据表示。的 Series struct 和 SeriesTrait trait 提供了许多现成的作。大多数与类型无关的作由 Series 提供。类型感知作需要向下转换到由 Series 包装的类型化数据结构。底层类型化数据结构是 ChunkedArray<T>。

ChunkedArray

ChunkedArray<T> 是箭头数组的包装器,可以包含多个块,例如 Vec<dyn ArrowArray>。这些是 Polars 的根数据结构,并实现许多作。大多数作都是由 chunked_array::ops 中定义的 trait 或 ChunkedArray 结构体实现的。

Polars / Arrow 使用 packed_simd 来加速 SIMD 运算的内核。SIMD 是一个可选功能 = “nightly”,需要一个 nightly 编译器。如果您不需要 SIMD,Polars 可以在稳定版上运行!

Polars 支持 Eager API 和 Lazy API。eager API 直接产生结果,但总体上更冗长,并且不太能够构建优雅的复合查询。我们建议尽可能使用 Lazy API。

由于这两个 API 都不是异步的,因此在异步上下文中使用时,它们应该被包装在 spawn_blocking 中,以避免阻塞运行时的异步线程池。

Polars 有一个强大的概念,称为表达式。Polars 表达式可用于各种上下文,并且是 Fn(Series) -> Series 的函数映射,这意味着它们将 Series 作为输入,将 Series 作为输出。通过查看这个函数定义,我们可以看到 Expr 的输出也可以作为 Expr 的输入。

在以下数据结构 /traits 的页面中阅读更多内容。

  • DataFrame struct
  • Series struct
  • Series trait
  • ChunkedArray struct
  • ChunkedArray operations traits

编译时间

polars-lazy 充当 Polars DataFrame 库的延迟查询引擎。它允许您以惰性方式对 DataFrames 执行作,仅在必要时执行它们。这可以显著提高大型数据集的性能。

Polars作为基于Rust 应用描述

高性能数据分析

Polars作为基于Rust的DataFrame库,其核心优势在于高性能数据处理能力。通过Apache Arrow内存模型和并行计算,执行速度比传统工具快5-10倍。适合处理GB级甚至TB级数据集,尤其对时间序列分析、聚合操作等场景表现优异。

use polars::prelude::*;

let df = DataFrame::read_csv("large_dataset.csv")?;
let aggregated = df.groupby(["category"])?.select(["value"])?.mean()?;

实时数据管道

在需要低延迟处理的场景如实时监控或金融交易系统中,Polars的零拷贝设计和多线程支持使其成为理想选择。配合Rust的安全特性,可构建高吞吐量且内存安全的实时数据处理管道。

let streaming_df = LazyCsvReader::new("streaming_data.csv")
    .with_delimiter(b',')
    .finish()?
    .filter(col("value").gt(lit(100)))
    .collect()?;

机器学习特征工程

作为特征预处理工具,Polars提供了丰富的操作接口。包括窗口函数、自定义UDF、高效Join等特性,能快速完成特征编码、归一化等操作,与Rust机器学习库如Linfa无缝集成。

let features = df
    .lazy()
    .with_column((col("x") - col("x").mean()).alias("x_normalized"))
    .collect()?;

嵌入式数据分析

得益于Rust的无GC特性和跨平台编译能力,Polars可以嵌入到移动设备或IoT设备中运行。在资源受限环境下仍能保持高效运算,适用于边缘计算场景的数据预处理。

WebAssembly应用

Polars能编译为WASM在浏览器中运行,结合前端框架如Yew或Leptos,构建完全客户端的数据分析应用。这种架构避免了服务器端计算,保护了数据隐私。

#[wasm_bindgen]
pub fn analyze(data: JsValue) -> Result<JsValue, JsValue> {
    let df = JsonReader::new(data.into_serde::<Vec<Record>>()?).finish()?;
    // ...分析逻辑
}

数据库加速层

作为查询加速中间件,Polars可以放在传统数据库与应用层之间。通过内存列式存储和谓词下推技术,对从数据库提取的数据进行二次优化处理,提升复杂查询性能。

地理空间数据处理

结合geo-polars扩展,能高效处理GeoJSON等地理空间数据。支持空间索引和R树查询,适用于位置服务、轨迹分析等GIS应用场景。

use geo_polars::geospatial::*;

let gdf = GeoDataFrame::from_geojson("points.geojson")?;
let within = gdf.points_within(&Polygon::from_coordinates(...))?;

日志分析系统

在ELK替代方案中,Polars处理结构化日志的性能优于传统方案。其强大的字符串处理能力和正则表达式支持,配合多核并行处理,能快速完成日志聚合分析。

金融量化研究

高频交易和风险计算需要亚毫秒级响应,Polars的矢量化运算和SIMD优化特别适合定价模型回测、订单簿分析等金融计算场景,比Python方案快数十倍。

let returns = df
    .lazy()
    .with_column((col("price").shift(1) / col("price")).log().alias("log_return"))
    .collect()?;

生物信息学计算

基因组数据分析常涉及大规模矩阵运算,Polars的跨平台特性和高性能表现使其成为生物信息学工具链的新选择。尤其适合VCF文件处理、基因序列比对等计算密集型任务。

使用 Polars-Lazy 构建股票金融分析系统

Polars-Lazy 是 Rust 生态中高性能数据框架,适合处理大规模金融数据。以下为关键实现方法:

数据加载与预处理

use polars::prelude::*;

let df = LazyCsvReader::new("stock_data.csv")
    .has_header(true)
    .finish()?
    .with_column(col("date").str().strptime(DataType::Date, "%Y-%m-%d"))
    .filter(col("volume").gt(10000));

LazyFrame 延迟执行特性可优化复杂查询,金融数据预处理包含:

  • 日期格式标准化
  • 异常值过滤
  • 空值填充策略

技术指标计算

let df_with_rsi = df
    .with_column(
        ((col("close").shift(1) - col("close")).alias("delta")
        .rolling_rsi(14)

网站公告

今日签到

点亮在社区的每一天
去签到