首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Crossfilter - Double Dimensions (第二个值链接到每日最大值)

Crossfilter - Double Dimensions (第二个值链接到每日最大值)
EN

Stack Overflow用户
提问于 2015-05-26 09:00:11
回答 1查看 327关注 0票数 1

这是一个相当奇怪的具体问题,但在过去一天左右的时间里,我遇到了很多麻烦。一般而言,我尝试使用crossfilter计算数组的最大值,然后使用该值找到最大值。

例如,我有一系列时间戳,其中有一个关联的X值和一个Y值。我想按天汇总时间戳并找到最大X值,然后报告与此时间戳关联的Y值。根据我的理解,本质上这是一个双重维度。

我可以做第一个阶段,简单地找出最大值。但是我很难达到第二个值。

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

代码语言:javascript
复制
[(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)]

第一个维度

代码语言:javascript
复制
ndx = crossfilter(data);
dailyDimension = ndx.dimension(function(d) { return d.date; });

使用reductio获取X值的最大值

代码语言:javascript
复制
maxXValue = reductio().max(function(d) { return d.XValue;});
XValues = maxXValue(dailyDimension.group())

XValues现在包含每天的所有最大X值。

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

使用与返回的相应值相同的数据为:

代码语言:javascript
复制
[(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 maximum代码来实现,我没有完全正确地理解Source Code is from here

代码语言:javascript
复制
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仍将返回正确的值)。

代码语言:javascript
复制
// Pseudo non working code
dailyDimension.filter(function(p) {return p.XValue === XValues;})
dailyDimension.group().reduceSum(function(d) {return d.YValue;})

最终结果将以dc.js格式绘制

EN

回答 1

Stack Overflow用户

发布于 2015-05-26 11:14:50

不确定这是否有效,但也许可以试一试:

代码语言:javascript
复制
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 maximum aggregation,然后修改它以将y值添加到组中。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30447894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档