fli*_*rch 3 javascript crossfilter dc.js
我很难让我的交叉过滤器组正确设置。也许有人可以给出提示!
我的数据结构或多或少是这样的:
{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...
Run Code Online (Sandbox Code Playgroud)
维度在 datetime 上返回星期几:
var weekdayDimension = ndx.dimension(function(d) {
return new Date(d.datetime).getDay();
});
Run Code Online (Sandbox Code Playgroud)
现在我在分组方面遇到了问题。我想要每个工作日的平均事件数。到目前为止我有(当然不正确)
var weekdayAvgGroup = weekdayDimension.group(function (d) {
return d;
});
Run Code Online (Sandbox Code Playgroud)
我想我不明白那个分组到底在做什么......
我的目标是制作一些图表,例如:
Monday => Average 40.3 Events
Tuesday => Average 35.4 Events
Run Code Online (Sandbox Code Playgroud)
我创建了一个JSFiddle请看一下。
有人可以给点提示吗?
更新:
经过额外的思考,我可以在日期上创建一个维度。我所要做的就是知道选择的天数以计算
(total amount of events selected/number of selected days)
Run Code Online (Sandbox Code Playgroud)
所以我需要计算日期维度上的组数。但也没有找到解决方案。
谢谢
带注释的股票示例显示了如何进行平均:http : //dc-js.github.io/dc.js/docs/stock.html
基本上,您将使用自定义归约函数,维护计数和总和,并将总和除以计数(如果计数大于零)以获得平均值。
Reductio 也使这变得非常简单: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?
);
Run Code Online (Sandbox Code Playgroud)
但是我们如何进行二级聚合呢?已经交叉过滤器将有效地提供一周中每一天的所有条目。我们需要做的是计算每个唯一日期的条目。
我们可以d3.map为此使用。我们将首先使用d3.time.day删除时间信息,然后使用.getTime()获取我们可以索引的整数。然后d3.map创建“所有星期一”、“所有星期二”垃圾箱:
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};
}
);
Run Code Online (Sandbox Code Playgroud)
最后,我们将d3.map使用此函数计算所有 bin 的平均值:
function average_map(m) {
var sum = 0;
m.forEach(function(k, v) {
sum += v;
});
return m.size() ? sum / m.size() : 0;
}
Run Code Online (Sandbox Code Playgroud)
d3.map每次添加一天都走一遍可能效率不高,因此average_map可以将调用移动到valueAccessor我们将在图表中使用的 。我将把它留作练习。
这是一个演示该技术的小提琴:http : //jsfiddle.net/gordonwoodhull/0woyhg3n/11/
并应用于原始小提琴:http : //jsfiddle.net/gordonwoodhull/pkh03azq/6/
| 归档时间: |
|
| 查看次数: |
4893 次 |
| 最近记录: |