我使用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 = _; }
实际上计算平均值。
总体: 我想我的大问题是,通过这个函数,它似乎是找到一维数组的移动平均值。为了使用它,我是否必须将我的数据转换为一维数组,还是有办法稍微改变函数本身?我很难改变这个功能,因为从语法上来说这有点令人困惑。
答案 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/