crossfilter - Crossfilter 组函数的奇怪行为

标签 crossfilter

我在使用 dc.js 和 Crossfilter 时遇到了一个奇怪的问题。想象一下下面的数据和代码

test_data = [{date: d3.time.format("%Y-%m-%dT%H:%M:%S+0100").parse("2014-11-24T12:00:00+0100"), cnt: 1}, 
             {date: d3.time.format("%Y-%m-%dT%H:%M:%S+0100").parse("2014-11-24T11:00:00+0100"), cnt: 2},
             {date: d3.time.format("%Y-%m-%dT%H:%M:%S+0100").parse("2014-11-24T12:00:00+0100"), cnt: 3}],
test_ndx = crossfilter(test_data),
test_dim = test_ndx.dimension(function(d) { return d.date; }),
test_grp = test_dim.group(function(d) { return d.getHours(); });

test_grp.all()返回 [{key: 11, value: 1}, {key: 12, value: 2}]正如我所料。

如果我将最后一行更改为

test_grp = test_dim.group(function(d) { return -d.getHours(); });

test_grp.all()返回 [{key: -11, value: 3}] .

为什么不返回 [{key: -11, value: 1}, {key: -12, value: 2}]

最佳答案

我认为这不是 crossfilter 的问题;我认为这是你违反了 crossfilter API,它指出:

Like the value function, groupValue must return a naturally-ordered value; furthermore, this order must be consistent with the dimension's value function!

https://github.com/crossfilter/crossfilter/wiki/API-Reference#dimension_group

具体

由于减号,groupValue 函数返回的值的顺序与维度 value 函数的值的顺序相反。

我过度简化了,但在下面,交叉过滤器组正试图按照与维度具有自己的所有值的索引相同的顺序保持 bin 的索引。如果组索引中的值乱序,将无法正确确定 bin 边界。这种简单的假设是使交叉过滤器如此之快的部分原因。

这是一个不使用具有相同行为的日期的更简单的示例:

test_data = [{date: 12, cnt: 1}, 
             {date: 11, cnt: 2},
             {date: 12, cnt: 3}],
test_ndx = crossfilter(test_data),
test_dim = test_ndx.dimension(function(d) { return d.date; }),
test_grp = test_dim.group(function(d) { return -d; });

test_grp还包含 [{"key":-11,"value":3}]

一般

事实上,任何date.getAnything()函数通常不会在组值函数(具有维度值函数的日期)中工作,除非观察恰好跨越 Anything。

例如,假设您使用 date.getMonth() - 如果所有的日子都是从一个月开始的,那么你没问题,因为维度的顺序与组的顺序相匹配。但是如果日期是 3 月 29 日、3 月 31 日、4 月 1 日、4 月 2 日,crossfilter 可能会决定它可以在 3 月 29 日结束时创建一个组边界,并将最后三个日期粘贴在第二个 bin 中,或者将组边界粘贴在4 月 1 日结束,其中包含前三个日期。

同样,我正在简化,这并不是 crossfilter 所做的。但是它的算法是依赖<<=对维度值的处理方式与对组值的处理方式相同。如果这不是真的,它不会检测到问题(因为那样会很慢)——它只会默默地创建错误的聚合。

关于 NaN 的常见提示不起作用,因为它没有正确排序,在 crossfilter 之上有一个验证库的空间。但是您仍然需要根据其假设设置交叉过滤器,这使得它的工作非常高效。

关于crossfilter - Crossfilter 组函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455989/

相关文章:

javascript - 如何将 dc.js 与 Ember.js 一起使用?

javascript - dc.js - 从单选按钮中选择减少功能

javascript - DC.js 条形图 x 轴标签未与条对齐

javascript - dc.js:具有嵌套分组的箱线图

javascript - 动态创建和链接 dc.js 图表

javascript - dc.js 制作两种颜色之间的颜色范围

javascript - 如何使用交叉过滤器按类别返回唯一值的数量?

javascript - Crossfilter 过滤和显示数组属性

javascript - 如何减少 Crossfilter 组函数创建的存储桶数量?