【问题标题】:Calculating an average from a javascript array从 javascript 数组计算平均值
【发布时间】:2015-02-14 18:38:18
【问题描述】:

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

我是 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

【问题讨论】:

  • 我认为问题在于第二个参数是“访问器”,也许您需要将其更改为第三个参数,即“回调”。喜欢试试d3.csv("/data/cic_data.csv", function(d){ return d; }, function (csv) { ...

标签: javascript arrays d3.js


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    以下是您的代码中的一些 cmets:

    • 如果代码如上完整,则缺少一些右括号。提示:使用适当的缩进来了解您的范围
    • 变量 valueDate 不会为您做任何事情,因为您以后不会使用它。另请注意,过滤器函数需要返回一个布尔值来决定是保留还是删除元素。
    • 除了括号之外,您的代码仅因为您的求和计算而无法工作。您需要使用 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}
    

    这意味着您的数据数组包含对象作为元素。要访问您所做的 values 属性

    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>
    

    【讨论】:

    • ee2Dev,我只发布了脚本的摘录。我应该说。日期值稍后在脚本中用于图表。
    • woodbine:好的,我明白了。我的回答应该仍然有帮助,就像我发布的那样,将 data[i] 更改为 data[i].values 并且它应该可以工作。使用 return +g.spend 对数字进行强制转换更干净
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    相关资源
    最近更新 更多