【问题标题】:Crossfilter on aggregated results对聚合结果进行交叉过滤
【发布时间】:2016-09-19 09:56:13
【问题描述】:

我正在使用 Crossfilter(DC.JS 和 D3)来可视化大量数据。我喜欢图书馆的交互性,但我的数据很快就变得太大了。我认为处理这个问题的最佳方法是在数据太大时预先聚合我的数据。我很难找出 Crossfilter 如何(以及是否)可以处理此类数据。

为了说明,我拥有的数据是形式

[
    {"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"},
    {"date":"01-01-2016","food": "pear", "gender": "M", "country": "DE"},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "DE"},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "UK"},
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK"},
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK"},
    {"date":"01-02-2016","food": "apple", "gender": "M", "country": "US"},
    ...
]

我将如何通过可视化围绕日期字段进行旋转?那么知道在 01-01,我有 3 个人购买苹果,例如 2 个来自德国(1 个男性,1 个女性)和 1 个来自英国,例如?

我想我可以通过为每个组合计算一种数据立方体然后计算它来做到这一点,如下所示:

[
    {"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE", "count": 100000},
    {"date":"01-01-2016","food": "pear", "gender": "M", "country": "DE", "count": 72651},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "DE", "count": 12345},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "UK", "count": 9287164},
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK", "count": 291732743},
    {"date":"01-02-2016","food": "apple", "gender": "M", "country": "US", "count": 128176376}
    ...
]

但是通过这种设置,我并没有在数据量上赢得太多,而且我不完全确定 Crossfilter 如何/是否可以以这种方式处理表示的数据。

【问题讨论】:

    标签: javascript visualization dc.js crossfilter


    【解决方案1】:

    这个问题很宽泛*,但在这里。

    在 Crossfilter 中有几种方法可以处理这个问题。我将按复杂程度或多或少地列出它们:

    1. 通过对键和值使用标记来缩小记录。例如,{"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"} 可能会变为 {"d":"01-01-2016","f": "a", "g": "M", "c": "DE"},这将为您节省每条记录的几个字节。
    2. 按照您的描述预先汇总您的记录。对于计数,这很容易。您按照您所描述的预聚合记录数的计数进行预聚合,然后使用crossfilter.group.reduceSum(function(d) { return d.count; }) 或类似方法来聚合计数的总和。对于其他类型的聚合,它变得更加复杂,可能需要自定义减速器,但通常有些事情是可能的。如果您在处理特定聚合问题时遇到问题,请针对该问题创建一个新问题并准确列出问题。
    3. 只需从服务器端驱动基于 Crossfilter 的 API。你会失去一些交互性,但这是一种可靠的方法。这里记录了几个解决方案:https://github.com/dc-js/dc.js/wiki/FAQ#how-do-i-replace-crossfilter-with-a-server-side-solution
    4. 使用组合方法,您可以在服务器端进行一些预聚合,但仍然在客户端处理过滤和最终聚合。我知道的使用 Crossfilter 执行此操作的唯一示例在这里:http://lcadata.info(此处的源代码:https://github.com/esjewett/lcadata)。这是一个真正依赖数据的解决方案,这里没有通用库。

    与所有这一切正交的是,将 Crossfilter 转移到网络工作者身上,这有助于提高交互性,但并不能真正帮助解决数据量问题。

    我的建议:执行上面的第 1 条,并确定在所需的交互级别下可以支持多少条记录。然后,如有必要,实施#2。如果这还不够,请确定 #3 是否是一个选项,如果是,请执行此操作。否则请考虑 #4,但要了解您正在执行一项非常高级的任务,并且将在很大程度上开辟自己的道路。

    *为了回答您的任何具体问题,我们需要更多信息,例如您尝试加载的确切类型的记录数、实际需要的维度、需要的组类型创建等

    【讨论】:

    • 感谢您的解释。实际上我的问题是一个通用的问题,您的通用答案帮助我解决了它。我一直在以错误的方式使用 reduceSum,所以看起来。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2015-10-06
    • 1970-01-01
    • 2020-09-05
    • 2014-12-24
    • 2015-07-28
    • 2016-01-11
    相关资源
    最近更新 更多