Crossfilter平均组

时间:2013-03-21 14:53:49

标签: javascript d3.js crossfilter dc.js

我试图通过总和(查询时间)计算平均查询时间,然后将它们除以计数。我怎样才能得到计数?

var querytimeByMonthGroup = moveMonths.group().reduceSum(function (d) {
    return d.querytime;
});

var querytimeByMonthGroup = moveMonths.group().reduceSum(function (d) {
    return d.querytime / d.count; ???
});

2 个答案:

答案 0 :(得分:12)

我认为更好(和预期)的方法是定义自己的reduce函数(add,remove,initial)。然后,您可以在reduce函数中存储运行总和,计数等,并在过滤器添加和调整时适当地调整它们。从组中删除数据。

使用平均值和min&最大值在此类似问题中给出:Using Crossfilter, is it possible to track max/min when grouping?

答案 1 :(得分:2)

我不熟悉crossfilter,只是刚开始玩它。可能有更好的方法,但这提供了一种计算用于分组的维度的计数的方法(我不是100%清楚d.count指的是用于分组的维度的计数,使用如果需要另一个分组)。

从以下代码中获得的示例:https://github.com/square/crossfilter/wiki/API-Reference

var payments = crossfilter([
    {date: "2011-11-14T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
    {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"},
    {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"},
    {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90, tip: 0, type: "tab"},
    {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90, tip: 0, type: "tab"},
    {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90, tip: 0, type: "tab"},
    {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "cash"},
    {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90, tip: 0, type: "tab"},
    {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90, tip: 0, type: "tab"},
    {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90, tip: 0, type: "tab"},
    {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0, type: "cash"},
    {date: "2011-11-14T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "visa"}
]);

var paymentsByType = payments.dimension(function(d) { return d.type; }),
        paymentVolumeByType = paymentsByType.group(),
        counts = paymentVolumeByType.reduceCount().all(),
        countByType = {}; 

// what is returned by all is a pseudo-array. An object that behaves like an array. 
// Trick to make it a proper array
Array.prototype.slice.call(counts).forEach(function(d) { countByType[d.key] = d.value; })
var paymentVolumeByType = paymentVolumeByType.reduceSum(function(d, i) { 
    console.log(d.total, d.type, countByType[d.type])
    return d.total / countByType[d.type]; 
});
// accessing parentVolumeByType to cause the reduceSum function to be called
var topTypes = paymentVolumeByType.top(1);