2013-03-21 5 views
9

Im пытается вычислить среднее время запроса по сумме (querytimes) и затем делить их на count.How можно получить счет?Crossfilter average group

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

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

ответ

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); 
+0

Комментарий ниже намеченный путь для достижения этой цели. –

11

Я думаю, что лучше (и намеченный) способ сделать это, определив собственные сокращения функций (добавление, удаление, начальным). Затем вы можете сохранить свою текущую сумму, счет и т. Д. В рамках функций сокращения и при необходимости настроить их, когда фильтры добавят & удаление данных из группы.

Примера делать это со средними и с мин & макс приведены в этом аналогичном вопросе: Using Crossfilter, is it possible to track max/min when grouping?