我一直在玩 crossfilter 并发现它很棒,但最近碰到了一堵墙。我不知道我的问题是否需要 crossfilter ,所以很高兴听到任何替代解决方案。
我的数据如下:
[{
year: "1987",
country: "UK",
product: "pineapple",
tons_available: 10,
tons_sold: 8
},
{ year: "1987", country: "US", product: "pineapple", tons_available: 34, tons_sold: 18},
{ year: "1987", country: "UK", product: "pear", tons_available: 4, tons_sold: 3},
{ year: "1987", country: "US", product: "pear", tons_available: 23, tons_sold: 20},
{ year: "1988", country: "UK", product: "pineapple", tons_available: 12, tons_sold: 3},
{ year: "1988", country: "US", product: "pineapple", tons_available: 56, tons_sold: 6},
{ year: "1988", country: "UK", product: "pear", tons_available: 32, tons_sold: 32},
{ year: "1988", country: "US", product: "pear", tons_available: 31, tons_sold: 8},
and on, and on...]
我希望汇总年度数据,并且能够针对“tons_available”和“tons_sold”等已有的指标进行汇总。
var by_week = data_to_filter.dimension( function(d) { return d.year; });
var tons_sold_by_week = by_week.group()
.reduceSum(function(d) { return d.tons_sold; });
但是,我找不到在聚合对象之上创建指标的方法。例如,我想创建每年的销售率。为此,我需要每年对所有字段求和,然后才划分:tons_sold / tons_available。
理想情况下,这会给我一个json格式为:
[{
year: "1987",
tons_available: 71,
tons_sold: 49
str: 0.69
},
{ year: "1988", tons_available: 131, tons_sold: 49, str: 0.37 },
and on, and on...]
在我看来,聚合对象只保留求和变量和结果,每年只有一对键/值。
有没有办法实现我的目标?
非常感谢!
答案 0 :(得分:1)
希望这对你有用。
您可以通过为特定用例定义reduceAdd,reduceRemove和reduceInitial函数,然后将它们传递给reduce来实现。
代码:
var cf = crossfilter(data),
year = cf.dimension(function(d) { return d.year; });
var reduceAdd = function(p, v) {
p.tons_available += v.tons_available;
p.tons_sold += v.tons_sold;
p.str = p.tons_sold/p.tons_available;
return p;
}
var reduceRemove = function(p, v) {
p.tons_available -= v.tons_available;
p.tons_sold -= v.tons_sold;
p.str = p.tons_sold/p.tons_available;
return p;
}
var reduceInitial = function() {
return {
tons_available : 0,
tons_sold : 0,
str : 0
}
}
var json = year.group().reduce(reduceAdd,reduceRemove,reduceInitial).orderNatural().top(Infinity);
console.log(json);
当Crossfilter添加记录时,它使用reduceAdd重新计算值。当Crossfilter删除过滤掉记录时,它使用reduceRemove来更新值。它需要一个由reduceInitial提供的初始值(注意它是一个函数)。请参阅文档https://github.com/square/crossfilter/wiki/API-Reference#group_reduce中的此永久链接。
我使用了你上面给出的输入,这是我得到的json:
[{key: "1988", value: {
str: 0.37404580152671757,
tons_available: 131,
tons_sold: 49},
{key: "1987", value: {
str: 0.6901408450704225,
tons_available: 71,
tons_sold: 49}]
这不完全是您要求的输出,但它非常接近。