Javascript 对聚合结果进行交叉筛选

Javascript 对聚合结果进行交叉筛选,javascript,visualization,dc.js,crossfilter,Javascript,Visualization,Dc.js,Crossfilter,我使用Crossfilter(DC.JS和D3)来可视化大量数据。我喜欢图书馆的交互性,但我的数据很快变得太大了。我认为处理这个问题的最佳方法是,如果数据太大,就预先聚合数据。我很难找出交叉过滤器如何(以及是否)处理此类数据 举例来说,我所拥有的数据是 [ {"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"}, {"date":"01-01-2016","food": "pear", "gend

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

举例来说,我所拥有的数据是

[
    {"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"},
    ...
]
我如何通过可视化这个围绕日期字段的旋转来实现呢?所以知道在2001年1月1日,我有3个人买苹果,2个从DE(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中有几种处理此问题的方法。我将或多或少地按照复杂性的顺序列出它们:

  • 通过对键和值使用标记来收缩记录。例如,
    {date:“01-01-2016”,“food:“apple”,“gender:“M”,“country:“DE”}
    可能会变成
    {d:“01-01-2016”,“f:“a”,“g:“M”,“c:“DE”}
    ,这将为每个记录节省几个字节
  • 如您所述,预先聚合您的记录。就计数而言,这相当容易。如前所述,对预聚合记录数进行预聚合,然后使用
    crossfilter.group.reduceSum(函数(d){return d.count;})
    或类似方法来聚合计数总和。对于其他类型的聚合,它会变得更复杂,可能需要自定义的缩减器,但通常情况下是可能的。如果您遇到了特定的聚合问题,那么创建一个新的问题,并准确地列出问题
  • 只需从服务器端驱动一个基于交叉过滤器的API。您将失去一些交互性,但这是一种可靠的方法。这里记录了几种解决方案:
  • 使用组合方法,在服务器端执行一些预聚合,但仍在客户端处理筛选和最终聚合。我所知道的使用交叉过滤器进行此操作的唯一示例如下:(此处的源代码:)。这是一个真正依赖数据的解决方案,这里没有通用库
  • 与所有这一切正交的是将交叉过滤器移动到web worker,这有助于提高交互性,但不能真正帮助解决数据量问题

    我的建议是:执行上面的#1,并确定您可以支持多少条具有所需交互级别的记录。然后,如有必要,实施#2。如果这还不够,决定3是否是一个选项,如果是,就这样做。否则考虑第4条,但是要理解你正在承担一项相当高级的任务,并且将在很大程度上燃烧你自己的踪迹。
    *为了回答您的任何特定问题,我们需要进一步的信息,例如您试图加载的显示类型的记录的确切数量、您实际需要的维度、您需要创建的组的类型等。

    感谢您的解释。实际上,我的问题是一般性的,你的一般性回答帮助我解决了这个问题。我似乎一直在错误地使用reduceSum。谢谢