linear_regression_trend 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6f66c104996dc4de6d322598425e2ebae36a259
4
- data.tar.gz: e372a4aba151e466c685853937cfc4481fb96200
3
+ metadata.gz: 0886ac85ef56b725b1deaa5d4ca3331d4a981ee8
4
+ data.tar.gz: f3e224e216a4cc89524c2fd27b44a28e139f9b8e
5
5
  SHA512:
6
- metadata.gz: 539a5ec67621b54faf7a6d1d3314767bad97486d65dada3c1d553d3c8f60b6960bdddb97468538029a82eb53989f417e6232792cc0f019e3eb5996386752595e
7
- data.tar.gz: d7a9b444778badb73061e864d6190e9ad98b149266aa612953609af879920f97451bbde63063299b8fb2c54e9b7bce28c4f47977ee56cc165255cb9775b855f7
6
+ metadata.gz: 733341279c21804fc37579789fd52f56bcf69d606e6dc2f117321f6dff3eb5673f3a500a0578c325388e700ad9a96ac59095685576e6e24ab66bef66a44512e9
7
+ data.tar.gz: 4ecc8929a43d05fa0c67e46ce45d1ce2ee2690e7ffdf0d9a75e098e80ed5136caa67b108da641ca4b7fbdfabd4e9653d49291ae2bf300ffeb2feeac093c49707
data/.codeclimate.yml ADDED
@@ -0,0 +1,8 @@
1
+ # Save as .codeclimate.yml (note leading .) in project root directory
2
+ languages:
3
+ Ruby: true
4
+ #JavaScript: true
5
+ #PHP: true
6
+ #Python: true
7
+ # exclude_paths:
8
+ # - "foo/bar.rb"
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ .ipynb_checkpoints
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Linear Regression Trend Calculator [![Build Status](https://travis-ci.org/zero-one-software/linear_regression_trend.svg)](https://travis-ci.org/zero-one-software/linear_regression_trend)
1
+ # Linear Regression Trend Calculator [![Build Status](https://travis-ci.org/zero-one-software/linear_regression_trend.svg)](https://travis-ci.org/zero-one-software/linear_regression_trend) [![Code Climate](https://codeclimate.com/github/zero-one-software/linear_regression_trend/badges/gpa.svg)](https://codeclimate.com/github/zero-one-software/linear_regression_trend)
2
2
 
3
3
  This is a simple gem to help calculate linear regression trendlines for a given list of samples.
4
4
 
@@ -22,7 +22,7 @@ Or install it yourself as:
22
22
 
23
23
  $ gem install linear_regression_trend
24
24
 
25
- ## Usage
25
+ ## Usage: Standard usage
26
26
 
27
27
  ```ruby
28
28
  my_array_of_samples = [10, 14, 18, 22, 26]
@@ -33,9 +33,22 @@ trend_slope = trender.slope # => 4
33
33
  trend_intercept = trender.intercept # => 6
34
34
  ```
35
35
 
36
- ## Development
36
+ ## Usage: non-negative trending
37
37
 
38
- Check out the tests in the /spec dir, and also install iRuby notebook, and take a look at the live documentation in /doc.
38
+ Sometimes you want a trend, and that trend happens to be a descending one. Normally this is fine. However there are instances where that trend calculation can go into the negative. Again, sometimes this is fine, but sometimes this doesnt make sense, e.g. packet loss, or latency on a network can never be less than zero (would be cool though). In cases like this, you'd wanna tell the library to stop trending past zero. Observe:
39
+
40
+ ```ruby
41
+ my_array_of_samples = [1,2,3,0,10,18,18,18,1,1,1,1,0.5,0.5,0.5,0.5,05,0.25,0.25,0.1,0.1,0,0,0,0]
42
+ trender = LinearRegressionTrend::Calculator.new(my_array_of_samples, non_negative: true)
43
+
44
+ trended_samples = trender.trend # => [array of trend points]
45
+ trend_slope = trender.slope # => a negative number, indicating a descending trend
46
+ trended_samples.last == 0 # => true, would've be -0.8927 otherwise
47
+ ```
48
+
49
+ ## Development and extra documentation
50
+
51
+ Check out the tests in the /spec dir, and also install iRuby notebook, and **take a look at the live documentation in /doc.**
39
52
 
40
53
  ## Contributing
41
54
 
@@ -11,18 +11,60 @@
11
11
  },
12
12
  {
13
13
  "cell_type": "code",
14
- "execution_count": 29,
14
+ "execution_count": 1,
15
15
  "metadata": {
16
16
  "collapsed": false
17
17
  },
18
18
  "outputs": [
19
+ {
20
+ "data": {
21
+ "application/javascript": [
22
+ "if(window['d3'] === undefined ||\n",
23
+ " window['Nyaplot'] === undefined){\n",
24
+ " var path = {\"d3\":\"http://d3js.org/d3.v3.min\",\"downloadable\":\"http://cdn.rawgit.com/domitry/d3-downloadable/master/d3-downloadable\"};\n",
25
+ "\n",
26
+ "\n",
27
+ "\n",
28
+ " var shim = {\"d3\":{\"exports\":\"d3\"},\"downloadable\":{\"exports\":\"downloadable\"}};\n",
29
+ "\n",
30
+ " require.config({paths: path, shim:shim});\n",
31
+ "\n",
32
+ "\n",
33
+ "require(['d3'], function(d3){window['d3']=d3;console.log('finished loading d3');require(['downloadable'], function(downloadable){window['downloadable']=downloadable;console.log('finished loading downloadable');\n",
34
+ "\n",
35
+ "\tvar script = d3.select(\"head\")\n",
36
+ "\t .append(\"script\")\n",
37
+ "\t .attr(\"src\", \"http://cdn.rawgit.com/domitry/Nyaplotjs/master/release/nyaplot.js\")\n",
38
+ "\t .attr(\"async\", true);\n",
39
+ "\n",
40
+ "\tscript[0][0].onload = script[0][0].onreadystatechange = function(){\n",
41
+ "\n",
42
+ "\n",
43
+ "\t var event = document.createEvent(\"HTMLEvents\");\n",
44
+ "\t event.initEvent(\"load_nyaplot\",false,false);\n",
45
+ "\t window.dispatchEvent(event);\n",
46
+ "\t console.log('Finished loading Nyaplotjs');\n",
47
+ "\n",
48
+ "\t};\n",
49
+ "\n",
50
+ "\n",
51
+ "});});\n",
52
+ "}\n"
53
+ ],
54
+ "text/plain": [
55
+ "\"if(window['d3'] === undefined ||\\n window['Nyaplot'] === undefined){\\n var path = {\\\"d3\\\":\\\"http://d3js.org/d3.v3.min\\\",\\\"downloadable\\\":\\\"http://cdn.rawgit.com/domitry/d3-downloadable/master/d3-downloadable\\\"};\\n\\n\\n\\n var shim = {\\\"d3\\\":{\\\"exports\\\":\\\"d3\\\"},\\\"downloadable\\\":{\\\"exports\\\":\\\"downloadable\\\"}};\\n\\n require.config({paths: path, shim:shim});\\n\\n\\nrequire(['d3'], function(d3){window['d3']=d3;console.log('finished loading d3');require(['downloadable'], function(downloadable){window['downloadable']=downloadable;console.log('finished loading downloadable');\\n\\n\\tvar script = d3.select(\\\"head\\\")\\n\\t .append(\\\"script\\\")\\n\\t .attr(\\\"src\\\", \\\"http://cdn.rawgit.com/domitry/Nyaplotjs/master/release/nyaplot.js\\\")\\n\\t .attr(\\\"async\\\", true);\\n\\n\\tscript[0][0].onload = script[0][0].onreadystatechange = function(){\\n\\n\\n\\t var event = document.createEvent(\\\"HTMLEvents\\\");\\n\\t event.initEvent(\\\"load_nyaplot\\\",false,false);\\n\\t window.dispatchEvent(event);\\n\\t console.log('Finished loading Nyaplotjs');\\n\\n\\t};\\n\\n\\n});});\\n}\\n\""
56
+ ]
57
+ },
58
+ "metadata": {},
59
+ "output_type": "display_data"
60
+ },
19
61
  {
20
62
  "data": {
21
63
  "text/plain": [
22
- "false"
64
+ "true"
23
65
  ]
24
66
  },
25
- "execution_count": 29,
67
+ "execution_count": 1,
26
68
  "metadata": {},
27
69
  "output_type": "execute_result"
28
70
  }
@@ -56,7 +98,7 @@
56
98
  },
57
99
  {
58
100
  "cell_type": "code",
59
- "execution_count": 30,
101
+ "execution_count": 2,
60
102
  "metadata": {
61
103
  "collapsed": false,
62
104
  "scrolled": true
@@ -93,7 +135,7 @@
93
135
  },
94
136
  {
95
137
  "cell_type": "code",
96
- "execution_count": 31,
138
+ "execution_count": 3,
97
139
  "metadata": {
98
140
  "collapsed": false,
99
141
  "scrolled": true
@@ -102,12 +144,12 @@
102
144
  {
103
145
  "data": {
104
146
  "text/html": [
105
- "<div id='vis-ad2457ed-3897-43b1-9419-3b479887e90f'></div>\n",
147
+ "<div id='vis-15c391e9-f571-411f-83c9-8da90be28ce1'></div>\n",
106
148
  "<script>\n",
107
149
  "(function(){\n",
108
150
  " var render = function(){\n",
109
- " var model = {\"panes\":[{\"diagrams\":[{\"type\":\"bar\",\"options\":{\"x\":\"data0\",\"y\":\"data1\"},\"data\":\"edffbbde-4dfd-4ec1-9632-fb0b34ab51ed\"}],\"options\":{\"width\":700,\"xrange\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\"],\"yrange\":[0,18]}}],\"data\":{\"edffbbde-4dfd-4ec1-9632-fb0b34ab51ed\":[{\"data0\":\"1\",\"data1\":1},{\"data0\":\"2\",\"data1\":2},{\"data0\":\"3\",\"data1\":3},{\"data0\":\"4\",\"data1\":6},{\"data0\":\"5\",\"data1\":10},{\"data0\":\"6\",\"data1\":11},{\"data0\":\"7\",\"data1\":12},{\"data0\":\"8\",\"data1\":12},{\"data0\":\"9\",\"data1\":12},{\"data0\":\"10\",\"data1\":12},{\"data0\":\"11\",\"data1\":15},{\"data0\":\"12\",\"data1\":18},{\"data0\":\"13\",\"data1\":18},{\"data0\":\"14\",\"data1\":16},{\"data0\":\"15\",\"data1\":16},{\"data0\":\"16\",\"data1\":15},{\"data0\":\"17\",\"data1\":14},{\"data0\":\"18\",\"data1\":11},{\"data0\":\"19\",\"data1\":9},{\"data0\":\"20\",\"data1\":9},{\"data0\":\"21\",\"data1\":7},{\"data0\":\"22\",\"data1\":4},{\"data0\":\"23\",\"data1\":2},{\"data0\":\"24\",\"data1\":1},{\"data0\":\"25\",\"data1\":1}]},\"extension\":[]}\n",
110
- " var id_name = '#vis-ad2457ed-3897-43b1-9419-3b479887e90f';\n",
151
+ " var model = {\"panes\":[{\"diagrams\":[{\"type\":\"bar\",\"options\":{\"x\":\"data0\",\"y\":\"data1\"},\"data\":\"f4ab127e-0b11-41e9-9e1f-7ef326bd0021\"}],\"options\":{\"width\":700,\"xrange\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\"],\"yrange\":[0,18]}}],\"data\":{\"f4ab127e-0b11-41e9-9e1f-7ef326bd0021\":[{\"data0\":\"1\",\"data1\":1},{\"data0\":\"2\",\"data1\":2},{\"data0\":\"3\",\"data1\":3},{\"data0\":\"4\",\"data1\":6},{\"data0\":\"5\",\"data1\":10},{\"data0\":\"6\",\"data1\":11},{\"data0\":\"7\",\"data1\":12},{\"data0\":\"8\",\"data1\":12},{\"data0\":\"9\",\"data1\":12},{\"data0\":\"10\",\"data1\":12},{\"data0\":\"11\",\"data1\":15},{\"data0\":\"12\",\"data1\":18},{\"data0\":\"13\",\"data1\":18},{\"data0\":\"14\",\"data1\":16},{\"data0\":\"15\",\"data1\":16},{\"data0\":\"16\",\"data1\":15},{\"data0\":\"17\",\"data1\":14},{\"data0\":\"18\",\"data1\":11},{\"data0\":\"19\",\"data1\":9},{\"data0\":\"20\",\"data1\":9},{\"data0\":\"21\",\"data1\":7},{\"data0\":\"22\",\"data1\":4},{\"data0\":\"23\",\"data1\":2},{\"data0\":\"24\",\"data1\":1},{\"data0\":\"25\",\"data1\":1}]},\"extension\":[]}\n",
152
+ " var id_name = '#vis-15c391e9-f571-411f-83c9-8da90be28ce1';\n",
111
153
  " Nyaplot.core.parse(model, id_name);\n",
112
154
  "\n",
113
155
  " require(['downloadable'], function(downloadable){\n",
@@ -126,7 +168,7 @@
126
168
  "</script>\n"
127
169
  ],
128
170
  "text/plain": [
129
- "#<Nyaplot::Frame:0x007fd5a1c5e030 @properties={:panes=>[#<Nyaplot::Plot:0x007fd5a1c6f600 @properties={:diagrams=>[#<Nyaplot::Diagram:0x007fd5a1c5f7f0 @properties={:type=>:bar, :options=>{:x=>\"data0\", :y=>\"data1\"}, :data=>\"edffbbde-4dfd-4ec1-9632-fb0b34ab51ed\"}, @xrange=[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], @yrange=[0, 18]>], :options=>{:width=>700, :xrange=>[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], :yrange=>[0, 18]}}>], :data=>{\"edffbbde-4dfd-4ec1-9632-fb0b34ab51ed\"=>#<Nyaplot::DataFrame:0x007fd5a1c6e548 @name=\"edffbbde-4dfd-4ec1-9632-fb0b34ab51ed\", @rows=[{:data0=>\"1\", :data1=>1}, {:data0=>\"2\", :data1=>2}, {:data0=>\"3\", :data1=>3}, {:data0=>\"4\", :data1=>6}, {:data0=>\"5\", :data1=>10}, {:data0=>\"6\", :data1=>11}, {:data0=>\"7\", :data1=>12}, {:data0=>\"8\", :data1=>12}, {:data0=>\"9\", :data1=>12}, {:data0=>\"10\", :data1=>12}, {:data0=>\"11\", :data1=>15}, {:data0=>\"12\", :data1=>18}, {:data0=>\"13\", :data1=>18}, {:data0=>\"14\", :data1=>16}, {:data0=>\"15\", :data1=>16}, {:data0=>\"16\", :data1=>15}, {:data0=>\"17\", :data1=>14}, {:data0=>\"18\", :data1=>11}, {:data0=>\"19\", :data1=>9}, {:data0=>\"20\", :data1=>9}, {:data0=>\"21\", :data1=>7}, {:data0=>\"22\", :data1=>4}, {:data0=>\"23\", :data1=>2}, {:data0=>\"24\", :data1=>1}, {:data0=>\"25\", :data1=>1}]>}, :extension=>[]}>"
171
+ "#<Nyaplot::Frame:0x007ff6544286f8 @properties={:panes=>[#<Nyaplot::Plot:0x007ff65442aca0 @properties={:diagrams=>[#<Nyaplot::Diagram:0x007ff654428ba8 @properties={:type=>:bar, :options=>{:x=>\"data0\", :y=>\"data1\"}, :data=>\"f4ab127e-0b11-41e9-9e1f-7ef326bd0021\"}, @xrange=[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], @yrange=[0, 18]>], :options=>{:width=>700, :xrange=>[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], :yrange=>[0, 18]}}>], :data=>{\"f4ab127e-0b11-41e9-9e1f-7ef326bd0021\"=>#<Nyaplot::DataFrame:0x007ff65442a778 @name=\"f4ab127e-0b11-41e9-9e1f-7ef326bd0021\", @rows=[{:data0=>\"1\", :data1=>1}, {:data0=>\"2\", :data1=>2}, {:data0=>\"3\", :data1=>3}, {:data0=>\"4\", :data1=>6}, {:data0=>\"5\", :data1=>10}, {:data0=>\"6\", :data1=>11}, {:data0=>\"7\", :data1=>12}, {:data0=>\"8\", :data1=>12}, {:data0=>\"9\", :data1=>12}, {:data0=>\"10\", :data1=>12}, {:data0=>\"11\", :data1=>15}, {:data0=>\"12\", :data1=>18}, {:data0=>\"13\", :data1=>18}, {:data0=>\"14\", :data1=>16}, {:data0=>\"15\", :data1=>16}, {:data0=>\"16\", :data1=>15}, {:data0=>\"17\", :data1=>14}, {:data0=>\"18\", :data1=>11}, {:data0=>\"19\", :data1=>9}, {:data0=>\"20\", :data1=>9}, {:data0=>\"21\", :data1=>7}, {:data0=>\"22\", :data1=>4}, {:data0=>\"23\", :data1=>2}, {:data0=>\"24\", :data1=>1}, {:data0=>\"25\", :data1=>1}]>}, :extension=>[]}>"
130
172
  ]
131
173
  },
132
174
  "metadata": {},
@@ -148,7 +190,62 @@
148
190
  },
149
191
  {
150
192
  "cell_type": "code",
151
- "execution_count": 32,
193
+ "execution_count": 4,
194
+ "metadata": {
195
+ "collapsed": false,
196
+ "scrolled": true
197
+ },
198
+ "outputs": [
199
+ {
200
+ "data": {
201
+ "text/html": [
202
+ "<div id='vis-77606c3f-45ec-4d9d-83f4-d387935bb1a5'></div>\n",
203
+ "<script>\n",
204
+ "(function(){\n",
205
+ " var render = function(){\n",
206
+ " var model = {\"panes\":[{\"diagrams\":[{\"type\":\"bar\",\"options\":{\"x\":\"data0\",\"y\":\"data1\"},\"data\":\"ea7a4bcf-0823-4c0b-b7af-e05a762e8b60\"}],\"options\":{\"width\":700,\"xrange\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\"],\"yrange\":[0,10.246153846153847]}}],\"data\":{\"ea7a4bcf-0823-4c0b-b7af-e05a762e8b60\":[{\"data0\":\"1\",\"data1\":10.246153846153847},{\"data0\":\"2\",\"data1\":10.182307692307694},{\"data0\":\"3\",\"data1\":10.118461538461538},{\"data0\":\"4\",\"data1\":10.054615384615385},{\"data0\":\"5\",\"data1\":9.990769230769232},{\"data0\":\"6\",\"data1\":9.926923076923078},{\"data0\":\"7\",\"data1\":9.863076923076923},{\"data0\":\"8\",\"data1\":9.79923076923077},{\"data0\":\"9\",\"data1\":9.735384615384616},{\"data0\":\"10\",\"data1\":9.671538461538463},{\"data0\":\"11\",\"data1\":9.607692307692307},{\"data0\":\"12\",\"data1\":9.543846153846154},{\"data0\":\"13\",\"data1\":9.48},{\"data0\":\"14\",\"data1\":9.416153846153847},{\"data0\":\"15\",\"data1\":9.352307692307694},{\"data0\":\"16\",\"data1\":9.288461538461538},{\"data0\":\"17\",\"data1\":9.224615384615385},{\"data0\":\"18\",\"data1\":9.160769230769231},{\"data0\":\"19\",\"data1\":9.096923076923078},{\"data0\":\"20\",\"data1\":9.033076923076923},{\"data0\":\"21\",\"data1\":8.96923076923077},{\"data0\":\"22\",\"data1\":8.905384615384616},{\"data0\":\"23\",\"data1\":8.841538461538462},{\"data0\":\"24\",\"data1\":8.777692307692309},{\"data0\":\"25\",\"data1\":8.713846153846154}]},\"extension\":[]}\n",
207
+ " var id_name = '#vis-77606c3f-45ec-4d9d-83f4-d387935bb1a5';\n",
208
+ " Nyaplot.core.parse(model, id_name);\n",
209
+ "\n",
210
+ " require(['downloadable'], function(downloadable){\n",
211
+ " var svg = d3.select(id_name).select(\"svg\");\n",
212
+ "\t if(!svg.empty())\n",
213
+ "\t svg.call(downloadable().filename('fig'));\n",
214
+ "\t});\n",
215
+ " };\n",
216
+ " if(window['Nyaplot']==undefined){\n",
217
+ " window.addEventListener('load_nyaplot', render, false);\n",
218
+ "\treturn;\n",
219
+ " } else {\n",
220
+ " render();\n",
221
+ " }\n",
222
+ "})();\n",
223
+ "</script>\n"
224
+ ],
225
+ "text/plain": [
226
+ "#<Nyaplot::Frame:0x007ff653a55c48 @properties={:panes=>[#<Nyaplot::Plot:0x007ff652928790 @properties={:diagrams=>[#<Nyaplot::Diagram:0x007ff653a56080 @properties={:type=>:bar, :options=>{:x=>\"data0\", :y=>\"data1\"}, :data=>\"ea7a4bcf-0823-4c0b-b7af-e05a762e8b60\"}, @xrange=[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], @yrange=[0, 10.246153846153847]>], :options=>{:width=>700, :xrange=>[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], :yrange=>[0, 10.246153846153847]}}>], :data=>{\"ea7a4bcf-0823-4c0b-b7af-e05a762e8b60\"=>#<Nyaplot::DataFrame:0x007ff653a57bb0 @name=\"ea7a4bcf-0823-4c0b-b7af-e05a762e8b60\", @rows=[{:data0=>\"1\", :data1=>10.246153846153847}, {:data0=>\"2\", :data1=>10.182307692307694}, {:data0=>\"3\", :data1=>10.118461538461538}, {:data0=>\"4\", :data1=>10.054615384615385}, {:data0=>\"5\", :data1=>9.990769230769232}, {:data0=>\"6\", :data1=>9.926923076923078}, {:data0=>\"7\", :data1=>9.863076923076923}, {:data0=>\"8\", :data1=>9.79923076923077}, {:data0=>\"9\", :data1=>9.735384615384616}, {:data0=>\"10\", :data1=>9.671538461538463}, {:data0=>\"11\", :data1=>9.607692307692307}, {:data0=>\"12\", :data1=>9.543846153846154}, {:data0=>\"13\", :data1=>9.48}, {:data0=>\"14\", :data1=>9.416153846153847}, {:data0=>\"15\", :data1=>9.352307692307694}, {:data0=>\"16\", :data1=>9.288461538461538}, {:data0=>\"17\", :data1=>9.224615384615385}, {:data0=>\"18\", :data1=>9.160769230769231}, {:data0=>\"19\", :data1=>9.096923076923078}, {:data0=>\"20\", :data1=>9.033076923076923}, {:data0=>\"21\", :data1=>8.96923076923077}, {:data0=>\"22\", :data1=>8.905384615384616}, {:data0=>\"23\", :data1=>8.841538461538462}, {:data0=>\"24\", :data1=>8.777692307692309}, {:data0=>\"25\", :data1=>8.713846153846154}]>}, :extension=>[]}>"
227
+ ]
228
+ },
229
+ "metadata": {},
230
+ "output_type": "display_data"
231
+ }
232
+ ],
233
+ "source": [
234
+ "chart = Nyaplot::Plot.new \n",
235
+ "chart.add(:bar, x, t.trend)\n",
236
+ "chart.show"
237
+ ]
238
+ },
239
+ {
240
+ "cell_type": "markdown",
241
+ "metadata": {},
242
+ "source": [
243
+ "# Non-negative descending trends"
244
+ ]
245
+ },
246
+ {
247
+ "cell_type": "code",
248
+ "execution_count": 13,
152
249
  "metadata": {
153
250
  "collapsed": false
154
251
  },
@@ -156,12 +253,41 @@
156
253
  {
157
254
  "data": {
158
255
  "text/html": [
159
- "<div id='vis-c1b75112-253e-4559-942a-d373c3195b44'></div>\n",
256
+ "<table><tr><td>Slope</td><td>Intercept</td><td>Conclusion</td></tr><tr><td>-0.3467307692307691</td><td>7.775499999999997</td><td>0</td></tr></table>"
257
+ ],
258
+ "text/plain": [
259
+ "\"<table><tr><td>Slope</td><td>Intercept</td><td>Conclusion</td></tr><tr><td>-0.3467307692307691</td><td>7.775499999999997</td><td>0</td></tr></table>\""
260
+ ]
261
+ },
262
+ "metadata": {},
263
+ "output_type": "display_data"
264
+ }
265
+ ],
266
+ "source": [
267
+ "y = [1,2,3,0,10,18,18,18,1,1,1,1,0.5,0.5,0.5,0.5,05,0.25,0.25,0.1,0.1,0,0,0,0]\n",
268
+ "x = (1..y.size).to_a.map { |n| n.to_s }\n",
269
+ "\n",
270
+ "t = LinearRegressionTrend::Calculator.new(y, non_negative: true)\n",
271
+ "\n",
272
+ "IRuby.display IRuby.table([['Slope', 'Intercept', 'Conclusion'], [t.slope, t.intercept, t.trend.last]])"
273
+ ]
274
+ },
275
+ {
276
+ "cell_type": "code",
277
+ "execution_count": 12,
278
+ "metadata": {
279
+ "collapsed": false
280
+ },
281
+ "outputs": [
282
+ {
283
+ "data": {
284
+ "text/html": [
285
+ "<div id='vis-e93ae034-724e-40dd-89ff-8e9e06f30d71'></div>\n",
160
286
  "<script>\n",
161
287
  "(function(){\n",
162
288
  " var render = function(){\n",
163
- " var model = {\"panes\":[{\"diagrams\":[{\"type\":\"bar\",\"options\":{\"x\":\"data0\",\"y\":\"data1\"},\"data\":\"f941170d-a90d-443e-917d-24e50bb8a8c3\"}],\"options\":{\"width\":700,\"xrange\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\"],\"yrange\":[0,10.246153846153847]}}],\"data\":{\"f941170d-a90d-443e-917d-24e50bb8a8c3\":[{\"data0\":\"1\",\"data1\":10.246153846153847},{\"data0\":\"2\",\"data1\":10.182307692307694},{\"data0\":\"3\",\"data1\":10.118461538461538},{\"data0\":\"4\",\"data1\":10.054615384615385},{\"data0\":\"5\",\"data1\":9.990769230769232},{\"data0\":\"6\",\"data1\":9.926923076923078},{\"data0\":\"7\",\"data1\":9.863076923076923},{\"data0\":\"8\",\"data1\":9.79923076923077},{\"data0\":\"9\",\"data1\":9.735384615384616},{\"data0\":\"10\",\"data1\":9.671538461538463},{\"data0\":\"11\",\"data1\":9.607692307692307},{\"data0\":\"12\",\"data1\":9.543846153846154},{\"data0\":\"13\",\"data1\":9.48},{\"data0\":\"14\",\"data1\":9.416153846153847},{\"data0\":\"15\",\"data1\":9.352307692307694},{\"data0\":\"16\",\"data1\":9.288461538461538},{\"data0\":\"17\",\"data1\":9.224615384615385},{\"data0\":\"18\",\"data1\":9.160769230769231},{\"data0\":\"19\",\"data1\":9.096923076923078},{\"data0\":\"20\",\"data1\":9.033076923076923},{\"data0\":\"21\",\"data1\":8.96923076923077},{\"data0\":\"22\",\"data1\":8.905384615384616},{\"data0\":\"23\",\"data1\":8.841538461538462},{\"data0\":\"24\",\"data1\":8.777692307692309},{\"data0\":\"25\",\"data1\":8.713846153846154}]},\"extension\":[]}\n",
164
- " var id_name = '#vis-c1b75112-253e-4559-942a-d373c3195b44';\n",
289
+ " var model = {\"panes\":[{\"diagrams\":[{\"type\":\"bar\",\"options\":{\"x\":\"data0\",\"y\":\"data1\"},\"data\":\"759c4fe1-01be-4c0f-bf93-49ab6d168710\"}],\"options\":{\"width\":700,\"xrange\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\"],\"yrange\":[-0.8927692307692308,7.428769230769229]}}],\"data\":{\"759c4fe1-01be-4c0f-bf93-49ab6d168710\":[{\"data0\":\"1\",\"data1\":7.428769230769229},{\"data0\":\"2\",\"data1\":7.082038461538459},{\"data0\":\"3\",\"data1\":6.73530769230769},{\"data0\":\"4\",\"data1\":6.388576923076921},{\"data0\":\"5\",\"data1\":6.041846153846151},{\"data0\":\"6\",\"data1\":5.695115384615383},{\"data0\":\"7\",\"data1\":5.348384615384614},{\"data0\":\"8\",\"data1\":5.001653846153845},{\"data0\":\"9\",\"data1\":4.654923076923075},{\"data0\":\"10\",\"data1\":4.308192307692306},{\"data0\":\"11\",\"data1\":3.961461538461537},{\"data0\":\"12\",\"data1\":3.6147307692307677},{\"data0\":\"13\",\"data1\":3.267999999999999},{\"data0\":\"14\",\"data1\":2.92126923076923},{\"data0\":\"15\",\"data1\":2.5745384615384603},{\"data0\":\"16\",\"data1\":2.2278076923076915},{\"data0\":\"17\",\"data1\":1.8810769230769226},{\"data0\":\"18\",\"data1\":1.534346153846153},{\"data0\":\"19\",\"data1\":1.187615384615384},{\"data0\":\"20\",\"data1\":0.8408846153846152},{\"data0\":\"21\",\"data1\":0.4941538461538455},{\"data0\":\"22\",\"data1\":0.14742307692307666},{\"data0\":\"23\",\"data1\":-0.19930769230769219},{\"data0\":\"24\",\"data1\":-0.5460384615384619},{\"data0\":\"25\",\"data1\":-0.8927692307692308}]},\"extension\":[]}\n",
290
+ " var id_name = '#vis-e93ae034-724e-40dd-89ff-8e9e06f30d71';\n",
165
291
  " Nyaplot.core.parse(model, id_name);\n",
166
292
  "\n",
167
293
  " require(['downloadable'], function(downloadable){\n",
@@ -180,7 +306,7 @@
180
306
  "</script>\n"
181
307
  ],
182
308
  "text/plain": [
183
- "#<Nyaplot::Frame:0x007fd5a1b251c8 @properties={:panes=>[#<Nyaplot::Plot:0x007fd5a1b2c8d8 @properties={:diagrams=>[#<Nyaplot::Diagram:0x007fd5a1b25a10 @properties={:type=>:bar, :options=>{:x=>\"data0\", :y=>\"data1\"}, :data=>\"f941170d-a90d-443e-917d-24e50bb8a8c3\"}, @xrange=[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], @yrange=[0, 10.246153846153847]>], :options=>{:width=>700, :xrange=>[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], :yrange=>[0, 10.246153846153847]}}>], :data=>{\"f941170d-a90d-443e-917d-24e50bb8a8c3\"=>#<Nyaplot::DataFrame:0x007fd5a1b2c220 @name=\"f941170d-a90d-443e-917d-24e50bb8a8c3\", @rows=[{:data0=>\"1\", :data1=>10.246153846153847}, {:data0=>\"2\", :data1=>10.182307692307694}, {:data0=>\"3\", :data1=>10.118461538461538}, {:data0=>\"4\", :data1=>10.054615384615385}, {:data0=>\"5\", :data1=>9.990769230769232}, {:data0=>\"6\", :data1=>9.926923076923078}, {:data0=>\"7\", :data1=>9.863076923076923}, {:data0=>\"8\", :data1=>9.79923076923077}, {:data0=>\"9\", :data1=>9.735384615384616}, {:data0=>\"10\", :data1=>9.671538461538463}, {:data0=>\"11\", :data1=>9.607692307692307}, {:data0=>\"12\", :data1=>9.543846153846154}, {:data0=>\"13\", :data1=>9.48}, {:data0=>\"14\", :data1=>9.416153846153847}, {:data0=>\"15\", :data1=>9.352307692307694}, {:data0=>\"16\", :data1=>9.288461538461538}, {:data0=>\"17\", :data1=>9.224615384615385}, {:data0=>\"18\", :data1=>9.160769230769231}, {:data0=>\"19\", :data1=>9.096923076923078}, {:data0=>\"20\", :data1=>9.033076923076923}, {:data0=>\"21\", :data1=>8.96923076923077}, {:data0=>\"22\", :data1=>8.905384615384616}, {:data0=>\"23\", :data1=>8.841538461538462}, {:data0=>\"24\", :data1=>8.777692307692309}, {:data0=>\"25\", :data1=>8.713846153846154}]>}, :extension=>[]}>"
309
+ "#<Nyaplot::Frame:0x007ff6544894a8 @properties={:panes=>[#<Nyaplot::Plot:0x007ff65448bc30 @properties={:diagrams=>[#<Nyaplot::Diagram:0x007ff654489bb0 @properties={:type=>:bar, :options=>{:x=>\"data0\", :y=>\"data1\"}, :data=>\"759c4fe1-01be-4c0f-bf93-49ab6d168710\"}, @xrange=[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], @yrange=[-0.8927692307692308, 7.428769230769229]>], :options=>{:width=>700, :xrange=>[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\"], :yrange=>[-0.8927692307692308, 7.428769230769229]}}>], :data=>{\"759c4fe1-01be-4c0f-bf93-49ab6d168710\"=>#<Nyaplot::DataFrame:0x007ff65448b6e0 @name=\"759c4fe1-01be-4c0f-bf93-49ab6d168710\", @rows=[{:data0=>\"1\", :data1=>7.428769230769229}, {:data0=>\"2\", :data1=>7.082038461538459}, {:data0=>\"3\", :data1=>6.73530769230769}, {:data0=>\"4\", :data1=>6.388576923076921}, {:data0=>\"5\", :data1=>6.041846153846151}, {:data0=>\"6\", :data1=>5.695115384615383}, {:data0=>\"7\", :data1=>5.348384615384614}, {:data0=>\"8\", :data1=>5.001653846153845}, {:data0=>\"9\", :data1=>4.654923076923075}, {:data0=>\"10\", :data1=>4.308192307692306}, {:data0=>\"11\", :data1=>3.961461538461537}, {:data0=>\"12\", :data1=>3.6147307692307677}, {:data0=>\"13\", :data1=>3.267999999999999}, {:data0=>\"14\", :data1=>2.92126923076923}, {:data0=>\"15\", :data1=>2.5745384615384603}, {:data0=>\"16\", :data1=>2.2278076923076915}, {:data0=>\"17\", :data1=>1.8810769230769226}, {:data0=>\"18\", :data1=>1.534346153846153}, {:data0=>\"19\", :data1=>1.187615384615384}, {:data0=>\"20\", :data1=>0.8408846153846152}, {:data0=>\"21\", :data1=>0.4941538461538455}, {:data0=>\"22\", :data1=>0.14742307692307666}, {:data0=>\"23\", :data1=>-0.19930769230769219}, {:data0=>\"24\", :data1=>-0.5460384615384619}, {:data0=>\"25\", :data1=>-0.8927692307692308}]>}, :extension=>[]}>"
184
310
  ]
185
311
  },
186
312
  "metadata": {},
@@ -192,11 +318,42 @@
192
318
  "chart.add(:bar, x, t.trend)\n",
193
319
  "chart.show"
194
320
  ]
321
+ },
322
+ {
323
+ "cell_type": "markdown",
324
+ "metadata": {},
325
+ "source": [
326
+ "# It's last few values should be 0, instead of negative"
327
+ ]
328
+ },
329
+ {
330
+ "cell_type": "code",
331
+ "execution_count": 10,
332
+ "metadata": {
333
+ "collapsed": false
334
+ },
335
+ "outputs": [
336
+ {
337
+ "data": {
338
+ "text/html": [
339
+ "<table><tr><td>25</td><td>24</td><td>23</td><td>22</td><td>21</td><td>20</td><td>19</td><td rowspan='2'>&#8230;</td><td>8</td><td>7</td><td>6</td><td>5</td><td>4</td><td>3</td><td>2</td></tr><tr><td>0</td><td>0</td><td>0</td><td>0.14742307692307666</td><td>0.4941538461538455</td><td>0.8408846153846152</td><td>1.187615384615384</td><td>5.001653846153845</td><td>5.348384615384614</td><td>5.695115384615383</td><td>6.041846153846151</td><td>6.388576923076921</td><td>6.73530769230769</td><td>7.082038461538459</td></tr></table>"
340
+ ],
341
+ "text/plain": [
342
+ "\"<table><tr><td>25</td><td>24</td><td>23</td><td>22</td><td>21</td><td>20</td><td>19</td><td rowspan='2'>&#8230;</td><td>8</td><td>7</td><td>6</td><td>5</td><td>4</td><td>3</td><td>2</td></tr><tr><td>0</td><td>0</td><td>0</td><td>0.14742307692307666</td><td>0.4941538461538455</td><td>0.8408846153846152</td><td>1.187615384615384</td><td>5.001653846153845</td><td>5.348384615384614</td><td>5.695115384615383</td><td>6.041846153846151</td><td>6.388576923076921</td><td>6.73530769230769</td><td>7.082038461538459</td></tr></table>\""
343
+ ]
344
+ },
345
+ "metadata": {},
346
+ "output_type": "display_data"
347
+ }
348
+ ],
349
+ "source": [
350
+ "IRuby.display IRuby.table([(1..y.size).to_a.reverse, t.trend.reverse])"
351
+ ]
195
352
  }
196
353
  ],
197
354
  "metadata": {
198
355
  "kernelspec": {
199
- "display_name": "Ruby 2.1.2",
356
+ "display_name": "Ruby 2.2.2",
200
357
  "language": "ruby",
201
358
  "name": "ruby"
202
359
  },
@@ -204,7 +361,7 @@
204
361
  "file_extension": "rb",
205
362
  "mimetype": "application/x-ruby",
206
363
  "name": "ruby",
207
- "version": "2.1.2"
364
+ "version": "2.2.2"
208
365
  }
209
366
  },
210
367
  "nbformat": 4,
@@ -11,10 +11,11 @@ module LinearRegressionTrend
11
11
  attr_accessor :slope, :intercept
12
12
 
13
13
  # Pass in an array of values to get the regression on
14
- def initialize y_values
14
+ def initialize(y_values, non_negative: false)
15
15
  @y_values = y_values
16
16
  @size = @y_values.size
17
17
  @x_values = (1..@size).to_a
18
+ @no_negs = non_negative
18
19
 
19
20
  #initialize everything to 0
20
21
  sum_x = 0
@@ -43,8 +44,11 @@ module LinearRegressionTrend
43
44
  # Get the Y value for any given X value
44
45
  # from y = mx + b, or
45
46
  # y = slope * x + intercept
46
- def predict( x )
47
- @slope * x + @intercept
47
+ def predict(x)
48
+ predicted = @slope * x + @intercept
49
+
50
+ return 0 if predicted < 0 and @no_negs
51
+ return predicted
48
52
  end
49
53
 
50
54
  # Get the "next" value if the sequence
@@ -1,3 +1,3 @@
1
1
  module LinearRegressionTrend
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linear_regression_trend
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Fortuna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-05 00:00:00.000000000 Z
11
+ date: 2015-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -130,6 +130,7 @@ executables: []
130
130
  extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
+ - ".codeclimate.yml"
133
134
  - ".gitignore"
134
135
  - ".rspec"
135
136
  - ".travis.yml"