2015-02-06 3 views
3

вот моя проблема:crossfilter - вычисление процентов всех записей с собственностью

Я использую сервер опоки питона, который извлекает данные из JSON Монго дб, и там я указать, какие поля для import.This данных в формате json и выбирается только так. Можно ли сделать преобразования в эти поля после прохождения через crossfilter в graphs.js? например У меня есть атрибут статуса, который может принимать значения «Pass», «In Progress», «Hold» или «Fail». Я в основном хочу сделать метрику, которая говорит мне процент неудачи. Поэтому в идеале я должен выполнить некоторые вычисления по данным. Пожалуйста, сообщите об этом.

Sample data (in tabular form for clarity) looks like: 
TrialLocation  | Subject Status 
Site A   | In progress 
Site A   | Pass 
Site B   | In progress 
Site A   | In progress 
Site B   | On Hold 
Site A   | Screen Failure 

В этом случае я должен получить гистограмму с именем сайта на оси х, а по оси у, я должен получить метрику вычисления процента отказов. который в этом случае будет 25% для сайта А и 0% для сайта В.

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

var siteName = ndx.dimension(function(d) { return d["TrialLocation"];}); 
var numSubjectsBySite = siteName.group(); 
var siteLevelChart = dc.barChart("#site-level-count", "subjectView"); 

и, наконец, график:

siteLevelChart 
.width(2000) 
.height(200) 
.transitionDuration(1000) 
.dimension(siteName) 
.group(numSubjectsBySite) 
.ordering(function(d){return d.value;}) 

Так я думал, я бы вычислить количество строк с SubjectStatus = «Failure Screen» и разделить, что общее число строк, которые в этом случае будет «numSubjectsBySite» переменная Тогда, когда я ввел этот код:

var countScreenFailures = ndx.dimension(function(d){ return d["SubjectStatus"];}); 
countScreenFailures.filter("Off Study"); 

Моя гистограмма показывает только те строки, в которых Subject Status = «ScreenFailure».

Как рассчитать частоту отказа экрана, а затем использовать его? Пожалуйста, помогите мне?

большое спасибо. Anmol

+0

Это идеальное решение для функции уменьшения карты –

ответ

4

Вам нужно будет создать пользовательские функции группировки/уменьшения, чтобы отслеживать количество каждого состояния, а также общее количество. Затем вы можете просто разделить график, чтобы рассчитать процент. Если вы заинтересованы в использовании Reductio, вероятно, можно сделать следующее:

var reducer = reductio().count(true); 

// Do this as many times as you need for different status counts. Each 
// call of reducer.value will add a new property to your groups where 
// you can store the count for that status. 
reducer.value("ScreenFailure").sum(
    function(d) { 
    // This counts records with SubjectStatus = "Screen Failure" 
    return d["SubjectStatus"] === "Screen Failure" ? 1 : 0; 
    }); 

// Build the group with the Reductio reducers. 
var numSubjectsBySite = reducer(siteName.group()); 

// In your dc.js chart, calculate the % using a value accessor. 
siteLevelChart 
.width(2000) 
.height(200) 
.transitionDuration(1000) 
.dimension(siteName) 
.group(numSubjectsBySite) 
.valueAccessor(function(p) { return p.value.ScreenFailure.sum/p.value.count; }) 
.ordering(function(d){return d.value;}) 
+1

Hi Ethan, Спасибо, что обратились ко мне :). Я попробовал запустить код так, как вы посоветовали. Появилась ошибка, которую я исправил, изменив значение .count на .count (true) в первой строке. Я получаю сообщение об ошибке в устройстве доступа к значениям, хотя, т. Е. Uncaught TypeError: Невозможно прочитать свойство 'sum' of undefined Я попытался добавить новый экземпляр перекрестного фильтра и рассчитать группировку Subject Subject по делению. Оказывается, я не могу разделить объекты. Моя цель состоит в том, чтобы заполнить диаграмму KPI с процентом отказа экрана, поэтому по существу это единственная метрика, в которой я нуждаюсь. –

+0

Вот ссылка на радиальную диаграмму, которую я пытаюсь создать http://www.brightpointinc.com/clients/brightpointinc.com/library/radialProgress/index.html?source=d3js Мне нужно заполнить ее частота отказа экрана. Мысли? –

+0

Привет Анмол - да, извините за тип в вызове .count (true). Я исправлю это выше. Другая ошибка, которую вы получаете, связана с ошибкой, которую я совершил в функции valueAccessor. Вы получаете полную группу в этой функции, поэтому вам нужно выполнить p.value ... Я тоже это изменю. –

3

Вы можете использовать пользовательские groupAll для этого. Вот прямое решение для перекрестного фильтра, основанное на jsfiddle, который вы предоставили в более позднем вопросе.

(Это намного проще ответить на скрипке, чтобы работать с!)

var all = ndx.groupAll(); 
var failurePercentGroup = all.reduce(
    function(p, v) { 
     ++p.count; 
     p.failures += (v.Status === 'Screen Failure' ? 1 : 0); 
     p.failPercent = p.count ? p.failures/p.count : 0; 
     return p; 
    }, 
    function(p, v) { 
     --p.count; 
     p.failures -= (v.Status === 'Screen Failure' ? 1 : 0); 
     p.failPercent = p.count ? p.failures/p.count : 0; 
     return p; 
    }, 
    function() { 
     return { 
      count: 0, 
      failures: 0, 
      failPercent: 0 
     }; 
    } 
); 

failurePercent.valueAccessor(function (x) { 
    return x.failPercent; 
}) 
    .group(failurePercentGroup); 

@ ответ Итана выглядит, как он должен работать, но заметил в другом месте, что вы не могли заставить его работать.

Обновлено скрипку здесь: http://jsfiddle.net/gordonwoodhull/vct0dzou/8/

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

+0

Спасибо, Гордон :) Наконец, вся картина начинает иметь смысл мне. Отличная работа. Ура! –

Смежные вопросы