【问题标题】:dc.js and crossfilter second level aggregation to average count per hourdc.js 和 crossfilter 二级聚合以平均每小时计数
【发布时间】:2017-07-09 19:42:48
【问题描述】:

我正在尝试稍微扩展此问题中描述的问题:

dc.js and crossfilter reduce average counts per day of week

我想绘制一天中每小时的平均计数。我遵循了上面的解决方案,在自定义减少中按天计算值,唯一的变化是按小时计算维度。这似乎运作良好,可以在以下小提琴中看到:

http://jsfiddle.net/dolomite/6eeahs6z/73/

顶部条形图按小时显示平均计数,下部图表按小时显示总计数。所以第 22 小时的总计数为 47,平均计数为 4.2727...数据中有 11 天,所以这是正确的。

但是,当我单击工作日行图并筛选周日时,我得到了 4 小时 22 小时的总计数和平均值 0.3636... 计算平均值的分母仍然包括数据中的所有工作日,与我过滤的工作日无关。因此,虽然总计数已过滤为仅显示 4 表示星期日,但它除以数据中的总天数,而要求只是除以过滤器中选择的天数。

我知道解决方案在于修改自定义 reduce,但我被卡住了!任何关于我哪里出错的指示都将不胜感激。

hourAvgGroup = hourDim.group().reduce(
            function (p, v) { // add
                var day = d3.time.day(v.EventDate).getTime();
                p.map.set(day, p.map.has(day) ? p.map.get(day) + 1 : 1);
                p.avg = average_map(p.map);
                return p;
            },
            function (p, v) { // remove
                var day = d3.time.day(v.EventDate).getTime();
                p.map.set(day, p.map.has(day) ? p.map.get(day) - 1 : 0);
                p.avg = average_map(p.map);
                return p;
            },
            function () { // init
                return { map: d3.map(), avg: 0 };
            }
        )

function average_map(m) {
var sum = 0;
m.forEach(function(k, v) {
    sum += v;
});
return m.size() ? sum / m.size() : 0;
}

【问题讨论】:

    标签: dc.js crossfilter


    【解决方案1】:

    m.size() 计算映射中键的数量。问题是,即使一天分配了 0 条记录,密钥仍然存在,因此 m.size() 将其计入分母。解决方案是在计数变为 0 时删除键。可能有更有效的方法可以做到这一点,但最简单的解决方案是在自定义减速器中的删除函数中添加一行,使函数如下所示:

    function (p, v) { // remove
      var day = d3.time.day(v.EventDate).getTime();
      p.map.set(day, p.map.has(day) ? p.map.get(day) - 1 : 0);
      // If the day has 0 records, remove the key
      if(p.map.has(day) && p.map.get(day) == 0) p.map.remove(day);
      p.avg = average_map(p.map);
      return p;
    },
    

    顺便说一句,我还建议不要在您的组中包括实际平均值和平均值计算。而是在 dc.js 图表 valueAccessor 中计算它。对于添加或删除的每条记录,reducer 都会运行一次。 valueAccessor 每次过滤操作只运行一次。

    【讨论】:

    • 谢谢伊桑!我现在已经意识到,如果在给定的时间内没有活动,那么就没有什么可以添加到地图上,例如如果数据中有两个星期天,一个在 x 小时有 5 个项目,另一个在 x 小时什么都没有,这个平均值应该是 5,而实际上应该是 2.5。我认为我需要以某种方式跟踪数据中存在的每一天的总数?
    • 为一天创建一个维度/组并将其用作 valueAccessor 中的分母?如果您对此有疑问,您可能应该开始一个新问题。 :)
    • 好的,我创建了一个新问题,因为我不太清楚如何访问在 valueAccessor 中用作分母的天数:https://stackoverflow.com/questions/45022097/dc-js-and-crossfilter-custom-valueaccesor
    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多