【问题标题】:How does this moving average functions work?这个移动平均函数是如何工作的?
【发布时间】:2014-07-20 04:11:52
【问题描述】:

我正在使用d3 来可视化一些数据。我的数据集之一,格式为:

[[date, value], [date, value], etc...] 跳动很多,我想加入移动平均线。

我从 Stack Overflow 找到了这个函数作为计算移动平均线的解决方案,但我觉得使用它不太合适,因为 (1) 我不明白它是如何工作的,并且 (2),它似乎不适用于我的数据。

这是函数(取自d3.js moving average with previous and next data values):

var movingWindowAvg = function(arr, step) {
        return arr.map(function(_, idx) { 
          var wnd = arr.slice(idx - step, idx + step + 1); 
          var result = d3.sum(wnd) / wnd.length; if (isNaN(result)) { result = _; }
          return result;
        });
      };

逐行:

var movingWindowAvg = function(arr, step) {

使用一维数组和 step 的参数创建一个函数,该函数决定您对每个单独的平均点使用多少值。

return arr.map(function(_, idx) { 

将数组映射到(什么?),我知道_ 是通配符运算符,就像来自OCaml,而idx 是id?

var wnd = arr.slice(idx - step, idx + step + 1);

似乎wnd 代表窗口,因此找到数据的子集用作第一个移动平均点的平均窗口。

var result = d3.sum(wnd) / wnd.length; if (isNaN(result)) { result = _; }

实际计算平均值。

总体: 我想我的大问题是,通过这个函数,它似乎是为了找到一维数组的移动平均值。为了使用它,我是否必须将我的数据转换为一维数组,或者有没有办法稍微改变函数本身?我很难更改函数,因为它在语法上有点混乱。

【问题讨论】:

    标签: javascript jquery d3.js moving-average


    【解决方案1】:

    我不得不同意这段代码有点混乱。如果我理解正确,它适用于一维数组吗?并且您希望它与 2D 数组一起使用。我猜你想要一个带有“值”的movingWindowAvg。

    .map() 是一个循环遍历数组的函数。所以对于第一个循环。 _ = [0,0]idx = 0,然后是第二个循环 _ = [1,1]idx = 1。要获得 _ 的正确值,您需要做的就是 _ = _[1]'

    我做了一个小转换函数来将您的切片二维数组wnd 转换为一维数组,因为我真的不知道 d3 是如何工作的。

    isNaN(result) 只是检查结果是否不是数字,并给它一个数字_

    var data = [
        [0, 0],
        [1, 1],
        [2, 2],
        [3, 3]
    ];
    
    var movingWindowAvg = function(arr, step) {
            return arr.map(function(_, idx) { 
              _=_[1];
              var wnd = arr.slice(idx - step, idx + step + 1); 
              alert('wnd: ' + wnd);
              var result = d3.sum(to1D(wnd)) / wnd.length;
              if (isNaN(result))
              { 
                  result = _; 
                  alert('not a res ' + _);
              }
              return result;
            });
    };
    console.log(movingWindowAvg(data, 1));
    
    function to1D(wnd)
    {
        var nwnd = new Array();
        for(var i = 0; i < wnd.length; i++)
        {
             nwnd.push(wnd[i][1]); //1 to access value   
        }
        return nwnd;
    
    }
    

    这是一个带有工作演示的 jsfiddle:http://jsfiddle.net/Grimbode/6mNWE/1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多