Агрегировать данные с процентами для сгруппированных элементов dc.js

1

Как отобразить% ошибок в таблице данных? У меня есть следующий CSV, и я рассчитываю процент отказов для каждого поля "имя", я хочу, чтобы отображать общий процент отказов для каждого "имени" в DataTable

Customer | year| Week |Failure_Reason|     name        |    Type  |   Count 
___________________________________________________________________________
A         2018  29      D              Express Air        PR         27
___________________________________________________________________________
A         2018  26      M              Express Air        PR         58
___________________________________________________________________________
A         2018  26      D              Domestic                      5
___________________________________________________________________________
A         2018  27      N              Domestic          SPEED       29
___________________________________________________________________________
A         2018  30    Missed           International     PR          11
___________________________________________________________________________
A         2018  32      N              Domestic          PR          53

Код для времени и группы:

        var ndx= crossfilter(data);
        var all= ndx.groupAll();  
        var CTypedim=ndx.dimension(function(d) {return d["name"]+ ',' + d["Customer"];})
        var CTypeGroup=CTypedim.group();

        var percentFailures = CTypedim.group().reduce(
        function(p, v) {
             p.counter+= Number(v.count);
             p.failures += Number(v.Failure_Reason != 'N' ? v.count : 0);
             p.failPercent = p.counter ? p.failures/p.counter : 0;
             return p;
         },
         function(p, v) {

             p.counter-= Number(v.count);
             p.failures -= Number(v.Failure_Reason != 'N' ? v.count : 0);
             p.failPercent = p.counter ? p.failures/p.counter : 0;
             return p;
         },
         function() {
             return {
                 counter: 0,
                 failures: 0,
                 failPercent: 0
             };
         });

        dataTable.width(800).height(800)
        .dimension(percentFailures)
        .group(function(d) { return "" })
        .size(100)
        .columns([
            function(d) { return d.Customer; },
            function(d) { return d.year; },
            function(d) { return d.value.failpercent*100; },
            function(d) { return d.name; },

        ])
        .sortBy(function(d){ return d.year; })
        .order(d3.descending);

Необходимо отобразить агрегированную таблицу данных следующим образом:

Customer | Year| Failure%|     name        |    
_____________________________________________
A         2018      100%     Express Air       
_____________________________________________
A         2018      5.7%       Domestic     
_____________________________________________
A         2018      100%      International       
_____________________________________________

Изображение 174551

  • 1
    Мне не ясно, хотите ли вы показать необработанные данные или агрегированные данные в вашей таблице. Из вашего примера выглядит, что, возможно, вы хотите агрегировать как по клиенту, так и по имени, рассчитать ошибку для каждой комбинации клиент / имя и отобразить ее. В этом случае вы можете создать группу, которая уменьшает каждый из столбцов, которые вы хотели бы видеть, и передать группу в качестве измерения.
Теги:
dc.js
crossfilter

1 ответ

2
Лучший ответ

Ты на правильном пути, продолжай!

Вам нужно будет использовать агрегированные поля в таблице:

    .columns([
        function(d) { return d.key.split(',')[1]; }, // customer part of multikey
        function(d) { return d.year; },
        function(d) { return d.value.failPercent*100; }, // capitalize consistently
        function(d) { return d.key.split(',')[0]; }, // name part of multikey

    ])

Использование года проблематично! Поскольку, как только вы агрегируете, вы не знаете, в каком году будет отображаться каждое агрегированное значение, и может представлять собой несколько лет. Если вы можете удалить этот столбец, я рекомендую его.

  • 0
    Спасибо, что сработало отлично :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню