2013-07-18 5 views
0

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

, например, преобразовать это:

a,b,c 
1,1,1 
1,2,1 
1,3,1 
1,4,1 
2,1,1 
2,2,1 
2,3,1 
2,4,1 
3,1,1 
3,2,1 
3,3,1 
3,4,1 
3,5,1 
3,6,1 
4,1,1 
4,2,1 

в этом:

a,d 
1,4 
2,4 
3,6 
4,2 

Я опробовал решение, предложенное Адамом Пирсом, но он не работает, так как он собирает данные в виде строки. Основываясь на идее Адамса, я немного изменил код. Я использовал гнездо для агрегации и карты, чтобы получить структуру данных, которую я хотел. Вот что я придумал в конце концов:

var aggregated = d3.nest() 
     .key(function(d) { 
      var ts; 
      var key = new Date(parseInt(d.ms_since_epoch)); 
      key.setMinutes(0); 
      key.setSeconds(0); 
      key.setMilliseconds(0); 
      return key.getTime(); 
     }) 
     .rollup(function(leaves) { return leaves.length; }) 
     .entries(data) 
     .map(function(d) { return {'ms_since_epoch': d.key, 'requests_hour': d.values}; }) 
+0

Идея D3.js заключается в том, чтобы манипулировать способом отображения/визуализации данных. Если вы хотите/должны управлять самими данными, есть некоторая свобода с D3.js, но это не намерение. 'd3.nest', скорее всего, вам нужно. Преобразование влияет только на данные, которые вы подаете на D3.js, а не на _source_ самих данных. – Joum

+0

Кроме того, я заметил, что у вас есть тэг 'python' в вашем профиле. Возможно, это поможет: http://stackoverflow.com/questions/8800111/parse-csv-file-and-aggregate-the-values ​​ – Joum

+0

Конечно! Удачи! – Joum

ответ

2

Я не уверен, что это хорошая идея - вы можете разъединить, как вы читаете данные от того, как вы показываете - но создавая CSV из d3.nest не слишком сложный;

d3.nest() 
    .key(function(d){ return d.a; }) 
    .rollup(function(leaves) { return leaves.length; }) 
    .entries(data) 
    .map(function(d){ return d.key + ',' + d.values; }) 
    .join("\n") 
1

Вы можете сделать это с помощью библиотеки Alasql.

Вы можете прочитать данные из CSV-файлов (а также из XLSX файла):

alasql('SELECT a, COUNT(*) AS d FROM CSV("mydata.csv",{headers:true}) GROUP BY a', 
    [],function(data){ 
    // use data in d3. 
}); 

Или, если у вас уже есть данные, загруженные в память, вы можете использовать синхронизацию версии alasql():

var csvData = [{a:1,b:1,c:1},{a:1,b:2,c:1},{a:1,b:3,c:1}]; 

var data = alasql('SELECT a, COUNT(*) AS d FROM ? GROUP BY a',[csvData]); 

Попробуйте this example at jfFiddle.

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