我开始使用银行帐户交易清单中的数据来学习 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
答案 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;
}
由于月数总是可以控制的(即使是多年的数据),这应该没问题。