4个版本 (2个重大更新)

使用旧的Rust 2015

0.3.0 2018年6月20日
0.2.1 2018年6月3日
0.2.0 2018年5月29日
0.1.0 2018年5月24日

#1946 in 编码


用于 openml

MIT/Apache

150KB
4.5K SLoC

ARFF − 构建状态 最新版本 Rustc 版本 1.23+

ARFF文件格式序列化和反序列化器

ARFF(属性-关系文件格式)文件是一个ASCII文本文件,它描述了一组共享属性集的实例列表。其主要用途在数据科学中存储表格数据:行是实例,列是属性。元数据,如属性(列)名称、数据类型和注释,包含在文件格式中。

用法

  • ARFF被机器学习工具Weka用作输入文件格式。
  • OpenML网站提供ARFF和CSV格式的数据集。

ARFF包利用Serde的强大功能,允许将某些Rust类型序列化和反序列化。该文件格式相对简单,因此不是所有Rust类型都受支持。一般来说,数据需要表示为一组行的序列,一行可以是具有命名列的struct或具有静态长度的序列。

示例

[dependencies]
arff = "0.1"
extern crate arff;

#[macro_use]
extern crate serde_derive;

fn main() {
    let input = "
@RELATION Data
@ATTRIBUTE a NUMERIC
@ATTRIBUTE b NUMERIC

@DATA
42, 9
7, 5";

    #[derive(Debug, Deserialize)]
    struct NamedRow {
        b: i32,  // order of fields does not matter
        a: i32,
    }
    
    let named_data: Vec<NamedRow> = arff::from_str(input).unwrap();
    println!("{:?}", named_data);
    
    let unnamed_data: Vec<[i32; 2]> = arff::from_str(input).unwrap();
    println!("{:?}", unnamed_data);
}

支持的数据类型

表格ARFF数据在Rust中表示为行序列。列可以有不同的数据类型,但每行必须相同。

序列化

数据集类型

如果Row是有效类型,可以将其序列化为数据行,则以下类型可以序列化为ARFF数据集

  • 向量:Vec<Row>
  • 切片:&[Row]
  • 数组:[Row; N]
  • 元组: (Row, Row, Row, ...)

默认情况下,数据集名称为 unnamed_data。您可以通过将其包装在一个新的类型结构中来给数据集一个不同的名称。例如,MyData(Vec<Row>) 在 ARFF 中的表示为

@RELATION MyData
...

元组结构序列化方式类似于包裹在新类型结构中的元组。 MoreData((Row, Row, Row)) 等同于 MoreData(Row, Row, Row)

数据行类型

Row 数据格式的有效类型包括

  • 结构体: #[derive(Serialize)] struct Row { ... }
  • 元组: type Row = (i32, f64, bool, String, ...);
  • 数组: type Row<T> = [T; N];

嵌套列

行中可以存在嵌套序列。在序列化过程中,这些序列将被扁平化。例如,[[i32; 2]; 2](i32, [i32; 2], i32),以及 [i32; 4] 产生等效的序列化。

由于它们可能导致列名称不明确,嵌套结构目前不支持。

值类型

ARFF 支持 NUMERIC、STRING 和 NOMINAL 数据类型。序列化器执行以下从 rust 类型到 ARFF 类型的映射

  • 数值类型 <-- i8, i16, i32, i64, u8, u16, u32, u64, f32, f64
  • 字符串类型 <-- String, &str
  • 枚举类型 <-- enum

缺失值在 ARFF 中以 ? 编码。 Option::None 转换为 ?,而 Option::Some(T) 则根据上述规则展开并序列化。

反序列化

数据集类型

如果 Row 是一个有效的类型,可以反序列化为数据行,则可以从 ARFF 中反序列化以下类型

  • 向量:Vec<Row>
  • 数组:[Row; N]
  • 元组: (Row, Row, Row, ...)

在反序列化过程中忽略数据集名称。可以将上述类型包裹在一个新类型结构体中,但不会检查类型名称与数据集的名称。

数据行类型

反序列化数据行有效的类型

  • 结构体:#[derive(Deserialize)] sruct Row { ... }
  • 数组: type Row<T> = [T; N];
  • 元组:type Row = (i32, f64, Sting, bool, ...);
  • 向量:type Row<T> = Vec<T>;

嵌套列

嵌套序列将被展开,类似于序列化。

值类型

反序列化器忽略 ARFF 类型描述,并尝试将每个值解析为目标数据结构期望的 Rust 类型。如果无法完成,将返回一个 Error

可能包含缺失值的列需要包裹在 Option 中,以便将编码的 ? 解析为 None

许可证

ARFF 包的许可证为以下之一

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您提交给 ARFF 包的任何有意贡献,都将根据上述内容双许可,不附加任何额外条款或条件。

依赖项

~205–495KB
~10K SLoC