2016-11-15 61 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

是的 - 我認爲這更容易理解。如果遇到性能問題,請查看維度數組選項,因爲這應該快得多。 –