Rust数据分析插件库re_dataframe_ui的使用:高效DataFrame操作与可视化工具

re_dataframe_ui

rerun系列crate的一部分。

最新版本 文档 MIT Apache

基于DataFusion的丰富表格小部件。

安装

在项目目录中运行以下Cargo命令:

cargo add re_dataframe_ui

或者在Cargo.toml中添加以下行:

re_dataframe_ui = "0.24.0"

使用示例

以下是一个基本的使用示例,展示如何使用re_dataframe_ui进行DataFrame操作和可视化:

use re_dataframe_ui::{DataFrameView, DataFrame};
use arrow::array::{ArrayRef, Int32Array, StringArray};
use arrow::record_batch::RecordBatch;
use arrow::datatypes::{DataType, Field, Schema};

fn main() {
    // 创建示例数据
    let schema = Schema::new(vec![
        Field::new("id", DataType::Int32, false),
        Field::new("name", DataType::Utf8, false),
    ]);
    
    let id_array = Int32Array::from(vec![1, 2, 3, 4]);
    let name_array = StringArray::from(vec!["Alice", "Bob", "Charlie", "David"]);
    
    let batch = RecordBatch::try_new(
        schema.clone(),
        vec![Arc::new(id_array) as ArrayRef, Arc::new(name_array) as ArrayRef]
    ).unwrap();
    
    // 创建DataFrame
    let df = DataFrame::new(vec![batch]);
    
    // 创建UI视图
    let mut view = DataFrameView::new(df);
    
    // 显示表格
    view.show_table();
    
    // 如果需要可视化
    view.show_plot("id", "name").unwrap();
}

完整示例demo

以下是基于上述示例的完整demo,展示了更多功能和详细注释:

use std::sync::Arc;
use re_dataframe_ui::{DataFrameView, DataFrame};
use arrow::array::{ArrayRef, Int32Array, StringArray, Float64Array};
use arrow::record_batch::RecordBatch;
use arrow::datatypes::{DataType, Field, Schema};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建更复杂的schema
    let schema = Schema::new(vec![
        Field::new("id", DataType::Int32, false),
        Field::new("name", DataType::Utf8, false),
        Field::new("age", DataType::Int32, false),
        Field::new("score", DataType::Float64, false),
    ]);
    
    // 创建各列数据
    let id_array = Int32Array::from(vec![1, 2, 3, 4, 5]);
    let name_array = StringArray::from(vec!["Alice", "Bob", "Charlie", "David", "Eve"]);
    let age_array = Int32Array::from(vec![25, 30, 35, 40, 45]);
    let score_array = Float64Array::from(vec![85.5, 90.0, 78.5, 92.5, 88.0]);
    
    // 创建RecordBatch
    let batch = RecordBatch::try_new(
        schema.clone(),
        vec![
            Arc::new(id_array) as ArrayRef,
            Arc::new(name_array) as ArrayRef,
            Arc::new(age_array) as ArrayRef,
            Arc::new(score_array) as ArrayRef,
        ]
    )?;
    
    // 创建DataFrame
    let df = DataFrame::new(vec![batch]);
    
    // 创建UI视图
    let mut view = DataFrameView::new(df);
    
    // 显示表格
    view.show_table();
    
    // 显示多种可视化图表
    
    // 1. 柱状图:年龄分布
    view.show_plot("id", "age")?;
    
    // 2. 折线图:分数趋势
    view.show_plot("id", "score")?;
    
    // 3. 散点图:年龄与分数关系
    view.show_plot("age", "score")?;
    
    // 可以添加更多数据操作和可视化逻辑
    
    Ok(())
}

功能特性

  1. 基于DataFusion的丰富表格小部件
  2. 支持多类型数据可视化(柱状图、折线图、散点图等)
  3. 高效的数据操作能力
  4. 支持复杂数据类型
  5. 易于集成的API设计

许可证

MIT OR Apache-2.0


1 回复

Rust数据分析插件库re_dataframe_ui的使用指南

简介

re_dataframe_ui是一个用于Rust的高效DataFrame操作与可视化工具库,它提供了类似Python中Pandas的DataFrame功能,同时具备Rust的性能优势。该库特别适合需要在Rust环境中进行数据分析和可视化的场景。

主要特性

  • 内存高效的DataFrame实现
  • 类似SQL的数据操作接口
  • 内置数据可视化功能
  • 与Rust生态系统良好集成
  • 支持多种数据格式的导入导出

安装方法

在Cargo.toml中添加依赖:

[dependencies]
re_dataframe_ui = "0.5"  # 请使用最新版本

基本使用方法

1. 创建DataFrame

use re_dataframe_ui::DataFrame;

fn main() {
    // 从向量创建DataFrame
    let df = DataFrame::new()
        .add_column("name", vec!["Alice", "Bob", "Charlie"])
        .add_column("age", vec![25, 30, 35])
        .add_column("score", vec![85.5, 92.0, 78.5]);
    
    println!("{:?}", df);
}

2. 数据筛选

// 继续使用上面的df
let filtered = df.filter(|row| {
    row.get::<i32>("age").unwrap() > 28 && 
    row.get::<f64>("score").unwrap() > 80.0
});

println!("筛选结果: {:?}", filtered);

3. 数据聚合

// 按年龄分组并计算平均分
let grouped = df.group_by("age")
    .agg("score", |values| {
        let sum: f64 = values.iter().map(|v| v.parse::<f64>().unwrap()).sum();
        sum / values.len() as f64
    });

println!("分组聚合结果: {:?}", grouped);

