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提供以下高级功能:
- 连接操作:支持内连接、左连接、右连接和全外连接
- 分组聚合:支持按列分组后进行多种聚合计算
- 数据透视表:创建交叉表或透视表
- 时间序列处理:支持日期时间操作和重采样
许可证
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(())
}
代码说明
-
数据创建:使用
DataFrame::new()
创建包含销售数据的数据集,包含产品、数量、价格和区域等信息。 -
数据转换:通过
map
方法计算每笔销售的总金额(数量×价格)。 -
数据聚合:使用
group_by
和aggregate
按产品类型分组并计算总销售额。 -
并行处理:使用
parallel::map
并行处理数据,为每笔销售添加分类标签。 -
数据导出:将处理后的数据导出为CSV文件。
-
窗口函数:使用
rolling_mean
计算销售额的移动平均。
这个示例展示了sqruff-lib在数据处理全流程中的应用,包括数据创建、转换、聚合、并行处理和导出等功能。