使用 Crossfilter 处理两个不同的数据并制作图表
Handling two different data with Crossfilter and make chart
我有两个数据,一个与时间相关,一个不相关。
随时间变化的数据如下所示。
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
秒的 属性。
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 计算平均值然后再计算平均值是正常的。
关于平均值,我建议这样(未经测试)。
基本上,为每个名字保留一个运行总和并计数,然后当你需要平均值时,计算所有平均值并将它们相加,然后除以名字的数量。
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;
});
我有两个数据,一个与时间相关,一个不相关。
随时间变化的数据如下所示。
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
秒的 属性。
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 计算平均值然后再计算平均值是正常的。
关于平均值,我建议这样(未经测试)。
基本上,为每个名字保留一个运行总和并计数,然后当你需要平均值时,计算所有平均值并将它们相加,然后除以名字的数量。
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;
});