4. 数据可视化

use re_dataframe_ui::visualization;

// 创建柱状图
let chart = visualization::BarChart::new(&df)
    .x_axis("name")
    .y_axis("score")
    .title("学生成绩分布");
    
// 显示图表(需要GUI环境支持)
chart.show();

5. 数据导入导出

// 从CSV文件导入
let df_from_csv = DataFrame::from_csv("data.csv").unwrap();

// 导出到JSON
df_from_csv.to_json("output.json").unwrap();

高级功能

1. 数据透视表

let pivot = df.pivot(
    "name",      // 行
    "age",       // 列
    "score",     // 值
    |vals| vals.iter().map(|v| v.parse::<f64>().unwrap()).sum()  // 聚合函数
);

println!("透视表结果: {:?}", pivot);

2. 时间序列处理

use chrono::NaiveDate;

let mut ts_df = DataFrame::new()
    .add_column("date", vec![
        NaiveDate::from_ymd(2023, 1, 1),
        NaiveDate::from_ymd(2023, 1, 2),
        NaiveDate::from_ymd(2023, 1, 3)
    ])
    .add_column("value", vec![10.极客时间", "rust", "数据分析"]);

// 按日期重采样
let resampled = ts_df.resample("date", "1D", |group| {
    group.get::<f64>("value").unwrap().mean()
});

3. 自定义可视化

use re_dataframe_ui::visualization::{Chart, Theme};

let custom_chart = Chart::new(&df)
    .set_theme(Theme::Dark)
    .add_line_series("name", "score")
    .add_custom_marker(|row| {
        if row.get::<i32>("age").unwrap() > 30 {
            Some("★".to_string())
        } else {
            None
        }
    })
    .set_title("自定义图表");

性能提示

  1. 对于大型数据集,考虑使用lazy评估模式:
let lazy_df = df.lazy()
    .filter(|row| row.get::<i32>("age").unwrap() > 25)
    .select(&["name", "score"]);
    
let result = lazy_df.collect();  // 实际执行操作
  1. 使用par_iter进行并行操作加速处理:
use rayon::prelude::*;

let processed = df.par_map_rows(|row| {
    // 并行处理每一行
    let age = row.get::<i32>("age").unwrap();
    let score = row.get::<f64>("score").unwrap();
    (age, score * 1.1)  // 给分数加10%
});

完整示例demo

下面是一个整合了基本使用方法和高级功能的完整示例:

use re_dataframe_ui::{DataFrame, visualization::{BarChart, Chart, Theme}};
use chrono::NaiveDate;
use rayon::prelude::*;

fn main() {
    // 1. 创建DataFrame
    let df = DataFrame::new()
        .add_column("name", vec!["Alice", "Bob", "Charlie", "David", "Eve"])
        .add_column("age", vec![25, 30, 35, 28, 32])
        .add_column("score", vec![85.5, 92.0, 78.5, 88.0, 95.5])
        .add_column("department", vec!["HR", "IT", "HR", "Finance", "IT"]);

    // 2. 数据筛选
    let filtered = df.filter(|row| {
        row.get::<i32>("age").unwrap() > 28 && 
        row.get::<f64>("score").unwrap() > 80.0
    });
    println!("筛选结果:\n{:?}\n", filtered);

    // 3. 数据聚合
    let grouped = df.group_by("department")
        .agg("score", |values| {
            let sum: f64 = values.iter().map(|v| v.parse::<f64>().unwrap()).sum();
            sum / values.len() as f64
        });
    println!("部门平均分:\n{:?}\n", grouped);

    // 4. 数据透视表
    let pivot = df.pivot(
        "department",
        "age",
        "score",
        |vals| vals.iter().map(|v| v.parse::<f64>().unwrap()).sum()
    );
    println!("部门-年龄透视表:\n{:?}\n", pivot);

    // 5. 时间序列处理
    let mut ts_df = DataFrame::new()
        .add_column("date", vec![
            NaiveDate::from_ymd(2023, 1, 1),
            NaiveDate::from_ymd(2023, 1, 2),
            NaiveDate::from_ymd(2023, 1, 3)
        ])
        .add_column("value", vec![10.0, 15.5, 12.8]);

    let resampled = ts_df.resample("date", "1D", |group| {
        group.get::<f64>("value").unwrap().mean()
    });
    println!("重采样时间序列:\n{:?}\n", resampled);

    // 6. 并行处理
    let processed = df.par_map_rows(|row| {
        let name = row.get::<&str>("name").unwrap().to_string();
        let boosted_score = row.get::<f64>("score").unwrap() * 1.1;
        (name, boosted_score)
    });
    println!("并行处理结果(分数提升10%):\n{:?}\n", processed);

    // 7. 可视化
    let bar_chart = BarChart::new(&df)
        .x_axis("name")
        .y_axis("score")
        .title("员工成绩分布");
    // bar_chart.show();  // 实际使用时取消注释

    let custom_chart = Chart::new(&df)
        .set_theme(Theme::Dark)
        .add_line_series("name", "score")
        .add_custom_marker(|row| {
            if row.get::<f64>("score").unwrap() > 90.0 {
                Some("✨".to_string())
            } else {
                None
            }
        })
        .set_title("自定义成绩图表");
    // custom_chart.show();  // 实际使用时取消注释
}

总结

re_dataframe_ui为Rust开发者提供了强大的数据分析和可视化能力,结合了Rust的性能优势和类似Python的数据操作体验。通过上述示例,您可以快速上手并集成到您的数据分析项目中。

回到顶部