这种移动平均功能如何工作?

时间:2014-05-30 11:51:19

标签: javascript jquery d3.js moving-average

我使用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 = _; }

实际上计算平均值。

总体: 我想我的大问题是,通过这个函数,它似乎是找到一维数组的移动平均值。为了使用它,我是否必须将我的数据转换为一维数组,还是有办法稍微改变函数本身?我很难改变这个功能,因为从语法上来说这有点令人困惑。

1 个答案:

答案 0 :(得分:2)

我必须同意这段代码有点令人困惑。如果我理解正确它适用于1D阵列?并且您希望它能够与2D阵列一起使用。我猜你想要一个带有'值的movingWindowAvg。

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

我做了一个小转换功能,将切片的2D数组wnd转换为1D数组,因为我不知道d3是如何工作的。

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

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/