这里有一个非常奇怪的具体问题,但是在过去的一天左右的时间里,我遇到了很多麻烦。大致来说,我正在尝试使用交叉滤波器来计算数组的最大值,然后使用该值来查找最大值。

例如,我有一系列带有关联的X值和Y值的时间戳。我想按天汇总时间戳,找到最大的X值,然后报告与此时间戳关联的Y值。从本质上讲,这是我所理解的二维。

我能够仅在第一阶段就找到最大值。但是要达到第二个值有很多困难。

第一个的工作代码(使用Crossfilter和Reductio)。假设每一行具有以下四个值。

[(Timestamp,           Date,       XValue, YValue),
 (2015-05-15 16:00:00, 2015-05-15, 30,      15),
 (2015-05-15 16:45:00, 2015-05-15, 25,      33)
 ... (many thousand of rows)]


第一维

ndx = crossfilter(data);
dailyDimension = ndx.dimension(function(d) { return d.date; });


使用Reductionio获得X值的最大值

maxXValue = reductio().max(function(d) { return d.XValue;});
XValues = maxXValue(dailyDimension.group())


XValues现在包含“每日”基础上的所有最大X值。

我现在想使用这些X值来基于日期标识相应的Y值。

使用上面相同的数据,返回的适当值将是:

[(date,          YValue),
  ('2015-05-15', 15)]
// Note, that it is 15 as it is the max X Value we find, not the max Y Value.


在Python / Pandas中,我将DataFrame的索引设置为X,然后进行索引匹配以找到Y值

(请注意,可以安全地假设X值在这种情况下是唯一的,但实际上,我们应该真正确定与此时间段关联的时间戳,然后对其进行匹配,因为它们被严格保证是唯一的,而不是宽松的)。

我相信可以通过修改我无法完全理解的最大缩减代码来实现Source Code is from here

var reductio_max = {
add: function (prior, path) {
    return function (p, v) {
        if(prior) prior(p, v);

        path(p).max = path(p).valueList[path(p).valueList.length - 1];

        return p;
    };
},
remove: function (prior, path) {
    return function (p, v) {
        if(prior) prior(p, v);

        // Check for undefined.
        if(path(p).valueList.length === 0) {
            path(p).max = undefined;
            return p;
        }

        path(p).max = path(p).valueList[path(p).valueList.length - 1];

        return p;
    };
},
initial: function (prior, path) {
    return function (p) {
        p = prior(p);
        path(p).max = undefined;
        return p;
    };
}
};


也许可以对其进行修改,以使第二个Y值的valueList与max函数中关联的X值1:1映射。在这种情况下,将在两个函数中查找相同的索引,并且可以简单地分配它们。

抱歉,我没有任何可用的代码。

一种替代方法是使用某种形式的过滤功能删除不满足X条件的条目,然后按天分组(此设置中仅应有一个值,因此简单的reduceSum例如仍将返回正确的值)。

// Pseudo non working code
dailyDimension.filter(function(p) {return p.XValue === XValues;})
dailyDimension.group().reduceSum(function(d) {return d.YValue;})


最终结果将在dc.js中绘制

最佳答案

不知道这是否行得通,但可以尝试一下:

maxXValue = reductio()
  .valueList(function(d) {
    return ("0000000000" + d.XValue).slice(-10) + ',' + d.YValue;
  })
  .aliasProp({
    max: function(g) {
      return +(g.valueList[g.valueList.length - 1].split(',')[0]);
    },
    yValue: function(g) {
      return +(g.valueList[g.valueList.length - 1].split(',')[1]);
    }
  });
XValues = maxXValue(dailyDimension.group())


使用aliasProp选项进行最大计算的效率较低,使用起来不太安全,这使您可以在每次添加和删除记录时对组进行几乎所有的操作。

我未经测试的假设是,在max / min / median内部使用的未记录valueList函数将正确排序。编写Crossfilter最大聚合可能会更容易/更好,然后对其进行修改以将y值也添加到组中。

如果您想与Reductio一起完成此工作,很高兴在这里与您一起做,但是如果我们有一个类似JSFiddle这样的工作示例,它将更加容易。

关于javascript - 交叉滤镜-二维(第二个值链接到每日最大值),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30447894/

10-12 00:05
查看更多