2013-08-02 3 views
0

Je commence l'apprentissage crossfilter à partir des données de ma liste de transactions bancaires compte:Comment calculer les totaux partiels dans crossfilter?

╔════════════════╦════════╗ 
║ Transact. date ║ Amount ║ 
╠════════════════╬════════╣ 
║ 2000-01-01  ║ +100 $ ║ 
║ 2000-01-02  ║ -25 $ ║ 
║ 2000-02-01  ║ -100 $ ║ 
║ 2000-03-01  ║ +50 $ ║ 
╚════════════════╩════════╝ 

Je veux obtenir des quantités totales par mois et aussi solde partiel (soit la somme supplémentaire de montants totaux mensuels) . Voici la sortie désirée en fonction de l'échantillon des données que je viens de donner:

╔═════════╦═════════════╦═══════════════╗ 
║ Month ║ Tot. amount ║ Part. balance ║ 
╠═════════╬═════════════╬═══════════════╣ 
║ 2000-01 ║  +75 $ ║   +75$ ║ 
║ 2000-02 ║  -100 $ ║   -25$ ║ 
║ 2000-03 ║  +50 $ ║   +25$ ║ 
╚═════════╩═════════════╩═══════════════╝ 

Je n'ai aucun problème à obtenir le montant total, mais je ne peux pas comprendre comment calculer les sommes partielles pour le solde mensuel. Voici mon code:

var ndx = crossfilter(data); 
var month = ndx.dimension(function(d) { return d3.time.month(d.date); }); 
var amountByMonth = month.group().reduceSum(function(d) { return d.amount; }); 
var balanceByMonth = null; // TODO 

Répondre

1

Un moyen simple mais efficace serait de faire une boucle sur vos mois et de calculer le total cumulé.

var months = Object.keys(amountByMonth).sort(); 
var runningTotal = 0; 
for(var i = 0, l = months.length; i < l; i++) { 
    var month = months[i]; 
    runningTotal += amountByMonth[month]; 
    balanceByMonth[month] = runningTotal; 
} 

Puisque le nombre de mois sera toujours gérable (même pour de nombreuses années de données), cela devrait aller.

Questions connexes