#数据科学 #数据

app overdose

快速、行导向、类似Kotlin/Scala的数据框

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2017年10月26日

#958 in 并发

MIT 许可证

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