首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用reductio计算第n个百分位数时出现问题

使用reductio计算第n个百分位数时出现问题
EN

Stack Overflow用户
提问于 2018-04-26 07:45:32
回答 1查看 101关注 0票数 1

我得到了一些带有日期(d)和值(v)的交叉过滤数据:

代码语言:javascript
复制
[
 {d: "2013-07-26T00:00:00.000Z", v: 2.5}
 {d: "2013-07-25T00:00:00.000Z", v: 2.64}
 // ...and many more
[

我已经为Crossfilter (crossfilter2@1.4.5)中的月份创建了一个组:

代码语言:javascript
复制
months = cf.dimension((d) => {
    const dateObj = new Date(d.d);
    // use 1-12 instead of 0-11
    return dateObj.getMonth() + 1;
});

monthsGroup = months.group();

因此,monthsGroup.all()返回一个包含12个对象的数组,这些对象按月聚合。我希望这些对象包括最小、最大和中位数,以及第25和75个百分位数。Reductio (reductio@0.6.3)有助于处理开箱即用的最小、最大和中值,因此我添加了一个自定义聚合器来添加第75和第25个百分位数。

下面的代码可以工作,但速度非常慢:

代码语言:javascript
复制
const monthReducer = reductio()
.valueList(d => d.v)
.min(true)
.max(true)
.median(true)
.count(true)
.custom({
    add(p) {
        const valueList = p.valueList;
        p.p75 = getPercentile(valueList, 75);
        p.p25 = getPercentile(valueList, 25);
        return p;
    },
    remove(p) {
        const valueList = p.valueList;
        p.p75 = getPercentile(valueList, 75);
        p.p25 = getPercentile(valueList, 25);
        return p;
    },
    initial(p) {
        p.p75 = undefined;
        p.p25 = undefined;
        return p;
    },
});

如果我删除.custom块,速度会快得多。这将运行data中每个项目的代码,这是不必要的,因为它只需要查看最终的valueList。Reductio有一个几乎没有文档的.post()钩子,我认为它在这里可以做到这一点,但我不能让它工作。

更新:我让后处理钩子回调函数运行,但它并不像我预期的那样工作。

我尝试使用我在源代码中看到的未记录的方法注册一个新的后处理器:

代码语言:javascript
复制
// register post-processing function to add percentiles
reductio.registerPostProcessor('addPercentiles', (prior) => {
    const all = prior();
    return () => {
        const updated = all.map((e) => {
            const valueList = e.value.valueList;
            e.value.p75 = getPercentile(valueList, 75);
            e.value.p25 = getPercentile(valueList, 25);
            return e;
        });
        return updated;
    };
});

并将其添加到post()钩子中:

代码语言:javascript
复制
// run post-processing to add the 25th & 75th %iles
this.monthsGroup.post().addPercentiles()();

这似乎是我想要的,但只有一次。当过滤器被应用到另一个维度时,它不会重新运行post钩子。

如果中位数只是第50个百分位数,那么也可以得到第25个和第75个百分位数。我觉得我已经很接近了,但很明显我做错了什么。如何将这些聚合添加到reductio reducer中?

EN

回答 1

Stack Overflow用户

发布于 2018-05-29 06:48:48

一种解决方案是在呈现图表之前手动添加分位数。我有一个formatData函数执行日期/时间格式化,并重新构造数据以使其对d3更友好。由于valueList在数组的每个元素中仍然可用,所以我只添加了几行代码来计算其中的第25和27个百分位数。

不是很理想,但很简单!

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

https://stackoverflow.com/questions/50032806

复制
相关文章

相似问题

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