2013-10-25 3 views
0

Я пытаюсь преобразовать CSV с данными в формате месяца в формате четверть (в среднем за квартал, а не подводить ..)d3.js: Преобразование Месяцы в квартале

Выходной сигнал мне нужно, это Вложенный массив, как показано ниже в течение месяцев, только для кварталов. Я уже рассчитал каждый квартал за месяц, используя функцию d3.nest, но я не могу заставить его преобразовать его в четверти.

Вот CSV с данными:

x,January,February,March,April,May,June,July 
Overall,3635,3371,3474,4212,4815,5544,4464 
A,1689,1489,1588,2231,2419,2889,2304 
B,316,266,267,323,337,354,435 
C,622,537,629,614,766,720,616 

Вот код, который гнездится данные:

nest = d3.nest().key(function(d) { return d.x; }) 
         .rollup(function(leaves) { var a = []; d3.entries(leaves[0]).forEach(function (k) { if (k.key != "x") a.push({x: k.key, y: k.value, month: k.key, quater: (Math.floor((new Date(Date.parse(k.key + "1, 2013")).getMonth()+1)/3+1))}); }); return a; }); 
data = nest.entries(data); 

что приводит (stipped, чтобы соответствовать ..):

[ 
    { 
     "key":"Overall", 
     "values":[ 
     { 
      "x":"January", 
      "y":"3635", 
      "month":"January", 
      "quater":1 
     }, 
     { 
      "x":"February", 
      "y":"3371", 
      "month":"February", 
      "quater":1 
     }, 
     { 
      "x":"March", 
      "y":"3474", 
      "month":"March", 
      "quater":2 
     }, 
     { 
      "x":"April", 
      "y":"4212", 
      "month":"April", 
      "quater":2 
     }, 
     { 
      "x":"May", 
      "y":"4815", 
      "month":"May", 
      "quater":2 
     }, 
     { 
      "x":"June", 
      "y":"5544", 
      "month":"June", 
      "quater":3 
     }, 
     { 
      "x":"July", 
      "y":"4464", 
      "month":"July", 
      "quater":3 
     } 
     ] 
    }, 
    { 
     "key":"A", 
     "values":[ 
     { 
      "x":"January", 
      "y":"1689", 
      "month":"January", 
      "quater":1 
     }, 
     { 
      "x":"February", 
      "y":"1489", 
      "month":"February", 
      "quater":1 
     }, 
     { 
      "x":"March", 
      "y":"1588", 
      "month":"March", 
      "quater":2 
     }, 
     { 
      "x":"April", 
      "y":"2231", 
      "month":"April", 
      "quater":2 
     }, 
     { 
      "x":"May", 
      "y":"2419", 
      "month":"May", 
      "quater":2 
     }, 
     { 
      "x":"June", 
      "y":"2889", 
      "month":"June", 
      "quater":3 
     }, 
     { 
      "x":"July", 
      "y":"2304", 
      "month":"July", 
      "quater":3 
     } 
     ] 
    }, 
    { 
     "key":"B", 
     "values":[ 
     { 
      "x":"January", 
      "y":"316", 
      "month":"January", 
      "quater":1 
     }, 
     { 
      "x":"February", 
      "y":"266", 
      "month":"February", 
      "quater":1 
     }, 
     { 
      "x":"March", 
      "y":"267", 
      "month":"March", 
      "quater":2 
     }, 
     { 
      "x":"April", 
      "y":"323", 
      "month":"April", 
      "quater":2 
     }, 
     { 
      "x":"May", 
      "y":"337", 
      "month":"May", 
      "quater":2 
     }, 
     { 
      "x":"June", 
      "y":"354", 
      "month":"June", 
      "quater":3 
     }, 
     { 
      "x":"July", 
      "y":"435", 
      "month":"July", 
      "quater":3 
     } 
     ] 
    }, 
    { 
     "key":"C", 
     "values":[ 
     { 
      "x":"January", 
      "y":"622", 
      "month":"January", 
      "quater":1 
     }, 
     { 
      "x":"February", 
      "y":"537", 
      "month":"February", 
      "quater":1 
     }, 
     { 
      "x":"March", 
      "y":"629", 
      "month":"March", 
      "quater":2 
     }, 
     { 
      "x":"April", 
      "y":"614", 
      "month":"April", 
      "quater":2 
     }, 
     { 
      "x":"May", 
      "y":"766", 
      "month":"May", 
      "quater":2 
     }, 
     { 
      "x":"June", 
      "y":"720", 
      "month":"June", 
      "quater":3 
     }, 
     { 
      "x":"July", 
      "y":"616", 
      "month":"July", 
      "quater":3 
     } 
     ] 
    } 
] 

Заранее благодарим за помощь!

ответ

3

Вы загружаете CSV, используя d3.csv? Если это так, ваше текущее преобразование данных может быть выполнено без d3.nest(). Затем d3.nest() можно использовать для сворачивания по кварталам. Вот пример:

d3.csv('data.csv', function(row) { 
    var key = row.x; 
    var entries = d3.entries(row); 

    // remove the first (the x column) 
    entries.shift(); 

    // map the rest of the columns 
    entries = entries.map(function(entry) { 
    return { 
     value: entry.value, 
     month: entry.key, 
     quarter: (Math.floor((new Date(Date.parse(entry.key + "1, 2013")).getMonth()+1)/3+1)) 
    }; 
    }); 


    // nest the array of months by quarter, rollup to return the mean 
    var quarters = d3.nest() 
    .key(function(d) { return +d.quarter; }) 
    .rollup(function(d) { return d3.mean(d, function(d){ return +d.value; })}) 
    .entries(entries); 

    var months = d3.nest() 
    .key(function(d) { return d.month; }) 
    .rollup(function(d) { return d3.sum(d, function(d) { return +d.value; })}) 
    .entries(entries); 

    // return object for this row 
    return { 
    key: row.x, 
    months: months, 
    quarters: quarters 
    }; 
}, function(data) { 
    /* at this point data is an array of objects like: 
    { 
    key: 'Overall', 
    months: [{key: January, values: 123} ....], 
    quarters: [{key: 1, values: 4322}, ....] 
    } 
    */ 

    console.log(data); 
}); 

UPDATE Это будет возвращать один массив, каждый элемент, имеющий месяцев и массив кварталов. В вашем коде визуализации вы можете просто извлечь из соответствующих месяцев или квартала свойство динамически.

Plunker здесь: http://plnkr.co/edit/sVt0T5LrTFJkMiVpkk8F?p=preview

+0

Я использую d3.csv, и, похоже, у нас есть решение! Спасибо, что собрали это. Однако, несмотря на то, что вывод, который я ищу, имеет 2 массива, разделенных на месяцы и кварталы, что означает arr1 = [{ключ: «В целом», значения: месяцы ...}, {ключ: ...}] и arr2 = [{key: "Overall", values: quarters ...}, {key: ...}] <--- Каким будет лучший способ для этого? Я знаю простой способ, просто пробегая массив в функции обратного вызова и создавая 2 дополнительных массива, но я думаю, что это не очень эффективно. – natiz

+0

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

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