DC.JS Crossfilter - 添加运行累积总和

时间:2016-11-15 21:12:12

标签: javascript dc.js crossfilter

我已经为投资组合的盈亏定义了一张表。对于每一天,P& L显示在适当的DC条形图中,但我想在列日期之后添加累积总和。在示例中,应该返回9月底的9月的P& L切片,10月的9月和10月的切片等等。如果任何过滤器适用于交叉过滤器,则应用的累积总和应适用于过滤后的数据。

*

Date,Cpty,internalRating,ratingSegment,externalRating,Sector,assetClass,riskFactor,riskBucket,sensi,marketMove,PL
30.09.16,DEF,2A,IND,AA,Industrials,IR,EUR,10,-1000,2,-2000
30.09.16,JKL,3B,SERV,BBB,Services,IR,USD,10,-1000,4,-4000
30.09.16,JKL,3B,SERV,BBB,Services,IR,JPY,10,-10000,6,-60000
30.09.16,JKL,3B,SERV,BBB,Services,CS,CDS_JKL,10,-4000,4,-16000
30.09.16,MNO,2B,TRAN,BB,Transportations,IR,EUR,10,1000,-4,-4000
30.09.16,MNO,2B,TRAN,BB,Transportations,CS,CDS_MNO,10,-1000,5,-5000
31.10.16,DEF,2A,IND,AA,Industrials,IR,EUR,10,-1500,6,-9000
31.10.16,JKL,3B,SERV,BBB,Services,IR,USD,10,1500,12,18000
31.10.16,JKL,3B,SERV,BBB,Services,IR,JPY,10,15000,18,270000
31.10.16,JKL,3B,SERV,BBB,Services,CS,CDS_JKL,10,6000,12,72000
31.10.16,MNO,2B,TRAN,BB,Transportations,IR,EUR,10,-1500,-12,18000
31.10.16,MNO,2B,TRAN,BB,Transportations,CS,CDS_MNO,10,1500,15,22500
30.11.16,DEF,2A,IND,AA,Industrials,IR,EUR,10,1428,6,8568
30.11.16,JKL,3B,SERV,BBB,Services,IR,USD,10,1085,12,13020
30.11.16,JKL,3B,SERV,BBB,Services,IR,JPY,10,5046,18,90828
30.11.16,JKL,3B,SERV,BBB,Services,CS,CDS_JKL,10,2579,12,30948
30.11.16,MNO,2B,TRAN,BB,Transportations,IR,EUR,10,-253,-12,3036
30.11.16,MNO,2B,TRAN,BB,Transportations,CS,CDS_MNO,10,409,15,6135

*

有什么线索我可以继续吗?我需要减少吗? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

如果您使用的是Crossfilter 1.4.0-alpha.06,则可以使用array dimension执行此操作。如下所示:

function getDates(d) {
  // This function should return an array of dates or months from
  // d.Date until the end of the year.
  return [...]
}
var cf = crossfilter(data)
var runningSumDim = cf.dimension(getDates, true)
var runningSumGroup = runningSumDim.sum(function(d) { return d.PL; })

一旦你计算出导出后续月份数组的逻辑,这应该“正常工作”。

这是做什么的?维度访问器应返回一个数组。假设此数组是应包含此记录的组值列表。因此,您希望数组包含当前月份密钥以及记录应包含在所有后续月份的月份密钥。注意,这应该是一个后续个月的数组,而不是之前的个月。有点违反直觉,但把它想象为“这个价值应该计入几个月的问题的答案?”。

答案 1 :(得分:2)

作为@ Ethan巧妙回答的替代方案,这对于一个假冒组织来说也是一个很好的机会。 (以及该技术IIRC的首次记录使用之一)。

来自the dc.js FAQ

function accumulate_group(source_group) {
    return {
        all:function () {
            var cumulate = 0;
            return source_group.all().map(function(d) {
                cumulate += d.value;
                return {key:d.key, value:cumulate};
            });
        }
    };
}

像这样使用:

data.forEach(function(r) {
    r.Date = dateFormat.parse(r.Date);
});
var cf = crossfilter(data)
var dateDim = cf.dimension(function(d) { return d.Date; });
var plGroup = dateDim.sum(function(d) { return d.PL; });
var accumPLGroup = accumulate_group(plGroup);