2015-02-14 4 views
1

Я пытаюсь получить среднемесячную цифру из некоторых данных о расходах. Я использую d3.js для импорта и свертывания данных из csv, но я не могу отфильтровать только значения из результирующего массива, прежде чем я начну вычислять средние затраты.Вычисление среднего из массива javascript

Я новичок в Javascript, и ничто из этого не кажется интуитивным.

// get filtered data (df) 
d3.csv("/data/cic_data.csv", function (csv) { 

// roll up and group data 
var data = d3.nest() 
    .key(function(d) { return d.date; }) 
    .rollup(function(d) { 
    return d3.sum(d, function(g) {return g.spend; }); 
    }).entries(csv); 

var valueData = data.filter(function(d) { 
    return d.values; 
    }) 

var sum = 0; 
for(var i = 0; i < data.length; i++){ 
    sum += parseInt(data[i], 10); //don't forget to add the base 
} 

var avg = sum/data.length; 

console.log(avg) 

Вот пример моего CSV:

entity,level1,level2,supplier,type,date,spend,year,sin 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,GREEN SHOES ARTS COMMUNITY INTEREST COMPANY,LARGE,2014-07-01,4001.50,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,GREENSPACE INFORMATION FOR GREATER LONDON CIC,OTHER,2014-07-01,2400.00,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,GREEN SHOES ARTS COMMUNITY INTEREST COMPANY,LARGE,2014-06-01,8995.00,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,GREEN SHOES ARTS COMMUNITY INTEREST COMPANY,LARGE,2014-05-01,640.00,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,PUBLIC HEALTH ACTION SUPPORT TEAM CIC,SMALL,2014-05-01,6480.00,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,GREEN SHOES ARTS COMMUNITY INTEREST COMPANY,LARGE,2014-04-01,7286.00,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,GREEN SHOES ARTS COMMUNITY INTEREST COMPANY,LARGE,2014-03-01,15659.50,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,THE SMALL BUSINESS CONSULTANCY LEICESTER CIC,OTHER,2014-03-01,6000.00,2014,12 
BARKING DAGENHAM LONDON BOROUGH COUNCIL,Local Government,LONDON,GREEN SHOES ARTS COMMUNITY INTEREST COMPANY,LARGE,2014-02-01,4001.50,2014,12 
+0

Я думаю, проблема в том, что второй аргумент - это «аксессор», возможно, вам нужно изменить его на третий аргумент, который является «обратным вызовом». Например, try '' 'd3.csv ("/data/cic_data.csv ", function (d) {return d;}, function (csv) {...' '' – josephnvu

ответ

3

Вы просто хотите, среднее значение всех значений в вашем CSV-файл?

После вашего гнезда:

var avg = d3.sum(data, function(d){ 
    return d.values; 
})/data.length; 

Или до:

var avg = d3.sum(csv, function(d){ 
    return +d.spend; 
})/csv.length; 

Или, чтобы избежать так много итераций, во время вашего гнезда:

var sum = 0; 
var data = d3.nest() 
    .key(function(d) { 
    return d.date; 
    }) 
    .rollup(function(d) { 
    return d3.sum(d, function(g) { 
     sum += +g.spend; 
     return g.spend; 
    }); 
    }).entries(csv); 

var avg = sum/data.length; 
0

Вот некоторые комментарии кода :

  • Если код был выполнен как указано выше, некоторые закрывающие скобки отсутствуют. Совет: используйте правильный отступ, чтобы быть в курсе своих областей.
  • Переменная valueDate ничего не делает для вас, поскольку вы не используете ее позже. Также обратите внимание: функция фильтра требует возврата логического значения, чтобы решить, сохраняется ли элемент, если он хранится или отбрасывается.
  • Помимо скобок ваш код не работает только из-за вашего расчета суммы. Вы должны получить доступ к ежедневным значениям с использованием данных [я] .values ​​не только данные [я]

Обратите внимание, что после размещения файла CSV вы получите массив, как: [{ключ: «2014-07- 01" , значения: 6401.5}, {ключ: "2014-06-01", значения: 8995}, ...]

Таким образом

data[0] = {key: "2014-07-01", values: 6401.5} 

и

data[1] = {key: "2014-06-01", values: 8995} 

Это означает, что ваш массив данных содержит объекты как элементы. Для того, чтобы получить доступ к свойству значения вы

data[0].values 

Смотрите также https://github.com/mbostock/d3/wiki/Arrays. Вот полный код с некоторым промежуточным результатом, чтобы понять, что происходит с вашими данными.

<!DOCTYPE html> 
<meta charset="utf-8"> 
<body> 
<script src="http://d3js.org/d3.v3.min.js"></script> 
<script> 
    // get filtered data (df) 
    d3.csv("cic_data.csv", function (sv) { 
    // roll up and group data 
    console.log("Before nesting:"); 
    console.log(csv); 
    var data = d3.nest() 
     .key(function(d) { return d.date; }) 
     .rollup(function(d) { 
      return d3.sum(d, function(g) {return g.spend; }); 
     }).entries(csv); 
    console.log("After nesting:"); 
    console.log(data); 

    var sum = 0; 
    for(var i = 0; i < data.length; i++){ 
     sum += parseInt(data[i].values, 10); //don't forget to add the base 
    } 

    var avg = sum/data.length; 
    console.log(avg); 
    }) 
</script> 
</body> 
</html> 
+0

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

+0

woodbine: Хорошо, я вижу. Мой ответ должен помочь, jusr изменит данные [i] на данные [i] .значения, когда я опубликовал и он должен работать. Чистить делать принуждение к числу с возвратом + g.spend – ee2Dev

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