双重尺寸(与每日最大值相关的第二个值)

这里有一个奇怪的具体问题,但在过去一天左右我一直有很多麻烦。 一般来说,我正在尝试使用交叉过滤器计算数组的最大值,然后使用此值来查找最大值。

例如,我有一系列带有关联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; });

使用约简获得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值在这种情况下是唯一的,但实际上我们应该确定与此时间段相关的时间戳,然后与之匹配,因为它们严格保证是唯一的,而不是松散)。

我相信这可以通过修改reductio最大代码来完成,我不能完全理解源代码是从这里

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;
    };
}
};

也许这可以被修改,以便存在第二个值列表,它将1:1与最大函数中关联的X值进行映射。 在这种情况下,这两个函数中的索引查找是相同的,并且可以简单分配。

我很抱歉,我没有任何更多的工作代码。

另一种方法是使用某种形式的过滤函数来移除不符合X Criteria的条目,然后按日期分组(在此设置中只应该有一个值,因此简单的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选项的最大计算,这使得您可以在每次添加和删除记录时对组进行任何操作。

我这里未经测试的假设是,在内部以最大/最小/中值使用的未记录的valueList函数将正确排序。 编写Crossfilter最大聚合可能会更简单/更好,然后修改它以将y值添加到组中。

如果你想用Reductio来解决这个问题,我很乐意在这里和你一起做这件事,但如果我们有一个像JSFiddle这样的工作例子,它会更容易。

链接地址: http://www.djcxy.com/p/32753.html

上一篇: Double Dimensions (second value linked to daily max)

下一篇: Crossfilter filter based on textbox