【问题标题】:Crossfilter (d3js/dcjs) get group size in groupCrossfilter (d3js/dcjs) 获取组中的组大小
【发布时间】:2014-07-25 10:13:57
【问题描述】:

这是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 函数以通过某种方式获取给定日期已添加到组中的对象数量来考虑这一点。

【问题讨论】:

    标签: javascript d3.js dc.js crossfilter


    【解决方案1】:

    您需要创建一个自定义分组并跟踪该组的总累计(或总正常运行时间百分比)以及设备数量,然后除以设备数量。冒着自我推销的风险,reductio 是一个 Crossfilter 分组辅助函数库,您可以使用它的平均计算功能来执行此操作,而无需自己组装自定义分组:

    reductio().count(true)
        .sum(function(d) { return Math.round(((86400 - d.cumulative) / 86400) * 100); })
        .avg(true)(uptimeDaysGroup);
    

    这应该会产生一个组结构,其中包含日期键和具有计数、总和和平均属性的“值”对象。还有一个异常聚合选项,但由于您每天每台设备只有一个唯一记录,因此您不需要它。

    【讨论】:

    • 谢谢,这很有用。我只有一个问题,文档中并不清楚。一旦我有了新减少的组,例如{ key: 'date', value: { count: 3, sum: 10}} (.avg(false))。为了得到 % 我需要用 sumcount 做一些数学运算。完成后,如何将组转换为:{ key: 'date', value:21}(其中值是我计算的 %)?
    • 我建议如果您使用 dc.js,只需在图表的 valueAccessor 中定义您的计算即可。像 chart.valueAccessor(function(d) { return d.value.sum / d.value.count; })。我不会更改组。
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2020-02-02
    • 1970-01-01
    • 2020-07-24
    • 2014-04-14
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多