我不知道你是否还在寻求任何帮助,但我自己刚刚克服了这个问题,我想我会分享我的解决方案,以防它帮助其他人。
首先,我声明了一些非常标准的reduce 函数来返回一个简单的平均值,并添加了两个变量来存储 t-1 和 t-2 的平均值。我创建了一个 3 周期移动平均线,但如果您想要一个更长的移动平均线,您可以轻松地将这些变量替换为您 push 和 splice 数据传入/传出的数组。
function movingAveInit(){
return {
total: 0,
count: 0,
average: 0,
//These are the two vars for storing previous periods
avet1: 150000,
avet2: 150000
};
}
function movingAveAdd(p,v){
//'apples' is the property that you're interested in finding the moving average for
p.total = p.total + v.apples;
p.count = p.count +1;
p.avet2 = p.avet1;
p.avet1 = p.average;
p.average = p.total/p.count;
return p;
}
function movingAveRemove(p,v){
p.total = p.total - v.apples;
p.count = p.count - 1;
p.avet2 = p.avet1;
p.avet1 = p.average;
p.average = p.total/p.count;
return p;
}
接下来在您的组中调用这些(维度应该是您使用的任何时间段):
var movingAverageGrp = yourDimension.group().reduce(movingAveAdd, movingAveRemove, movingAveInit);
现在,当您使用该组构建图表时,将以下内容添加到其valueAccessor():
yourChart
.valueAccessor(function (d) {
var mAv = ((d.value.avet2 + d.value.avet1 + d.value.average) / 3);
return mAv;
})
如果您将以前的周期存储在一个数组中,则可以使用此函数来计算移动平均线:
.valueAccessor(function (d) {
var sum = d.value.yourArray.reduce(function(a, b){ return a + b; });
var count = d.value.yourArray.length;
var mAv = (sum / count);
return mAv;
})
这不是一个特别漂亮的解决方案,但它似乎对我有用。