数据形变 / 数据补全相关
fill-rows 补全行
alias: fillRows
先按照 groupBy
和 orderBy
进行分组,如果以分组作为补全依据(fillBy: 'group'
),那么就对比每个分组,以 orderBy
序列字段值最全的分组为标准补全数据行数不足的分组。如果以序列作为补全依据(fillBy: 'order'
),那么就取所有 orderBy
序列字段的组合,为每个分组都补充全量的序列。
注意!如果原始数据有除 groupBy 和 orderBy 指定的字段以外的字段,那么补充的数据行里会缺失这些字段。这时可以结合 impute Transform 来做字段数据补全。
具体用法见示例:
fillBy: group
const data = [
{ a: 0, b: 0 },
{ a: 0, b: 1 },
{ a: 0, b: 2 },
{ a: 1, b: 1 },
{ a: 1, b: 2 },
{ a: 1, b: 3 },
{ a: 2, b: 0 },
];
const dv = new DataSet.DataView().source(data).transform({
type: 'fill-rows',
groupBy: ['a'],
orderBy: ['b'],
fillBy: 'group', // 默认为 group,可选值:order
});
console.log(dv.rows);
/*
* dv.rows 变为:
* [
* { a: 0, b: 0 }, // 分组1 作为第一个序列字段最全(b)的组,被选为基准
* { a: 0, b: 1 },
* { a: 0, b: 2 },
* { a: 1, b: 1 }, // 分组2 序列字段个数和基准组一致,所以不补充数据
* { a: 1, b: 2 },
* { a: 1, b: 3 },
* { a: 2, b: 0 }, // 分组3 缺省数据,根据基准组进行数据补全
* { a: 2, b: 1 }, // 这行数据被补充
* { a: 2, b: 2 }, // 这行数据被补充
* ]
*/
fillBy: order
// 使用和上例同样的数据
const dv = new DataSet.DataView().source(data).transform({
type: 'fill-rows',
groupBy: ['a'],
orderBy: ['b'],
fillBy: 'order', // 默认为 group,可选值:order
});
console.log(dv.rows);
/*
* dv.rows 变为:
* [
* { a: 0, b: 0 }, // 分组1
* { a: 0, b: 1 },
* { a: 0, b: 2 },
* { a: 0, b: 3 }, // 分组1 补充了这行数据,因为全量的序列字段(b)有这个值
* { a: 1, b: 0 }, // 分组2 补充了这行数据,因为全量的序列字段(b)有这个值
* { a: 1, b: 1 },
* { a: 1, b: 2 },
* { a: 1, b: 3 },
* { a: 2, b: 0 }, // 分组3 缺省数据,根据基准组进行数据补全
* { a: 2, b: 1 }, // 这行数据被补充
* { a: 2, b: 2 }, // 这行数据被补充
* { a: 2, b: 3 }, // 这行数据被补充
* ]
*/
impute 补全列 / 补全字段
根据配置规则为某个字段补全缺失值。
具体用法见示例:
const data = [
{ x: 0, y: 1 },
{ x: 0, y: 2 },
{ x: 0, y: 3 },
{ x: 0 },
{ x: 1, y: 5 },
{ x: 1, y: 6 },
{ x: 1, y: 7 },
{ x: 1 },
{ x: 1, y: 9 },
{ x: 2 },
];
const dv = new DataSet.DataView().source(data).transform({
type: 'impute',
field: 'y', // 待补全字段
groupBy: ['x'], // 分组字段集(传空则不分组)
method: 'max', // 补全字段值时执行的规则
});
/*
dv.rows 变为
[
{ x: 0, y: 1 },
{ x: 0, y: 2 },
{ x: 0, y: 3 },
{ x: 0, y: 3 },
{ x: 1, y: 5 },
{ x: 1, y: 6 },
{ x: 1, y: 7 },
{ x: 1, y: 7 },
{ x: 1, y: 9 },
{ x: 2, y: 9 }
]
*/
补全字段的规则(method)有常见的统计函数:max, min, median, mean
还有补充固定值的写法:method 指定为 value,然后 value 指定为填充的常量,譬如
dv.transform({
type: 'impute',
field: 'y', // 待补全字段
groupBy: ['x'], // 分组字段集(传空则不分组)
method: 'value', // 补全常量
value: 10, // 补全的常量为10
});
fold 字段展开
以指定字段集为 key,展开数据。
具体用法见示例:
const data = [
{ country: 'USA', gold: 10, silver: 20 },
{ country: 'Canada', gold: 7, silver: 26 },
];
const dv = ds
.createView()
.source(data)
.transform({
type: 'fold',
fields: ['gold', 'silver'], // 展开字段集
key: 'key', // key字段
value: 'value', // value字段
retains: ['country'], // 保留字段集,默认为除 fields 以外的所有字段
});
/*
dv.rows 变为
[
{ key: gold, value: 10, country: "USA" },
{ key: silver, value: 20, country: "USA" },
{ key: gold, value: 7, country: "Canada" },
{ key: silver, value: 26, country: "Canada" }
]
*/