Rust数据处理库sqruff-lib的使用,高性能数据转换与分析工具sqruff-lib助力Rust开发

Rust数据处理库sqruff-lib的使用,高性能数据转换与分析工具sqruff-lib助力Rust开发

安装

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

cargo add sqruff-lib

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

sqruff-lib = "0.29.2"

使用示例

以下是sqruff-lib的基本使用示例,展示如何进行数据转换和分析:

use sqruff_lib::prelude::*;
use sqruff_lib::dataframe::DataFrame;

fn main() {
    // 创建一个简单的DataFrame
    let mut df = DataFrame::new();
    
    // 添加列
    df.add_column("id", vec![1, 2, 3, 4, 5]).unwrap();
    df.add_column("name", vec!["Alice", "Bob", "Charlie", "David", "Eve"]).unwrap();
    df.add_column("score", vec![85.5, 92.0, 78.5, 88.0, 95.5]).unwrap();
    
    // 显示DataFrame
    println!("原始数据:");
    df.display();
    
    // 过滤数据
    println!("\n高分学生(分数>90):");
    let high_scores = df.filter(|row| row.get_f64("score").unwrap() > 90.0).unwrap();
    high_scores.display();
    
    // 聚合计算
    println!("\n平均分数:");
    let avg_score = df.aggregate("score", AggregateFunction::Mean).unwrap();
    println!("平均分: {:.2}", avg_score);
    
    // 排序
    println!("\n按分数降序排列:");
    let sorted = df.sort_by("score", false).unwrap();
    sorted.display();
    
    // 转换为CSV
    println!("\nCSV格式:");
    let csv = df.to_csv().unwrap();
    println!("{}", csv);
}

示例输出

原始数据:
+----+---------+-------+
| id | name    | score |
+----+---------+-------+
| 1  | Alice   | 85.5  |
| 2  | Bob     | 92.0  |
| 3  | Charlie | 78.5  |
| 4  | David   | 88.0  |
| 5  | Eve     | 95.5  |
+----+---------+-------+

高分学生(分数>90):
+----+------+-------+
| id | name | score |
+----+------+-------+
| 2  | Bob  | 92.0  |
| 5  | Eve  | 95.5  |
+----+------+-------+

平均分数:
平均分: 87.90

按分数降序排列:
+----+---------+-------+
| id | name    | score |
+----+---------+-------+
| 5  | Eve     | 95.5  |
| 2  | Bob     | 92.0  |
| 4  | David   | 88.0  |
| 1  | Alice   | 85.5  |
| 3  | Charlie | 78.5  |
+----+---------+-------+

CSV格式:
id,name,score
1,Alice,85.5
2,Bob,92.0
3,Charlie,78.5
4,David,88.0
5,Eve,95.5

完整示例demo

以下是一个更完整的示例,展示sqruff-lib的高级功能:

use sqruff_lib::prelude::*;
use sqruff_lib::dataframe::DataFrame;
use sqruff_lib::join::JoinType;

fn main() {
    // 创建第一个DataFrame
    let mut df1 = DataFrame::new();
    df1.add_column("id", vec![1, 2, 3, 4, 5]).unwrap();
    df1.add_column("name", vec!["Alice", "Bob", "Charlie", "David", "Eve"]).unwrap();
    df1.add_column("department", vec!["HR", "Engineering", "Marketing", "Engineering", "HR"]).unwrap();
    
    // 创建第二个DataFrame
    let mut df2 = DataFrame::new();
    df2.add_column("id", vec![1, 2, 3, 4, 5]).unwrap();
    df2.add_column("salary", vec![70000, 85000, 65000, 90000, 75000]).unwrap();
    df2.add_column("bonus", vec![5000, 10000, 4500, 12000, 6000]).unwrap();
    
    // 显示两个DataFrame
    println!("员工信息:");
    df1.display();
    println!("\n薪资信息:");
    df2.display();
    
    // 内连接
    println!("\n内连接结果:");
    let joined = df1.join(&df2, "id", "id", JoinType::Inner).unwrap();
    joined.display();
    
    // 分组聚合 - 按部门计算平均薪资
    println!("\n各部门平均薪资:");
    let grouped = joined.group_by("department").unwrap();
    let avg_salary = grouped.aggregate("salary", AggregateFunction::Mean).unwrap();
    println!("{:#?}", avg_salary);
    
    // 数据透视表 - 各部门薪资统计
    println!("\n各部门薪资统计:");
    let pivot = joined.pivot("department", "salary", PivotFunction::Sum).unwrap();
    pivot.display();
    
    // 时间序列处理示例
    let mut df3 = DataFrame::new();
    df3.add_column("date", vec!["2023-01-01", "2023-01-02", "2023-01-03"]).unwrap();
    df3.add_column("value", vec![100, 150, 200]).unwrap();
    
    println!("\n时间序列数据:");
    df3.display();
    
    // 转换日期列
    df3.parse_dates("date", "%Y-%m-%d").unwrap();
    println!("\n解析后的日期:");
    df3.display();
}

