1 个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年10月26日 |
---|
#958 in 并发
24KB
695 行
Rust Overdose - 好用的Rust数据分析-
项目
- 四则运算和向量
- 评估(any, all)
- 为数据集添加索引
四则运算和向量
向量的初始化
想要[1, 2, 3, 4, 5]这样的向量,可以这样初始化
- 使用标准函数的情况
let bs = (1..6).collect::<Vec<i32>>();
println!("{:?}", bs);
[1, 2, 3, 4, 5]
- 使用OVERDOSE的情况
let bs = RFrame::withRange(1,6);
println!("{:?}", bs.vec);
[1, 2, 3, 4, 5]
向量运算
将[1, 2, 3, 4, 5]的所有元素乘以3
- 使用标准函数的情况
let bs = (1..6).map(|x| x*3).collect::<Vec<i32>>();
println!("{:?}", bs);
[3, 6, 9, 12, 15]
- 使用OVERDOSE的情况
(在接收引用闭包时为单进程操作)
let bs = RFrame::withRange(1,6).map( &|x| {x*3} );
println!("{:?}", bs.vec);
[3, 6, 9, 12, 15]
向量之间的运算
xs = [1, 2, 3, 4, 5]
ys = [6, 7, 8, 9, 10]
在这两个运算中,执行加法
- 使用标准函数的情况
let bs = RFrame::withRange(1,6).vec.iter().zip( RFrame::withRange(6,11).vec.iter() ).map( |x| (x.0.clone()+x.1.clone()) ).collect::<Vec<i32>>();
println!("{:?}", bs);
[7, 9, 11, 13, 15]
- 使用OVERDOSE的情况
先将其合并为一个元组,然后执行加法等操作
let zip = RFrame::withVec(["a", "b", "c"].to_vec()).zip(RFrame::withRange(1,4));
println!("{:?}", zip);
RFrame { header: None, cursol: 0, vec: [("a", 1), ("b", 2), ("c", 3)] }
检查向量的大小
xs = [1, 2, 3, 4, 5]
求出这个大小
- 使用标准函数的情况
let size = (1..6).into_iter().collect::<Vec<i32>>().len();
println!("{:?}", size);
5
- 使用OVERDOSE的情况
let size = RFrame::withRange(1,6).vec.len();
println!("{:?}", size);
5
向量的连接
[1, 2, 3, 4, 5]和[6, 7, 8, 9, 10]的连接
- 使用OVERDOSE的情况
let conc = RFrame::withRange(1,6).concat( RFrame::withRange(6,11) );
println!("{:?}", conc.vec);
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
评估函数
any
如果列表中有一个元素满足条件,则返回true
[1, 2, 3, 4, 5]中是否有可以被2整除的元素
let any = RFrame::withRange(1,6).any( &|x| { x%2 == 0} );
println!("{:?}", any);
true
[1, 2, 3, 4, 5]中是否有可以被7整除的元素
let any = RFrame::withRange(1,6).any( &|x| { x%7 == 0} );
println!("{:?}", any);
false
all
[1, 2, 3, 4, 5]列表中的元素是否都小于10
let all = RFrame::withRange(1,6).all( &|x| { x < 10 } );
println!("{:?}", all);
[1, 2, 3, 4, 5]列表中的元素是否都大于3
let all = RFrame::withRange(1,6).all( &|x| { x >= 3 } );
println!("{:?}", all);
为数据集添加索引
在切片等操作中,如果索引有易懂的名称,则操作更方便。用户也可以自定义这些名称
例如,对于[1, 2, 3, 4, 5]的数据集,为["a", "b", "c", "d", "e"]的每个索引分配名称,可以这样操作
- 使用OVERDOSE的情况
let header = RFrame::withRange(1,5).insertHeader( ["a", "b", "c", "d", "e"].to_vec() );
println!("{:?}", header);
RFrame { header: Some({"d": 3, "c": 2, "a": 0, "b": 1, "e": 4}), cursol: 0, vec: [1, 2, 3, 4] }
读取CSV
R的数据框是列导向的数据,通过在索引中指定特定的列名来实现,而OVERDOSE首先提供行导向的框架
这是由于各种原因,包括数据的处理更方便,并且在大数据处理中,如果资源充足,行导向的数据框架更易于使用Lambda函数进行数据分析
CSV以最大32个并行读取,速度快,但读取顺序不能保证
- 使用OVERDOSE的情况
let csv = RFrame::withCSV("./resource/TomatoFirst.csv");
println!("{:?}", csv);
RFrame { header: None, cursol: 0, vec: [{"Avg of Totals": "16.1", "Acid": "2.8", "Texture": "3.4", ...
依赖项
~1–1.5MB
~30K SLoC