2016-11-15 93 views
1

我已经为投资组合的盈利和亏损定义了一张表。对于每一天,P & L都显示在适当的DC条形图中,但我想添加列日期后的累计和。在这个例子中,9月底的回报只有9月份的P片段,10月份是9月份和10月份的片段。如果在交叉过滤器中应用了任何过滤器,则应用的累计总和应适用于过滤的数据。DC.JS Crossfilter - 添加运行累计金额

*

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 

*

任何线索我该怎么处理?我需要还原吗? 在此先感谢!

回答

1

如果您使用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; }) 

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

这是干什么的?维度访问器应该返回一个数组。这个数组被假定为这个记录应该被包含进来的组值列表。所以你希望这个数组包含当前的月份键和记录应该包括在内的所有后续月份的月份键。注意,这应该成为后续个月的数组,而不是以前的个月。有点不直观,但把它看作是“这个数值应该算在几个月内?”这个问题的答案。

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); 
+0

感谢,辉煌! –

+0

是的 - 我认为这更容易理解。如果遇到性能问题,请查看维度数组选项,因为这应该快得多。 –