javascript - Crossfilter (d3js/dcjs) 获取组内组大小

标签 javascript d3.js dc.js crossfilter

这是来自 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/

相关文章:

javascript - windows.resize() 不起作用

javascript - 条形图和折线图在 dc.js 中不交互

dc.js - 为什么我的饼图在使用 dc.js 和 crossfilter.js 中的堆叠条形图进行过滤时显示不正确的组?

javascript - dc.js 折线图每个点后从零开始

javascript - 测试 javascript 执行期间互联网连接丢失

javascript - Jquery 无法返回动画菜单列表上的事件状态

javascript - session 关闭后 Cookie 未被删除

javascript - 以编程方式确定是否可以在对象上运行 for 循环的最佳解决方案

javascript - d3js 步进线图 - 鼠标悬停时突出显示两点之间的线