Я пытаюсь создать переменную для вставки dc.js с использованием настраиваемого сокращения (reduceAdd, reduceRemove и т. Д.), И мне сложно понять, как ее закодировать.
Я написал функцию вне этих функций сокращения и теперь должен воспроизвести те же самые функции сокращения, чтобы использовать то же самое для построенных графиков. Логика и код, написанные для внешних функций сокращения, следующие
Логика: для каждой уникальной доступной contact_week (дат) найдите максимальное значение week_number, затем просуммируйте переменную TOTCOUNT и переменную DECAY_CNT и вычислите процент (DECAY_CNT / TOTCOUNT).
Вот исходный код без использования кроссфильтра:
//Decay % logic
var dates = d3.map(filter1,function(d) { return d.CONTACT_WEEK;}).keys() ;
console.log(dates);
var sum1,sum2 = 0;
for(var i=0; i<dates.length; i++)
{
data1 = filter1.filter(function(d) { return d.CONTACT_WEEK == dates[i] ;});
//console.log(data1);
var max = d3.max(data1, function(d) { return +d.WEEK_NUMBER ;});
//console.log(max);
data2 = data1.filter(function(d) { return d.WEEK_NUMBER == max ;});
var sum1 = d3.sum(data2, function(d) { return d.TOTCOUNT ;});
var sum2 = d3.sum(data2, function(d) { return d.DECAY_CNT ;});
console.log(sum1);
var decay = sum2/sum1 * 100 ;
console.log(decay);
}
Первым шагом в этом является определение уникальных значений дат (contact_week). Как мне сделать это в функциях сокращения, поскольку это уже цикл for, который просматривает данные?
Я думаю, что для max и т. Д. Мы можем использовать reductio или какую-либо другую логику, как указано в комментариях, но я не совсем понимаю подход / дизайн, которому здесь нужно следовать
Любая помощь в подходе / решениях будет принята с благодарностью.
ОБНОВЛЕНИЕ 2:
Пробуем новый подход с помощью reductio js
Пояснение к данным:
Несколько столбцов в моих данных - contact_week (даты); номер_недели (числа - от -4 до 6); decay_cnt (целые числа); totcount (целые числа); продолжительность (порядковые значения - до, во время и после);
Теперь мне нужно рассчитать процент распада, который рассчитывается следующим образом: Для каждой уникальной contact_week найдите максимальное значение week_number, теперь для этого отфильтрованного набора данных вычислите сумму (decay_cnt) / sum (totcount) em >
Это должно быть нанесено на гистограмму, где по оси X отложена длительность, а по оси Y - показатель распада%.
Пытаясь вычислить максимальное количество номеров недель для отдельных дат, я на данный момент построил гистограмму с contact_week в качестве оси X и max of week_number в качестве оси Y. Как мне получить нужную мне диаграмму?
Код:
dateDimension2 = ndx.dimension(function(d) {return d.CONTACT_WEEK ;});
decayGroup = reductio().max(function (d) { return d.WEEK_NUMBER; })(dateDimension2.group());
chart2
.width(500)
.height(200)
.x(d3.scale.ordinal())
//.x(d3.scale.ordinal().domain(["DURING","POST1"]))
.xUnits(dc.units.ordinal)
//.xUnits(function(){return 10;})
//.brushOn(false)
.yAxisLabel("Decay (in %)")
.dimension(dateDimension)
.group(decayGroup)
.gap(10)
.elasticY(true)
//.yAxis().tickValues([0, 5, 10, 15])
//.title(function(d) { return d.key + ": " + d3.round(d.value.new_count,2); })
/*.valueAccessor(function (p) {
//return p.value.count > 0 ? (p.value.dec_total / p.value.new_count) * 100 : 0;
return p.value.decay ;
})*/
.valueAccessor(function(d) { return d.value.max; })
.on('renderlet', function(chart) {
chart.selectAll('rect').on("click", function(d) {
console.log("click!", d);
});
})
.yAxis().ticks(5);
Любой подход / предложения будут высоко оценены
Я думаю, что решение в основном заключается в комбинированном подходе поддельных групп / размеров и сокращения js. Любые альтернативы приветствуются!