2014-07-25 4 views
1

이것은 Splitting and grouping records into daily sets using d3.js and dc.js의 질문입니다. 나는 Y 축과 에 %총 가동 시간을 표시 crossfilter를 사용하여 막대 차트를 만들려고하고Crossfilter (d3js/dcjs) 그룹에 그룹 크기를 가져옵니다.

[ 
    {"device":"device_1", "date": "01/01/2014", "cumulative": 2530}, 
    {"device":"device_2", "date": "01/01/2014", "cumulative": 1234}, 
    {"device":"device_1", "date": "01/02/2014", "cumulative": 456}, 
    {"device":"device_2", "date": "01/02/2014", "cumulative": 198}, 
    ... 
] 

가 :

나는 다음과 같이 보이는 데이터 세트 구조 X 축에 날짜. 누적는 초 값이며 주어진 하루에 8만6천4백초 나는 아주 쉽게 하나의 장치에 대한 %의 가동 시간을 얻을 수 있습니다 (약/일반적으로)이 있다는 것을 :

d3.json("daily.json", function(error, json_data) { 
... 
    json_data.forEach(function(d) { 
    d.dd = dateFormat.parse(d.date); 
    ... 
    }); 

    var das = crossfilter(json_data); 
    var all = das.groupAll(); 

    // dimension by date 
    var dateDimension = das.dimension(function(d) { 
     return d.dd; 
    }); 
    var uptimeDaysGroup = dateDimension.group().reduceSum(function(d) { 
     return Math.round(((86400 - d.cumulative)/86400) * 100); 
    }); 
... 
} 

되는 문제 (등을 할 수있는 원래 데이터 세트에서 확인하십시오) 하루에 두 개 이상의 장치가 있습니다. 장치의 수는 1 ~ 500K 사이에서 가능할 수 있으므로 uptimeDaysGroup 함수를 수정하여 주어진 날짜에 그룹에 추가 된 개체의 수를 얻음으로써이를 고려해야합니다.

답변

2

사용자 지정 그룹을 만들고 그룹의 총 누적 (또는 총 가동 시간 %) 및 장치 수를 추적 한 다음 장치 수로 나누어야합니다. 자기 홍보의 일종 인의 위험에서 reductio는 Crossfilter 그룹화 도우미 함수의 라이브러리입니다 당신은 자신을 그룹화 함께 사용자 정의를 넣을 필요없이이 작업을 수행하기 위해 평균 계산 기능을 사용할 수 있습니다

reductio().count(true) 
    .sum(function(d) { return Math.round(((86400 - d.cumulative)/86400) * 100); }) 
    .avg(true)(uptimeDaysGroup); 

이해야 결과는 날짜 키가있는 그룹 구조와 count, sum 및 avg 속성이있는 "value"객체로 구성됩니다. 또한 예외 집계 옵션이 있지만 하루에 장치 당 하나의 고유 한 레코드 만 있으므로 필요하지 않습니다.

+0

감사합니다. 매우 유용합니다. 나는 그 문서들로부터 분명하지 않은 한 가지 질문만을 가지고있다. '{key :'date ', value : {count : 3, sum : 10}}'(.avg (false))와 같이 새로 축소 된 그룹을 만들었습니다. %를 얻으려면'sum'과'count'로 몇 가지 연산을 수행해야합니다. 일단 내가 해냈을 때 그룹을 '{key :'date ', value 21 :}'(어떻게 값이 계산 된 %입니까?)으로 변환합니까? – tarka

+0

dc.js를 사용하고 있다면 차트의 valueAccessor에 계산을 정의하면됩니다. chart.valueAccessor (function (d) {return d.value.sum/d.value.count;}와 같습니다). 나는 그룹을 바꾸지 않을 것이다. –