这里有一个奇怪的具体问题,但过去一天左右我遇到了很多麻烦。从广义上讲,我尝试使用crossfilter计算数组的最大值,然后使用此值来查找最大值。
例如,我有一系列带有关联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; });
使用reductio
获取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,它将1:1与max函数中的X值相关联。在这种情况下,它将与函数中的两个索引相同,并且可以简单地分配。
我很抱歉我没有更多有效的代码。
另一种方法是使用某种形式的过滤功能来删除不满足X条件的条目,然后按日分组(此设置中应该只有一个值,所以简单的reduceSum例如将仍然返回正确的值。)
// Pseudo non working code
dailyDimension.filter(function(p) {return p.XValue === XValues;})
dailyDimension.group().reduceSum(function(d) {return d.YValue;})
最终结果将在dc.js
中绘制答案 0 :(得分:3)
不确定这是否有效,但可以尝试一下:
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这样的工作示例,那将会更容易。