如何计算crossfilter中的部分总数?

时间:2013-08-02 13:42:02

标签: d3.js crossfilter

我开始使用银行帐户交易清单中的数据来学习 crossfilter

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

我想获得按月计算的总金额以及部分帐户余额(即每月总金额的增量总和)。这是基于我刚给出的样本数据所需的输出:

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

我在获取总金额方面没有问题,但我无法理解如何计算每月余额的部分金额。这是我的代码:

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

1 个答案:

答案 0 :(得分:1)

一种简单但有效的方法是循环几个月并计算运行总量。

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;
}

由于月数总是可以控制的(即使是多年的数据),这应该没问题。