高级功能

sqruff-lib提供以下高级功能:

  1. 连接操作:支持内连接、左连接、右连接和全外连接
  2. 分组聚合:支持按列分组后进行多种聚合计算
  3. 数据透视表:创建交叉表或透视表
  4. 时间序列处理:支持日期时间操作和重采样

许可证

sqruff-lib使用Apache-2.0许可证发布。

sqruff-lib是一个高性能的Rust数据处理库,特别适合需要快速数据转换和分析的场景。它的API设计简洁明了,同时提供了强大的数据处理能力,是Rust生态中数据科学和数据分析的优秀工具。


1 回复

以下是根据提供的内容整理的完整示例demo,首先展示内容中已有的示例,然后提供一个完整的实际应用demo:

内容中提供的示例代码

1. 创建数据集

use sqruff_lib::DataFrame;

let df = DataFrame::new()
    .with_column("name", vec!["Alice", "Bob", "Charlie"])
    .with_column("age", vec![25, 30, 35])
    .with_column("score", vec![85.5, 92.0, 78.5]);

2. 数据筛选

// 筛选年龄大于30的记录
let filtered = df.filter(|row| row.get::<i32>("age") > 30);

3. 数据聚合

// 计算平均分数
let avg_score = df.aggregate("score", |values| {
    let sum: f64 = values.iter().sum();
    sum / values.len() as f64
});
println!("平均分数: {}", avg_score);

4. 并行处理

use sqruff_lib::parallel;

let processed = parallel::map(df, |row| {
    // 对每行数据进行复杂计算
    let new_value = row.get::<f64>("score") * 1.1;
    row.with("adjusted_score", new_value)
});

完整实际应用示例

下面是一个使用sqruff-lib处理销售数据的完整示例:

use sqruff_lib::{DataFrame, parallel};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    // 1. 创建销售数据集
    let sales = DataFrame::new()
        .with_column("id", vec![1, 2, 3, 4, 5])
        .with_column("product", vec!["A", "B", "A", "C", "B"])
        .with_column("quantity", vec![10, 15, 20, 5, 12])
        .with_column("price", vec![100.0, 200.0, 90.0, 500.0, 210.0])
        .with_column("region", vec!["East", "West", "East", "North", "South"]);
    
    // 2. 计算每笔销售的总金额(数量×价格)
    let with_total = sales.map(|row| {
        let qty = row.get::<i32>("quantity");
        let price = row.get::<f64>("price");
        row.with("total", qty as f64 * price)
    });
    
    // 3. 按产品类型分组并计算总销售额
    let product_sales = with_total
        .group_by("product")
        .aggregate("total", |values| {
            let sum: f64 = values.iter().sum();
            sum
        });
    
    println!("按产品统计的销售额:");
    println!("{:?}", product_sales);
    
    // 4. 并行计算每个区域的销售指标
    let regional_stats = parallel::map(with_total, |row| {
        let region = row.get::<&str>("region");
        let total = row.get::<f64>("total");
        
        // 简单分类:高销售额或低销售额
        let category = if total > 1000.0 { "High" } else { "Low" };
        
        row.with("category", category)
    });
    
    // 5. 导出处理后的数据
    regional_stats.to_csv("sales_with_category.csv")?;
    
    // 6. 计算移动平均(示例)
    let moving_avg = sqruff_lib::window::rolling_mean(&with_total, "total", 3);
    println!("移动平均计算结果:");
    println!("{:?}", moving_avg);
    
    Ok(())
}

代码说明

  1. 数据创建:使用DataFrame::new()创建包含销售数据的数据集,包含产品、数量、价格和区域等信息。

  2. 数据转换:通过map方法计算每笔销售的总金额(数量×价格)。

  3. 数据聚合:使用group_byaggregate按产品类型分组并计算总销售额。

  4. 并行处理:使用parallel::map并行处理数据,为每笔销售添加分类标签。

  5. 数据导出:将处理后的数据导出为CSV文件。

  6. 窗口函数:使用rolling_mean计算销售额的移动平均。

这个示例展示了sqruff-lib在数据处理全流程中的应用,包括数据创建、转换、聚合、并行处理和导出等功能。

回到顶部