Javascript 移动平均线函数是如何工作的?
我正在使用Javascript 移动平均线函数是如何工作的?,javascript,jquery,d3.js,moving-average,Javascript,Jquery,D3.js,Moving Average,我正在使用d3来可视化一些数据。我的其中一个数据集的形式为: [[date,value],[date,value]等]跳跃很多,我想加入移动平均线 我从Stack Overflow中找到了这个函数作为计算移动平均值的解决方案,但我觉得使用它不合适,因为(1)我不理解它是如何工作的,而(2),它似乎不适用于我的数据 以下是函数(取自): 逐行: var movingWindowAvg = function(arr, step) { 创建一个函数,该函数包含1D数组的参数和一个步骤,该步骤决定每个
d3
来可视化一些数据。我的其中一个数据集的形式为:
[[date,value],[date,value]等]
跳跃很多,我想加入移动平均线
我从Stack Overflow中找到了这个函数作为计算移动平均值的解决方案,但我觉得使用它不合适,因为(1)我不理解它是如何工作的,而(2),它似乎不适用于我的数据
以下是函数(取自):
逐行:
var movingWindowAvg = function(arr, step) {
创建一个函数,该函数包含1D数组的参数和一个步骤
,该步骤决定每个平均点使用多少值
return arr.map(function(_, idx) {
var result = d3.sum(wnd) / wnd.length; if (isNaN(result)) { result = _; }
将数组映射到(某物?),我知道\uu
是一个通配符运算符,类似于OCaml,而idx
是id
var wnd = arr.slice(idx - step, idx + step + 1);
似乎wnd
代表窗口,因此查找数据子集以用作第一个移动平均点的平均窗口
return arr.map(function(_, idx) {
var result = d3.sum(wnd) / wnd.length; if (isNaN(result)) { result = _; }
实际计算平均值
总体:
我想我的大问题是,通过这个函数,它似乎是为了找到一维数组的移动平均值。为了使用它,我必须将数据转换成一维数组,还是有办法稍微改变函数本身?我很难修改这个函数,因为它在语法上有点混乱。我不得不承认这段代码有点混乱。如果我理解正确,它可以用于1D阵列?您希望它能够与2D阵列一起使用。我猜你想要一个带有“value”的movingWindowAvg
.map()
是一个在数组中循环的函数。所以对于第一个循环<代码>.=[0,0]和idx=0
,然后对于第二个循环.=[1,1]
和idx=1
。要获得\uu
的正确值,只需执行\u=\ u[1]'
我做了一个小的转换函数来将切片的2D数组wnd
转换为1D数组,因为我不知道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;
}
var数据=[
[0, 0],
[1, 1],
[2, 2],
[3, 3]
];
var movingWindowAvg=功能(arr,阶跃){
返回arr.map(函数(x,idx){
_=_[1];
var wnd=arr.slice(idx-步骤,idx+步骤+1);
警报('wnd:'+wnd);
var结果=d3.总和(to1D(wnd))/wnd.长度;
如果(isNaN(结果))
{
结果=;
警报('不是一个res'+979;);
}
返回结果;
});
};
日志(movingWindowAvg(数据,1));
函数TOAD(wnd)
{
var nwnd=新数组();
对于(变量i=0;i
下面是一个JSFIDLE,带有一个运行演示: