1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | "use strict";
|
15 |
|
16 | import BarsHandler from './bars';
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | var FractionsBarsHandler = function() {
|
23 | };
|
24 |
|
25 | FractionsBarsHandler.prototype = new BarsHandler();
|
26 |
|
27 |
|
28 | FractionsBarsHandler.prototype.extractSeries = function(rawData, i, options) {
|
29 |
|
30 | var series = [];
|
31 | var x, y, point, num, den, value, stddev, variance;
|
32 | var mult = 100.0;
|
33 | const seriesLabel = options.get("labels")[i];
|
34 | const logScale = options.getForSeries("logscale", seriesLabel);
|
35 | const sigma = options.getForSeries("sigma", seriesLabel);
|
36 | for ( var j = 0; j < rawData.length; j++) {
|
37 | x = rawData[j][0];
|
38 | point = rawData[j][i];
|
39 | if (logScale && point !== null) {
|
40 |
|
41 |
|
42 | if (point[0] <= 0 || point[1] <= 0) {
|
43 | point = null;
|
44 | }
|
45 | }
|
46 |
|
47 | if (point !== null) {
|
48 | num = point[0];
|
49 | den = point[1];
|
50 | if (num !== null && !isNaN(num)) {
|
51 | value = den ? num / den : 0.0;
|
52 | stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
|
53 | variance = mult * stddev;
|
54 | y = mult * value;
|
55 |
|
56 | series.push([ x, y, [ y - variance, y + variance, num, den ] ]);
|
57 | } else {
|
58 | series.push([ x, num, [ num, num, num, den ] ]);
|
59 | }
|
60 | } else {
|
61 | series.push([ x, null, [ null, null, null, null ] ]);
|
62 | }
|
63 | }
|
64 | return series;
|
65 | };
|
66 |
|
67 |
|
68 | FractionsBarsHandler.prototype.rollingAverage =
|
69 | function(originalData, rollPeriod, options, i) {
|
70 | rollPeriod = Math.min(rollPeriod, originalData.length);
|
71 | var rollingData = [];
|
72 | const seriesLabel = options.get("labels")[i];
|
73 | const sigma = options.getForSeries("sigma", seriesLabel);
|
74 | const wilsonInterval = options.getForSeries("wilsonInterval", seriesLabel);
|
75 |
|
76 | var low, high, i, stddev;
|
77 | var num = 0;
|
78 | var den = 0;
|
79 | var mult = 100.0;
|
80 | for (i = 0; i < originalData.length; i++) {
|
81 | num += originalData[i][2][2];
|
82 | den += originalData[i][2][3];
|
83 | if (i - rollPeriod >= 0) {
|
84 | num -= originalData[i - rollPeriod][2][2];
|
85 | den -= originalData[i - rollPeriod][2][3];
|
86 | }
|
87 |
|
88 | var date = originalData[i][0];
|
89 | var value = den ? num / den : 0.0;
|
90 | if (wilsonInterval) {
|
91 |
|
92 |
|
93 | if (den) {
|
94 | var p = value < 0 ? 0 : value, n = den;
|
95 | var pm = sigma * Math.sqrt(p * (1 - p) / n + sigma * sigma / (4 * n * n));
|
96 | var denom = 1 + sigma * sigma / den;
|
97 | low = (p + sigma * sigma / (2 * den) - pm) / denom;
|
98 | high = (p + sigma * sigma / (2 * den) + pm) / denom;
|
99 | rollingData[i] = [ date, p * mult,
|
100 | [ low * mult, high * mult ] ];
|
101 | } else {
|
102 | rollingData[i] = [ date, 0, [ 0, 0 ] ];
|
103 | }
|
104 | } else {
|
105 | stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
|
106 | rollingData[i] = [ date, mult * value,
|
107 | [ mult * (value - stddev), mult * (value + stddev) ] ];
|
108 | }
|
109 | }
|
110 |
|
111 | return rollingData;
|
112 | };
|
113 |
|
114 | export default FractionsBarsHandler;
|