首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在dc.js/还原/交叉过滤器中生成滚动std线图

如何在dc.js/还原/交叉过滤器中生成滚动std线图
EN

Stack Overflow用户
提问于 2018-04-11 09:16:57
回答 1查看 282关注 0票数 7

我想要显示一个线图,并在日期间隔的值之和上滚动std。

生成交叉筛选器/还原对象的代码是:

代码语言:javascript
复制
myCrossfilter = crossfilter(data);

function getRunningDates(numDays) {
    return function getDates(d) {
        var s = d.ValueDate;
        var e = new Date(s);
        e.setDate(e.getDate() + numDays);
        a = [];
        while (s < e) {
            a.push(s);
            s = new Date(s.setDate(
                s.getDate() + 1
            ))
        }
        return a;
    }
}

var dim1 = myCrossfilter.dimension(getRunningDates(20), true);
var dim2 = myCrossfilter.dimension(dc.pluck("ValueDate"));
var group1 = dim1.group();
var group2 = dim2.group();
var reducerRolling = reductio()
    .std("value");
reducerRolling(group1);
var reducer = reductio()
    .sum("value")
reducer(group2);

我已经将所有的内容都放入了一个jsFiddle中,以表明我的意思(不相关的问题:我不明白图表上的日期如何能超越我在小提琴中定义的dateToInit变量)。

我希望底部图是顶部图形中值的滚动std。最终发生的情况是,底部图中的std计算不首先进行sum聚合(我理解这一点)。

是否有办法将一个组用作另一个组的维度?如果没有,怎样才能达到我所要做的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-17 03:15:34

好的,我想出了一个基于戈登提出的“假小组”方法的解决方案。

我已经用一个工作版本更新了jsFiddle

它的要点是定义自定义还原功能:

代码语言:javascript
复制
reduceAddRunning = function(p,v) {
    if (!p.datesData.hasOwnProperty(v.ValueDate)) {
        p.datesData[v.ValueDate]=0;
    }
    p.datesData[v.ValueDate]+=+v.value;
    p.value+=+v.value;
    return(p);
};
reduceRemoveRunning = function(p,v) {
    p.datesData[v.ValueDate]-=+v.value;
    p.value-=+v.value;
    return(p);
};
reduceInitRunning = function(p,v) {
    return({
        value:0,
        datesData:{},
    });
};

然后建立一个假组:

代码语言:javascript
复制
var running_group = function (source_group,theRunningFn) {
    return {
        all:function () {
            return source_group.all().map(function(d) {
                var arr = [];
                for (var date in d.value.datesData) {
                    if (d.value.datesData.hasOwnProperty(date)) {
                        arr.push(d.value.datesData[date]);
                    }
                }
                return {key:d.key, value:theRunningFn(arr)};
            });
        }
    };
}

在我的例子中,theRunningFnmath.std

我还剩下两个问题,作为一个新问题的基础--我猜:

  • 这太慢了。很高兴听到关于加快速度的建议。(我以前的图形更新很快,现在进展缓慢。)仍然可用,但速度缓慢)
  • 我不知道如何处理边缘案件。时间序列开始时所显示的值没有意义,因为它们基于较少的历史。当我按日期过滤数据时,也会出现同样的问题。

编辑:以下是基于戈登评论的更好解决方案(再次!).

只需做一个正规和组,并应用以下假群函数:

代码语言:javascript
复制
var running_group_2 = function (source_group,numDays,theRunningFn) {
return {
    all:function () {
        var source_arr = source_group.all();
        var keys = source_arr.map(function(d) {return d.key;});
        var values = source_arr.map(function(d) {return d.value;});
        var output_arr = [];

        for (var i = numDays;i<source_arr.length;i++) {
            if (i<numDays) {
                output_arr.push({key:keys[i],value:0});
            } else {
                output_arr.push({
                    key:keys[i],
                    value:theRunningFn(values.slice(i-numDays,i))
                });
            }
        }
        return output_arr;
    }
};
}

它既解决了速度问题(因为它不那么麻烦,也不存储所有要使用的每日值,而是使用已经聚合的值)和边缘情况(即使就边缘情况而言,它不容易被泛化):当我没有足够的点来计算运行变量时,我就不会显示值)。

下面是第二个解决方案(对我来说更好)的jsFiddle

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49771170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档