Crossfilter.js,如何处理日期维度上的人工重复
crossfilter.js, how to deal with artificial duplicates on a date dimension
我正在做一个rails项目。数据结构如下所示。一个会话可以包含多个事件。
[{"id":102,"user_id":"user_2","date":"2015-10-08","count":2,"duration":0,"events":[{"event_type":"Event1","reference_id":"23","duration":2},{"event_type":"Event2","reference_id":"22","duration":3}]}
给定上面的数据结构,我可以基于session_date等等生成图形。但我确实需要根据嵌套事件数组内的数据生成piecharts(通过event_type或reference_id为例)。
现在我做了一些阅读,似乎交叉过滤器在平面数据结构上工作得最好。我将结构扁平化,这样每个事件都有自己的行。
[{"id":102,"date":"2015-10-08","count":2,"duration":0,"event_type":"Event1","reference_id":"23","user_id":"user_1","event_duration":2},{"id":102,"date":"2015-10-08","count":2,"duration":0,"event_type":"Event2","reference_id":"22","user_id":"user_2","duration":3}]
我不再有问题使用前事件jsonarray的数据。但现在我有以下问题,我需要一个条形图显示每天会议的数量。在上面的例子中,我将在2015/10/8有一个带有两个事件的会话。
我创建的日期维度如下:
var dateDimension = ndx.dimension(function(d) {
return d.date;
});
并用于这样分组:
var dateGroup = dateDimension.group();
我像这样初始化图表:
visitorBarChart.width(800)
.height(250)
.dimension(dateDimension).group(dateGroup)
.x(d3.time.scale().domain([minDate,maxDate]))
.xAxisLabel("Date")
.yAxisLabel("Visitors");
但显然,因为我在记录中有重复的日期,这不再工作了。它基本上是按日期计算事件的数量。
我需要一个group(date,id).count.
我对交叉过滤和dc.js完全陌生,我希望我准确地描述了这个问题。我在网上搜索了几个小时,但我还是没能找到这个。
我猜我必须做一些工作与reduceAdd/reduceRemove,但我不能弄清楚
任何帮助将不胜感激!
好吧,我可能自己找到解决办法了。我在我的群组中使用以下函数调用reduce。
function reduceInitial() {
return {
unique: d3.map(),
count: 0
};
}
function reduceAdd(p, v) {
var id = v.id;
var date = v.date;
//is there a date for the current id?
var check = p.unique.get(id);
// nopes add to count, add date to id
if(!check){
++p.count;
p.unique.set(id,date);
}else{
//mhhh that should not be neccessary
if(check != date){
++p.count;
p.unique.set(id,date);
}
}
//console.log(v)
//console.log("---")
//console.log(p)
return p;
}
function reduceRemove(p, v) {
var id = v.id;
var date = v.date;
var check = p.unique.get(id);
if(check){
if(check == date){
p.unique.remove(id);
--p.count;
}
}
return p;
}
我想我可以使用数组而不是d3。
您刚刚得到它,但您还需要跟踪每个ID所看到的每个日期的数量,并且只添加到您看到的第一个日期的计数中,如果没有更多的该日期则从计数中删除。
我将支持Reductio,因为我构建它的主要原因是使这些复杂且计算成本高的聚合更容易正确有效地完成。你要做的就是我所说的异常聚合。使用Reductio,你可以这样做:
var group = dateDimension.group();
var reducer = reductio()
.exception(function(d) { return d.id; })
.exceptionCount(true);
reducer(group);
祝你好运!
- 如何在moment.js中只比较日期
- 使用时刻.js从日期时间中提取时间
- Mongodb/JS:查找最短(最早)日期
- 如何用moment.js列出两个日期之间的所有月份
- 在瞬间格式化日期.js给出 1/1/2016
- 立即获取 EST 日期.js
- 使用日期.js分析方法,而不是当前日期
- ISO 8601日期JS解释差异-IE/FF与Chrome
- 当前日期js代码中字体颜色不变
- 使用时刻修改日期.js
- 如何使用控制器中的过滤器比较日期.js
- 日期.js“tt”格式不起作用
- 从周数生成日期.js
- 这是尝试解析带有时刻的 ASP.NET 日期.js库的错误还是我的代码错误
- 限制名称和日期js cookie每次会话只加载一次
- 生成两个范围之间的日期(js)
- 如何添加月份到日期?js
- 用日期JS/JQ填充字段
- 由时刻生成的日期.js具有无效的属性
- 如何在瞬间比较两个日期.js