#系列 #数据帧 #数据处理 #Pandas #内存 #通用 #Python

black-jack

DataFrame / Series / Rust中的通用数据处理

10次发布

0.1.0 2019年4月28日
0.0.16-a2018年12月10日
0.0.15 2018年9月17日
0.0.13 2018年8月26日

#187 in 数据库实现

每月 30 下载次数

自定义许可GPL-3.0+

85KB
1.5K SLoC

black-jack

BlackJack处于开发中,PR和问题都是热忱欢迎的!

Build Status Coverage Status Dependabot Status License License

Rust API文档


BlackJack致力于成为一个功能齐全的数据处理crate。

长期目标是创建一个由Rust社区使用和创建的轻量级Pandas等价物,但有一些细微的差异...

项目努力遵循一些关键原则。当需要做出实现决策时,它们将基于这些原则并以这种顺序进行

  1. 内存效率
    • 尽可能减少内存使用。
  2. 可用性
    • 追求人体工程学;通常通过尽可能模拟Pandas API来实现。
  3. 快速
    • 在大多数情况下,这是Rust的天然属性。 :)

最终我们将有一个Python包装器:与这个crate关联的Lumber-Jack,但那时才会到来。

示例用法


// We have a dataframe, of course...
let mut df = DataFrame::new();

// Make some series, of different types
let series_i32: Series<i32> = Series::arange(0, 5);
let mut series_f64: Series<f64> = Series::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0]);

// You can set a series name!
series_f64.set_name("my-series");

// Or not... 
assert_eq!(series_i32.name(), None);

// And add them to the dataframe
df.add_column(series_f64).unwrap();
df.add_column(series_i32).unwrap();

// And then get a reference to a Series
let series_f64_ref: &Series<f64> = df.get_column("my-series").unwrap();

读取CSV文件

也支持读取.gz文件


// Define the path to file
let path: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/data/medium_csv.csv");

// Use the `Reader` to read the dataframe
let df = Reader::new(&path).read().expect("Failed to read file");

// Get a refrence to a specific column and assert the sum of that series
let series2: &Series<i32> = df.get_column("col2").unwrap();

assert_eq!(series2.sum(), 3000);

查询/过滤数据帧

let mut s1 = Series::from(0..5);
s1.set_name("col1");

let mut s2 = Series::from(10..15);
s2.set_name("col2");

let mut s3 = Series::from_vec(vec![
    "foo".to_string(),
    "bar".to_string(),
    "foo".to_string(),
    "bar".to_string(),
    "foo".to_string(),
]);
s3.set_name("col3");

let mut df = DataFrame::new();
assert!(df.add_column(s1).is_ok());
assert!(df.add_column(s2).is_ok());
assert!(df.add_column(s3).is_ok());

// Before filtering, we're len 5 and first element of 'col1' is 0
assert_eq!(df.len(), 5);

df.filter_by_row(|row| row["col1"] == Datum::I32(&0));

// After filtering, we're len 4 and first element of 'col1' is now 1
assert_eq!(df.len(), 4);

// Filter by string foo,
df.filter_by_row(|row| row["col3"] != Datum::STR(&"foo".to_string()));
assert_eq!(df.len(), 2);

等等...


开发

  • Rust >= 1.31
  • GSL ~= 2.4
    • Fedora: sudo dnf install gsl-devel
    • Ubuntu: sudo apt-get install libgsl-dev
    • Windows安装说明

贡献

欢迎所有贡献。本项目的贡献者应尊重他人并给予尊严;承认存在不同的意见,并努力为他人提供一个欢迎的环境,无论其技能水平如何。

此外,除非另有说明,所有贡献都将根据Unlicense和/或MIT许可协议提供。

依赖关系

~13MB
~212K SLoC