2015-06-17 1 views
1

У меня есть некоторые данные, как этотпрокладочные средние с dc.js/crossfilter

[ 
    {type:"a", series:[0.1, 0.2, 0.2, 0.1, -0.1]}, 
    {type:"b", series:[0.3, 0.4, 0.5, 0.6, 0.7]}, 
] 

Там является размер для типа, то я делаю группу и усреднения каждой серии каждого типа.

Есть ли хороший способ построения усредненной серии по типу? Очевидно, я хочу, чтобы он обновлялся с помощью любых новых фильтров.

Я попытался уплощение моих данных как

[ 
    {type:"a", index:0, value:0.1}, 
    {type:"a", index:1, value:0.2}, 
    ... 
] 

и делает указатель измерение. Но я становлюсь немного медленным, когда добавляю больше данных; Я никогда не фильтрую размер индекса, поэтому добавление его к crossfilter - это просто дополнительная стоимость; и, наконец, он испортил подсчеты для каждого типа.

ответ

1

Попробуйте это:

var group = typeDimension.group().reduce(reduceAdd, reduceRemove, reduceInitial); 

function reduceAdd(p, v) { 
    ++p.count 
    p.sum += calculateAverage(v['series']); 
    p.avg = p.sum/p.count; 
    return p; 
} 

function reduceRemove(p, v) { 
    --p.count 
    p.sum -= calculateAverage(v['series']); 
    p.avg = p.sum/p.count; 
    return p; 
} 

function reduceInitial() { 
    return {count: 0, sum: 0, avg: 0}; 
} 

function calculateAverage(numbers) { 
    var sum = 0; 
    number.forEach(function(num) { 
     sum += num; 
    }); 
    return sum/numbers.length; 
} 
+0

Я думаю, мой вопрос был не очень четко сформулированы. Я реализовал функцию усреднения, мне было интересно, как построить массив без создания «индекса» в crossfilter. До сих пор я отредактирую свой вопрос. – csiz

+0

На самом деле вся средняя вещь была ненужной деталью, но ваш ответ может быть полезен будущим посетителям, поэтому я поставил вместо него другой вопрос (с лучшей формулировкой и большим количеством кода) – csiz