Thanos
Thanos

Reputation: 142

Cumulative sum in series chart with dc.js

I have the following data:

Store   year    earnings
A   2011    1000
A   2012    2000
A   2013    2000
A   2014    3000
B   2012    200
B   2012    300
B   2012    500
B   2014    3000
B   2015    4000
C   2013    2000
C   2013    200
C   2015    1200
C   2016    4000

What I would like to do is to use dc.js to get cumulative sum per store and per year and display it in a series chart.

The cumulative sum per store per year would be

Store   year    earnings
    A   2011    1000
    A   2012    3000
    A   2013    5000
    A   2014    8000
    B   2012    1000
    B   2014    4000
    B   2015    8000
    C   2013    2200
    C   2015    3400
    C   2016    7400

I have searched around and saw that this can be done for a simple dimension and group like so:

function createCumulativeGroup(source_group) {
        return {
            all:function () {
                var cumulate = 0;
                return source_group.all().map(function(d) {
                    cumulate += d.value;

                    return {key:d.key, value:cumulate};
                });
            }
        };
    }

But in order to use a series chart, I need to reduce by both year and store, putting both into a composite key. And when I try to use the above function with a series chart, the accumulation happens across all stores, resulting in much larger values than expected.

How can I do a cumulative sum that works with a series chart?

Upvotes: 1

Views: 2261

Answers (1)

Ethan Jewett
Ethan Jewett

Reputation: 6010

Your createCumulativeGroup function just accumulates all values across stores. You need to make it accumulate values by store. This should work:

function createCumulativeGroup(source_group) {
        return {
            all:function () {
                var cumulate = {};
                return source_group.all().map(function(d) {
                  if(cumulate[d.key[0]]) {
                    cumulate[d.key[0]] += d.value;
                  } else {
                    cumulate[d.key[0]] = d.value;
                  }
                  return {key:d.key, value:cumulate[d.key[0]]};
                });
            }
        };
    }

https://jsfiddle.net/rn3ja9n4/

Upvotes: 2

Related Questions