使用Crossfilter处理两个不同的数据并制作图表

时间:2016-05-25 07:26:33

标签: dc.js crossfilter

我有两个数据,一个有时间依赖,一个没有。

与时间有关的数据如下所示。

year,  name    , value
2001, "AAAAAAA", 200
2002, "AAAAAAA", 300
2003, "AAAAAAA", 400
2001, "BBBBBBB", 150
2002, "BBBBBBB", 250
2000, "CCCCCCC", 500
2001, "CCCCCCC", 600
2002, "CCCCCCC", 550
2001, "DDDDDDD", 100
2002, "DDDDDDD", 300

另一方面,我有与时间无关的数据,它描述了name s的属性。

 name      ,  type
"AAAAAAAA", "red"
"BBBBBBBB", "blue"
"CCCCCCCC", "green"
"DDDDDDDD", "red"

处理数据的一种方法是将数据保存如下。

year,  name    , value,  type
2001, "AAAAAAA", 200  , "red"
2002, "AAAAAAA", 300  , "red"
2003, "AAAAAAA", 400  , "red"
2001, "BBBBBBB", 150  , "blue"
2002, "BBBBBBB", 250  , "blue"
2000, "CCCCCCC", 500  , "green"
2001, "CCCCCCC", 600  , "green"
2002, "CCCCCCC", 550  , "green"
2001, "DDDDDDD", 100  , "red"
2002, "DDDDDDD", 300  , "red"

如果要处理crossfilter上的数据,上述数据格式是处理它的最佳方式吗?或者你可以单独处理它,这是更有效的数据?

与数据格式相关,我如何在X轴上创建type的图表,并在Y轴上创建名称value的平均值。 只使用类型作为维度并计算平均值最终会立即平均所有结果。我认为先用name s计算平均值然后再计算平均值是正常的。

1 个答案:

答案 0 :(得分:2)

关于平均值,我建议这样的事情(未经测试)。

基本上,保留一个运行总和并计算每个名称,然后当你需要平均值时,计算所有平均值并求它们,然后除以名称数。

group.reduce(function(p, v) { // add
    p.sum[v.name] = (p.sum[v.name] || 0) + v.value;
    p.count[v.name] = (p.count[v.name] || 0) + 1;
    return p;
}, function(p, v) { // remove
    p.sum[v.name] -= v.value;
    p.count[v.name]--;
    return p;
} function() { // init
    return {sum: {}, count: {}};
});

chart.valueAccessor(function(kv) {
    var names = Object.keys(kv.value.sum),
        sumavg = 0;
    names.forEach(function(name) {
        sumavg += kv.value.sum[name] / kv.value.count[name];
    });
    return sumavg / names.length;
});