Javascript 交叉过滤器-双维度(第二个值链接到每日最大值)

Javascript 交叉过滤器-双维度(第二个值链接到每日最大值),javascript,dc.js,crossfilter,Javascript,Dc.js,Crossfilter,这是一个非常特别的问题,但在过去的一天左右,我遇到了很多麻烦。大体上,我尝试使用交叉过滤器计算数组的最大值,然后使用此值来查找最大值 例如,我有一系列时间戳,带有一个关联的X值和一个Y值。我希望按天聚合时间戳,并找到最大的X值,然后报告与此时间戳关联的Y值。本质上,这是我所理解的一个双重维度 我可以做第一步,简单地找到最大值。但是我很难理解第二个值 第一个的工作代码(使用交叉过滤和还原)。假设每行具有以下四个值 [(Timestamp, Date, XValue,

这是一个非常特别的问题,但在过去的一天左右,我遇到了很多麻烦。大体上,我尝试使用交叉过滤器计算数组的最大值,然后使用此值来查找最大值

例如,我有一系列时间戳,带有一个关联的X值和一个Y值。我希望按天聚合时间戳,并找到最大的X值,然后报告与此时间戳关联的Y值。本质上,这是我所理解的一个双重维度

我可以做第一步,简单地找到最大值。但是我很难理解第二个值

第一个的工作代码(使用交叉过滤和还原)。假设每行具有以下四个值

[(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中,我将数据帧的索引设置为X,然后进行索引匹配以查找Y值

(注意,在这种情况下可以安全地假设X值是唯一的,但实际上我们应该真正识别与此时段相关的时间戳,然后匹配,因为严格保证它们是唯一的,而不是松散的)

我相信这可以通过修改reductio-maximum代码来实现,我并不完全理解它

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

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

另一种方法是使用某种形式的过滤函数删除不符合X标准的条目,然后按天分组(此设置中应该只有一个值,因此,例如简单的reduceSum仍将返回正确的值)


最终结果将绘制在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函数将正确排序。编写一个交叉筛选器最大聚合,然后对其进行修改,将y值添加到组中,可能更容易/更好


如果你想用ReduceTio解决这个问题,我很高兴在这里与你一起解决,但是如果我们有一个类似JSFIDLE的工作示例,这将更容易。

嗨,Ethan,这完成了所需的90%,但是你关于它在过滤器上破裂的假设是正确的。未捕获的TypeError:无法读取最大值函数中未定义的属性“0”。我正在考虑建立一个JSFIDLE。@Dantes419听起来不错。如果你能解决这个问题,请告诉我。同时,我更新了这个示例,使用了一个连接字符串,并填充了x值零。同样,它可能包含一些bug,但希望它能为您提供一些想法。这应该与筛选一起工作,因为值列表应该正确排序。
// Pseudo non working code
dailyDimension.filter(function(p) {return p.XValue === XValues;})
dailyDimension.group().reduceSum(function(d) {return d.YValue;})
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())