从 javascript 数组计算平均值

Calculating an average from a javascript array

我正在尝试从一些支出数据中获取每月平均数字。我正在使用 d3.js 从 csv 导入和汇总数据,但在我继续计算平均支出之前,我似乎无法仅过滤掉结果数组中的值。

我是 Javascript 的新手,none 感觉非常直观。

// 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

您只想要 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;

以下是对您的代码的一些评论:

  • 如果代码如上所示是完整的,则缺少一些右括号。提示:使用适当的缩进来了解您的范围
  • 变量 valueDate 不会为您做任何事情,因为您以后不会使用它。另请注意,过滤器函数需要 return 一个布尔值来决定是保留还是删除元素。
  • 除了括号之外,您的代码仅因为求和计算而无法正常工作。您需要使用 data[i].values 而不仅仅是 data[i]
  • 来访问您的每日值

请注意,在嵌套 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>