这是来自 Splitting and grouping records into daily sets using d3.js and dc.js 的后续问题。
我有一个如下所示的数据集结构:
[
{"device":"device_1", "date": "01/01/2014", "cumulative": 2530},
{"device":"device_2", "date": "01/01/2014", "cumulative": 1234},
{"device":"device_1", "date": "01/02/2014", "cumulative": 456},
{"device":"device_2", "date": "01/02/2014", "cumulative": 198},
...
]
我正在尝试使用 crossfilter 创建一个条形图,以在 Y 轴上显示总正常运行时间百分比,在 X 轴上显示日期。累积是一个以秒为单位的值,假设一天有(大致/通常)86400 秒,我可以很容易地获得单个设备的正常运行时间百分比:
d3.json("daily.json", function(error, json_data) {
...
json_data.forEach(function(d) {
d.dd = dateFormat.parse(d.date);
...
});
var das = crossfilter(json_data);
var all = das.groupAll();
// dimension by date
var dateDimension = das.dimension(function(d) {
return d.dd;
});
var uptimeDaysGroup = dateDimension.group().reduceSum(function(d) {
return Math.round(((86400 - d.cumulative) / 86400) * 100);
});
...
}
问题是(正如您从原始数据集中看到的那样)每天有不止一台设备。设备数量可能在 1 到 500K 之间,因此我需要修改 uptimeDaysGroup
函数以通过某种方式获取给定日期已添加到组中的对象数量来考虑这一点.
最佳答案
您需要创建一个自定义分组并跟踪该组的总累计时间(或总正常运行时间百分比)以及设备数量,然后除以设备数量。冒着 self 推销的风险,reductio是一个 Crossfilter 分组辅助函数库,您可以使用其平均计算功能来执行此操作,而无需自己将自定义分组放在一起:
reductio().count(true)
.sum(function(d) { return Math.round(((86400 - d.cumulative) / 86400) * 100); })
.avg(true)(uptimeDaysGroup);
这应该会产生一个组结构,该结构具有日期键和具有计数、总和和平均属性的“值”对象。还有一个异常聚合选项,但由于您每天每台设备只有一个唯一记录,因此您不需要它。
关于javascript - Crossfilter (d3js/dcjs) 获取组内组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24953359/