我正在使用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个人购买苹果,例如从DE购买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如何/是否能够以这种方式处理所表示的数据。
最佳答案
这个问题相当广泛*,但是这里有。
Crossfilter中有几种方法可以解决此问题。我将按复杂程度或多或少列出它们:
通过使用令牌的键和值来缩小记录。例如,{"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"}
可能会变成{"d":"01-01-2016","f": "a", "g": "M", "c": "DE"}
,这将为您节省每条记录几个字节。
如前所述,预先汇总您的记录。从数量上来说,这很容易。按照预聚合记录数的计数进行预聚合,然后使用crossfilter.group.reduceSum(function(d) { return d.count; })
或类似方法聚合计数的总和。对于其他类型的聚合,它变得更加复杂,可能需要自定义的reducer,但总的来说是可能的。如果您在处理特定的聚合问题时遇到麻烦,请针对该问题创建一个新问题,并准确地列出该问题。
只需从服务器端驱动基于Crossfilter的API。您将失去一些交互性,但这是一种可靠的方法。此处记录了几种解决方案:https://github.com/dc-js/dc.js/wiki/FAQ#how-do-i-replace-crossfilter-with-a-server-side-solution
使用组合方法在服务器端进行一些预聚合,但仍在客户端处理过滤和最终聚合。我知道的使用Crossfilter做到这一点的唯一示例是:http://lcadata.info(此处的源代码:https://github.com/esjewett/lcadata)。这是一个真正的依赖数据的解决方案,这里没有通用库。
与所有这些正交的是将Crossfilter移至网络工作者,这可以帮助实现交互性,但并不能真正帮助解决数据量问题。
我的建议:执行上面的#1并确定您可以支持多少条记录以及所需的交互级别。然后,如有必要,实施#2。如果这还不够,请确定是否要选择#3,然后选择。否则请考虑#4,但要了解您正在执行一项相当高级的任务,并且将在很大程度上开拓自己的足迹。
*为了回答您遇到的任何特定问题,我们将需要更多信息,例如您正尝试加载多少条记录来显示所显示的类型,实际需要的维数,需要创建的组的类型等等。 。
关于javascript - 对汇总结果进行交叉过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39570270/