2017-04-03 60 views
0

我有一个数据集,我正在使用的是随着时间的推移建筑和电力的使用。还原比例的最大值

这些建筑物上有两个聚合体,在整个时间范围内都是简单的总和,我写了这些聚合体。他们最终看起来像:

var reducer = reductio(); 
// How much energy is used in the whole system 
reducer.value("energy").sum(function (d) { 
    return +d.Energy; 
}); 

这些工作很好。

然而,第三次聚合给我带来了一些麻烦。我需要找到所有建筑物的总和最大的点。我需要最大的总和和它发生的时间。 我写道:

reducer.value("power").sum(function (d) { 
    return +d.Power; 
}).max(function (d) { 
    return +d.Power; 
}).aliasProp({ 
    time: function (d, v) { 
     return v.Timestamp; 
    } 
}); 

但是,这并不一定是最大的电力使用。我很确定这会返回任何建筑物使用最多功率的总和和时间。

因此,如果功率值是1,1,1,15,我会以18为结束,当时可能有不同的时刻,当值为5,5,5,5时,总共为20。 20是我需要的。

我不知道如何获得最大数额。有什么建议?

回答

1

只是为了重申:你按时分组,所以你的组密钥是某种时间段。你想要的是找到功率使用最大的时间段(组)。

如果我是正确的,这是你想要的,那么你不会在你的reducer中这样做,而是通过排序组。您可以通过使用group.order方法订购组:https://github.com/crossfilter/crossfilter/wiki/API-Reference#group_order

// During group setup 
group.order(function(p) { return p.power.sum; }) 

// Later, when you want to grab the top power group 
group.top(1) 

归谬法的max汇聚应该只是给你的组内发生的最大值。因此给定一个值为1,1,1,15的组,您将获得值15。听起来这不是你想要的。

希望我理解得当。如果没有,请评论。如果你可以举一个公开的玩具数据的例子,并且你可以告诉我你想看什么和你得到什么,我应该可以帮忙。

更新基于例如:

所以,你要(基于例子说明)什么是找到所选时间段内任意给定时间的最大用电量。所以,你会做到以下几点:

var timeDim = buildings.dimension(function(d) { return d.Timestamp }) 
var timeGrp = timeDim.group().reduceSum(function(d) { return d.Power }) 
var maxResults = timeGrp.top(1) 

只要你想找到你的当前过滤器的最大功率的使用时间,只需要调用timeGrp.top(1)和该组的关键将是具有最大功率的时间。

注意:请勿在timeDim上过滤,因为维上的过滤器未应用于在该维上定义的组。

这里有一个更新的jsfiddle写入了最大组到控制台:https://jsfiddle.net/esjewett/1o3robm3/1/

+0

当我设置我不使用组的时间范围,我使用[筛选方法](https://github.com/crossfilter/crossfilter/wiki/API-Reference#dimension_filter)。 这是一个不可取的方法? –

+0

那么你在分组?对不起,我不明白。你能分享一个有效的例子 - 这可能会有很大的帮助。 –

+0

我不是分组(或者说,我在维上使用GroupAll())。据我了解,聚合不适合跨组。 我有数据集,我根据时间范围对其进行过滤,然后聚合这些值。在原始帖子中用作示例的能量需要是过滤范围内整个数据集的总和。如果我对维度进行分组,那么我将为每个组分配一个能量总和,并且我将不得不手动对它们求和。 我的理解有什么不正确吗? –