From adaa6caa783ef43c254922825ac76d1d607c84b7 Mon Sep 17 00:00:00 2001 From: Nick Hayday Date: Sat, 24 Dec 2016 18:54:36 +0000 Subject: [PATCH 1/7] Per series roll period Enables adding of rollPeriod inside series parameters. If rollPeriod is set globally, series will default to that if parameter not set --- src/dygraph.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/dygraph.js b/src/dygraph.js index e0fcb58ca..c93a9986e 100644 --- a/src/dygraph.js +++ b/src/dygraph.js @@ -2026,14 +2026,23 @@ Dygraph.prototype.predraw_ = function() { this.cascadeEvents_('predraw'); + var seriesName = this.getLabels(); + // Convert the raw data (a 2D array) into the internal format and compute // rolling averages. this.rolledSeries_ = [null]; // x-axis is the first series and it's special for (var i = 1; i < this.numColumns(); i++) { // var logScale = this.attr_('logscale', i); // TODO(klausw): this looks wrong // konigsberg thinks so too. var series = this.dataHandler_.extractSeries(this.rawData_, i, this.attributes_); - if (this.rollPeriod_ > 1) { - series = this.dataHandler_.rollingAverage(series, this.rollPeriod_, this.attributes_); + var seriesRollPeriod; + + if (this.getOption("rollPeriod", seriesName[i]) == undefined) { + seriesRollPeriod = this.rollPeriod(); + } else { + seriesRollPeriod = this.getOption("rollPeriod", seriesName[i]); + } + if (seriesRollPeriod > 1) { + series = this.dataHandler_.rollingAverage(series, seriesRollPeriod, this.attributes_); } this.rolledSeries_.push(series); From 41047fb504e80b23e787d0e9b69c3613ad503187 Mon Sep 17 00:00:00 2001 From: Nick Hayday Date: Fri, 30 Dec 2016 11:04:43 +0000 Subject: [PATCH 2/7] Added auto_test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test’s setting of per series rollPeriod in initial setup, then changing, and adding to another series. Tests series defaults to global rollPeriod if not explicitly set --- .../tests/per_series_rolling_average.js | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 auto_tests/tests/per_series_rolling_average.js diff --git a/auto_tests/tests/per_series_rolling_average.js b/auto_tests/tests/per_series_rolling_average.js new file mode 100644 index 000000000..d0fc58820 --- /dev/null +++ b/auto_tests/tests/per_series_rolling_average.js @@ -0,0 +1,127 @@ +/** + * @fileoverview Tests for per series rolling averages. + * + * @author Nick Hayday (nickhayday@mac.com) + */ + +import Dygraph from '../../src/dygraph'; + +import Util from './Util'; + +describe("per-series-rolling-average", function() { + +cleanupAfterEach(); + +it('testPerSeriesRollingAverage', function() { + var opts = { + width: 480, + height: 320, + series: { + Y: { + rollPeriod: 1 } + } + }; + var data = "X,Y,Z\n" + + "0,0,0\n" + + "1,1,10\n" + + "2,2,20\n" + + "3,3,30\n" + ; + + var graph = document.getElementById("graph"); + var g = new Dygraph(graph, data, opts); + + g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); + g.setSelection(1); assert.equal("1: Y: 1 Z: 10", Util.getLegend()); + g.setSelection(2); assert.equal("2: Y: 2 Z: 20", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 3 Z: 30", Util.getLegend()); + assert.equal(1, g.getOption("rollPeriod", "Y")); + + var seriesOpt = {}; + seriesOpt["Y"] = { rollPeriod: 2 }; + g.updateOptions ({ series: seriesOpt }); + + g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); + g.setSelection(1); assert.equal("1: Y: 0.5 Z: 10", Util.getLegend()); + g.setSelection(2); assert.equal("2: Y: 1.5 Z: 20", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 2.5 Z: 30", Util.getLegend()); + assert.equal(2, g.getOption("rollPeriod", "Y")); + + seriesOpt["Y"] = { rollPeriod: 3 }; + seriesOpt["Z"] = { rollPeriod: 2 }; + g.updateOptions ({ series: seriesOpt }); + g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); + g.setSelection(1); assert.equal("1: Y: 0.5 Z: 5", Util.getLegend()); + g.setSelection(2); assert.equal("2: Y: 1 Z: 15", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 2 Z: 25", Util.getLegend()); + assert.equal(3, g.getOption("rollPeriod", "Y")); + assert.equal(2, g.getOption("rollPeriod", "Z")); + + seriesOpt["Y"] = { rollPeriod: 1 }; + seriesOpt["Z"] = { rollPeriod: 4 }; + g.updateOptions ({ series: seriesOpt }); + g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); + g.setSelection(1); assert.equal("1: Y: 1 Z: 5", Util.getLegend()); + g.setSelection(2); assert.equal("2: Y: 2 Z: 10", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 3 Z: 15", Util.getLegend()); + assert.equal(1, g.getOption("rollPeriod", "Y")); + assert.equal(4, g.getOption("rollPeriod", "Z")); + + + + + +}); + +it('testDefaultToGlobalRollingAverage', function() { + var opts = { + width: 480, + height: 320, + rollPeriod: 2, + series: { + Y: { + rollPeriod: 1 } + } + }; + var data = "X,Y,Z\n" + + "0,0,0\n" + + "1,1,10\n" + + "2,2,20\n" + + "3,3,30\n" + ; + + var graph = document.getElementById("graph"); + var g = new Dygraph(graph, data, opts); + + g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); + g.setSelection(1); assert.equal("1: Y: 1 Z: 5", Util.getLegend()); + g.setSelection(2); assert.equal("2: Y: 2 Z: 15", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 3 Z: 25", Util.getLegend()); + assert.equal(1, g.getOption("rollPeriod", "Y")); + assert.equal(2, g.getOption("rollPeriod", "Z")); + assert.equal(2, g.rollPeriod()); + + var seriesOpt = {}; + seriesOpt["Y"] = { rollPeriod: 3 }; + g.updateOptions ({ series: seriesOpt }); + + g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); + g.setSelection(1); assert.equal("1: Y: 0.5 Z: 5", Util.getLegend()); + g.setSelection(2); assert.equal("2: Y: 1 Z: 15", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 2 Z: 25", Util.getLegend()); + assert.equal(3, g.getOption("rollPeriod", "Y")); + assert.equal(2, g.getOption("rollPeriod", "Z")); + assert.equal(2, g.rollPeriod()); + + g.updateOptions ({ rollPeriod: 3 }); + g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); + g.setSelection(1); assert.equal("1: Y: 0.5 Z: 5", Util.getLegend()); + g.setSelection(2); assert.equal("2: Y: 1 Z: 10", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 2 Z: 20", Util.getLegend()); + assert.equal(3, g.getOption("rollPeriod", "Y")); + assert.equal(3, g.getOption("rollPeriod", "Z")); + assert.equal(3, g.rollPeriod()); +}); + + +}); From 8c386f1bc20ac5297d769f4b8aa4074fd4a3df3b Mon Sep 17 00:00:00 2001 From: Nick Hayday Date: Fri, 30 Dec 2016 14:41:25 +0000 Subject: [PATCH 3/7] Adding test html example Shows two series and demonstrates independent changing of rolling average --- tests/per-series-rolling-average.html | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 tests/per-series-rolling-average.html diff --git a/tests/per-series-rolling-average.html b/tests/per-series-rolling-average.html new file mode 100644 index 000000000..60a8f0aaa --- /dev/null +++ b/tests/per-series-rolling-average.html @@ -0,0 +1,71 @@ + + + + + Per Series Rolling Average + + + + + + + +
+ + Check the boxes to apply the rolling average
+ + High (7 day rolling average)
+ Low (30 day rolling average) + + + + + + + \ No newline at end of file From 717ff0b316669a03a802e739f7b17f21c488e2b2 Mon Sep 17 00:00:00 2001 From: Nick Hayday Date: Fri, 30 Dec 2016 15:33:50 +0000 Subject: [PATCH 4/7] Style guide updates --- src/dygraph.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dygraph.js b/src/dygraph.js index c93a9986e..5814382c7 100644 --- a/src/dygraph.js +++ b/src/dygraph.js @@ -2036,10 +2036,10 @@ Dygraph.prototype.predraw_ = function() { var series = this.dataHandler_.extractSeries(this.rawData_, i, this.attributes_); var seriesRollPeriod; - if (this.getOption("rollPeriod", seriesName[i]) == undefined) { - seriesRollPeriod = this.rollPeriod(); + if (this.getOption('rollPeriod', seriesName[i])) { + seriesRollPeriod = this.getOption('rollPeriod', seriesName[i]); } else { - seriesRollPeriod = this.getOption("rollPeriod", seriesName[i]); + seriesRollPeriod = this.rollPeriod(); } if (seriesRollPeriod > 1) { series = this.dataHandler_.rollingAverage(series, seriesRollPeriod, this.attributes_); From c57720f54d663f91b2a12e2c7462b34797bb08e5 Mon Sep 17 00:00:00 2001 From: Nick Hayday Date: Fri, 30 Dec 2016 17:13:28 +0000 Subject: [PATCH 5/7] Changes Requested MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Altered last test to prove changing global rollPeriod doesn’t change a series rollPeriod --- .../tests/per_series_rolling_average.js | 56 ++++++-------- src/dygraph.js | 16 ++-- tests/per-series-rolling-average.html | 77 +++++++++---------- 3 files changed, 63 insertions(+), 86 deletions(-) diff --git a/auto_tests/tests/per_series_rolling_average.js b/auto_tests/tests/per_series_rolling_average.js index d0fc58820..57aaaf5cd 100644 --- a/auto_tests/tests/per_series_rolling_average.js +++ b/auto_tests/tests/per_series_rolling_average.js @@ -36,48 +36,41 @@ it('testPerSeriesRollingAverage', function() { g.setSelection(2); assert.equal("2: Y: 2 Z: 20", Util.getLegend()); g.setSelection(3); assert.equal("3: Y: 3 Z: 30", Util.getLegend()); assert.equal(1, g.getOption("rollPeriod", "Y")); - - var seriesOpt = {}; - seriesOpt["Y"] = { rollPeriod: 2 }; - g.updateOptions ({ series: seriesOpt }); - + g.updateOptions({ + series: { Y: { rollPeriod: 2 } } + }); g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); g.setSelection(1); assert.equal("1: Y: 0.5 Z: 10", Util.getLegend()); g.setSelection(2); assert.equal("2: Y: 1.5 Z: 20", Util.getLegend()); g.setSelection(3); assert.equal("3: Y: 2.5 Z: 30", Util.getLegend()); assert.equal(2, g.getOption("rollPeriod", "Y")); - - seriesOpt["Y"] = { rollPeriod: 3 }; - seriesOpt["Z"] = { rollPeriod: 2 }; - g.updateOptions ({ series: seriesOpt }); + g.updateOptions({ + series: { Y: { rollPeriod: 3 }, + Z: { rollPeriod: 2 } } + }); g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); g.setSelection(1); assert.equal("1: Y: 0.5 Z: 5", Util.getLegend()); g.setSelection(2); assert.equal("2: Y: 1 Z: 15", Util.getLegend()); g.setSelection(3); assert.equal("3: Y: 2 Z: 25", Util.getLegend()); assert.equal(3, g.getOption("rollPeriod", "Y")); assert.equal(2, g.getOption("rollPeriod", "Z")); - - seriesOpt["Y"] = { rollPeriod: 1 }; - seriesOpt["Z"] = { rollPeriod: 4 }; - g.updateOptions ({ series: seriesOpt }); + g.updateOptions({ + series: { Y: { rollPeriod: 1 }, + Z: { rollPeriod: 4 } } + }); g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); g.setSelection(1); assert.equal("1: Y: 1 Z: 5", Util.getLegend()); g.setSelection(2); assert.equal("2: Y: 2 Z: 10", Util.getLegend()); g.setSelection(3); assert.equal("3: Y: 3 Z: 15", Util.getLegend()); assert.equal(1, g.getOption("rollPeriod", "Y")); assert.equal(4, g.getOption("rollPeriod", "Z")); - - - - - }); it('testDefaultToGlobalRollingAverage', function() { var opts = { width: 480, height: 320, - rollPeriod: 2, + rollPeriod: 2, series: { Y: { rollPeriod: 1 } @@ -99,29 +92,26 @@ it('testDefaultToGlobalRollingAverage', function() { g.setSelection(3); assert.equal("3: Y: 3 Z: 25", Util.getLegend()); assert.equal(1, g.getOption("rollPeriod", "Y")); assert.equal(2, g.getOption("rollPeriod", "Z")); - assert.equal(2, g.rollPeriod()); - - var seriesOpt = {}; - seriesOpt["Y"] = { rollPeriod: 3 }; - g.updateOptions ({ series: seriesOpt }); - + assert.equal(2, g.getOption("rollPeriod")); + g.updateOptions({ + series: { Y: { rollPeriod: 3 } } + }); g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); g.setSelection(1); assert.equal("1: Y: 0.5 Z: 5", Util.getLegend()); g.setSelection(2); assert.equal("2: Y: 1 Z: 15", Util.getLegend()); g.setSelection(3); assert.equal("3: Y: 2 Z: 25", Util.getLegend()); assert.equal(3, g.getOption("rollPeriod", "Y")); assert.equal(2, g.getOption("rollPeriod", "Z")); - assert.equal(2, g.rollPeriod()); - - g.updateOptions ({ rollPeriod: 3 }); + assert.equal(2, g.getOption("rollPeriod")); + g.updateOptions({ + rollPeriod: 4 + }); g.setSelection(0); assert.equal("0: Y: 0 Z: 0", Util.getLegend()); g.setSelection(1); assert.equal("1: Y: 0.5 Z: 5", Util.getLegend()); g.setSelection(2); assert.equal("2: Y: 1 Z: 10", Util.getLegend()); - g.setSelection(3); assert.equal("3: Y: 2 Z: 20", Util.getLegend()); + g.setSelection(3); assert.equal("3: Y: 2 Z: 15", Util.getLegend()); assert.equal(3, g.getOption("rollPeriod", "Y")); - assert.equal(3, g.getOption("rollPeriod", "Z")); - assert.equal(3, g.rollPeriod()); + assert.equal(4, g.getOption("rollPeriod", "Z")); + assert.equal(4, g.getOption("rollPeriod")); }); - - }); diff --git a/src/dygraph.js b/src/dygraph.js index 5814382c7..fcdb47db3 100644 --- a/src/dygraph.js +++ b/src/dygraph.js @@ -2026,23 +2026,17 @@ Dygraph.prototype.predraw_ = function() { this.cascadeEvents_('predraw'); - var seriesName = this.getLabels(); - + // Convert the raw data (a 2D array) into the internal format and compute // rolling averages. + var seriesName = this.getLabels(); this.rolledSeries_ = [null]; // x-axis is the first series and it's special for (var i = 1; i < this.numColumns(); i++) { // var logScale = this.attr_('logscale', i); // TODO(klausw): this looks wrong // konigsberg thinks so too. var series = this.dataHandler_.extractSeries(this.rawData_, i, this.attributes_); - var seriesRollPeriod; - - if (this.getOption('rollPeriod', seriesName[i])) { - seriesRollPeriod = this.getOption('rollPeriod', seriesName[i]); - } else { - seriesRollPeriod = this.rollPeriod(); - } - if (seriesRollPeriod > 1) { - series = this.dataHandler_.rollingAverage(series, seriesRollPeriod, this.attributes_); + const rollPeriod = this.getOption('rollPeriod', seriesName[i]); + if (rollPeriod > 1) { + series = this.dataHandler_.rollingAverage(series, rollPeriod, this.attributes_); } this.rolledSeries_.push(series); diff --git a/tests/per-series-rolling-average.html b/tests/per-series-rolling-average.html index 60a8f0aaa..1db466118 100644 --- a/tests/per-series-rolling-average.html +++ b/tests/per-series-rolling-average.html @@ -19,52 +19,45 @@ -
+
+ + Check the boxes to apply the rolling average
- Check the boxes to apply the rolling average
- - High (7 day rolling average)
- Low (30 day rolling average) - - - + $("#low").change(function () { + if(this.checked) { + updateRollPeriod("Low", 30); + } else { + updateRollPeriod("Low", 1); + } + }); + + From ab6575d2410e4aec75a060570152edd2820107a2 Mon Sep 17 00:00:00 2001 From: Nick Hayday Date: Sat, 31 Dec 2016 11:22:11 +0000 Subject: [PATCH 6/7] removed a few tabs --- tests/per-series-rolling-average.html | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/tests/per-series-rolling-average.html b/tests/per-series-rolling-average.html index 1db466118..3709449af 100644 --- a/tests/per-series-rolling-average.html +++ b/tests/per-series-rolling-average.html @@ -3,7 +3,7 @@ Per Series Rolling Average - + - +
- + Check the boxes to apply the rolling average
- + High (7 day rolling average)
Low (30 day rolling average) - + - - - - \ No newline at end of file + \ No newline at end of file From 28c3e15d083fe263f0c109b1af420f9a136b3625 Mon Sep 17 00:00:00 2001 From: Nick Hayday Date: Sat, 7 Jan 2017 16:48:58 +0000 Subject: [PATCH 7/7] var not const --- src/dygraph.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dygraph.js b/src/dygraph.js index fcdb47db3..20d14e7d9 100644 --- a/src/dygraph.js +++ b/src/dygraph.js @@ -2034,7 +2034,7 @@ Dygraph.prototype.predraw_ = function() { for (var i = 1; i < this.numColumns(); i++) { // var logScale = this.attr_('logscale', i); // TODO(klausw): this looks wrong // konigsberg thinks so too. var series = this.dataHandler_.extractSeries(this.rawData_, i, this.attributes_); - const rollPeriod = this.getOption('rollPeriod', seriesName[i]); + var rollPeriod = this.getOption('rollPeriod', seriesName[i]); if (rollPeriod > 1) { series = this.dataHandler_.rollingAverage(series, rollPeriod, this.attributes_); }