dc.js和crossfilter降低了一周中每天的平均计数
dc.js and crossfilter reduce average counts per day of week
我很难正确设置交叉过滤器组。也许有人可以暗示一下!
我的数据结构看起来或多或少是这样的:
{datetime: "2014-01-01 20:00:00", id:1}
{datetime: "2014-01-01 22:21:08", id:2}
{datetime: "2014-01-02 12:00:23", id:3} etc...
维度是返回星期几的日期时间:
var weekdayDimension = ndx.dimension(function(d) {
return new Date(d.datetime).getDay();
});
现在我对分组有问题。我想要每个工作日的平均事件数。到目前为止,我有(当然没有正确的)
var weekdayAvgGroup = weekdayDimension.group(function (d) {
return d;
});
我想我不明白这个小组到底在做什么。。。
我的目标是有一些图表,比如:
Monday => Average 40.3 Events
Tuesday => Average 35.4 Events
我创建了一个JSFiddle,请看一看。
有人能暗示一下吗?
更新:
经过进一步思考,我可以在Date上创建一个维度。我所要做的就是知道为了计算而选择的天数
(total amount of events selected/number of selected days)
因此,我需要计算日期维度上的组数。但是还没有找到解决这个问题的办法。
感谢
带注释的股票示例显示了如何进行平均:http://dc-js.github.io/dc.js/docs/stock.html
基本上,您将使用自定义的reduce函数,保持一个计数和一个和,并将和除以计数(如果计数大于零)以获得平均值。
Reduction也让这变得非常容易:https://github.com/esjewett/reductio
编辑:回过头来看,我注意到你指的是一周中每一天的唯一日期的汇总计数的平均值。
我知道已经太晚了,但既然我们有很多这样的"二级汇总"问题,我想我应该回答这个问题,以防它对其他人有帮助。
因此,我们的结果应该在一周中的某一天对数据进行分类,因此我们将相应地设置维度和组:
// dimension on day of week
var dim1 = ndx.dimension(function(d) {
return d[0].getDay();
});
// group on day of week
var grp1 = dim1.group().reduce(
... // what goes here?
);
但是我们如何进行二级聚合呢?crossfilter已经能够高效地提供一周中每一天的所有条目。我们需要做的是计算每个唯一日期的条目。
我们可以使用d3.map
。我们将首先使用d3.time.day
来删除一天中的时间信息,然后使用.getTime()
来获得我们可以索引的整数。然后d3.map
创建"所有周一"、"所有周二"的bin:
var grp1 = dim1.group().reduce(
function(p, v) { // add
var day = d3.time.day(v[0]).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[0]).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};
}
);
最后,我们将使用以下函数计算d3.map
中所有仓的平均值:
function average_map(m) {
var sum = 0;
m.forEach(function(k, v) {
sum += v;
});
return m.size() ? sum / m.size() : 0;
}
每次添加一天时遍历d3.map
可能效率不高,因此对average_map
的调用可能会移动到我们将在图表中使用的valueAccessor
中。我将把它作为练习。
这是一把小提琴,展示了这项技术:http://jsfiddle.net/gordonwoodhull/0woyhg3n/11/
并应用于原始小提琴:http://jsfiddle.net/gordonwoodhull/pkh03azq/6/
- 如何在javascript中获取一年中的周数,其中周日是一周中的第一天
- MomentJS代码不会开始新的一周
- 制作Easing Slider Start横幅取决于一周中的哪一天
- dc.js和crossfilter降低了一周中每天的平均计数
- 如何使用AngularJS$locale选择一周的第一天
- Momentjs 一周的第一天
- 给定特定日期(日/月/年)返回一周的开始 + 结束
- HTML5 Intl API 的一周的第一天
- JS日期选择器能够:时间,日期,日期时间,星期几,一年中的一周,一年中的月份等
- 时刻.js错误,同时在一年的最后一周添加 1 周
- 如何获取两个选定月份日期之间的一周的特定日期
- 从星期一开始一周,使用 isoWeekday()
- 使用 JavaScript 获取给定的日期年份、周数、一周内的日数
- Jquery/Javascript 允许在一周中的特定时间使用特定网页
- 如何在 JavaScript 中将一周中的所有日期放入数组中
- 使用当前日期生成一周的所有日期,并在周一显示周开始日期,在周日显示周末
- 时刻JS,实际一周的第一天是不正确的
- 使用jQuery或JavaScript对一周、一个月和一年的日期进行排序
- JavaScript幻灯片(从其他幻灯片开始,具体取决于一周中的哪一天)
- Moment js没有在一周中的正确日期返回