-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslr.html
113 lines (94 loc) · 3.88 KB
/
slr.html
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!DOCTYPE html>
<html lang="en">
<head>
<script src="plotly1.47.4.min.js"></script>
<script src="ml3.3.0.min.js"></script>
<script src="lodash4.17.11.min.js"></script>
</head>
<body>
<a href="?mode=data">data</a>
<a href="?mode=all">all</a>
<div id="myDiv"></div>
<div id="notes"></div>
<script>
const SLR = window.ML.SimpleLinearRegression;
const TSR = window.ML.TheilSenRegression;
//load the data
Plotly.d3.csv("test.csv",function(data) {
const targetSeries = _.filter(data, {seriesname: 'target'});
const targetX = _.map(targetSeries, ({x}) => +x);
const targetY = _.map(targetSeries, ({y}) => +y);
//const targetRegressionModel = new SLR(targetX, targetY); // Train the model on training data
const targetRegressionModel = new SLR(targetX, targetY); // Train the model on training data
const targetRegressionFunction = targetRegressionModel.toString(3);
var target = {
x: targetX,
y: targetY,
type: 'scatter',
name: 'Target',
};
const targetXFull = _.flatten([targetX, 16, 17, 18, 19, 20]);
var targetRegression = {
x: targetXFull,
y: _.map(targetXFull, (x) => targetRegressionModel.predict(x)),
type: 'scatter',
name: 'Target Regression',
};
const actualSeries = _.filter(data, {seriesname: 'actual'});
const actualX = _.map(actualSeries, ({x}) => +x);
const actualY = _.map(actualSeries, ({y}) => +y);
//const actualRegressionModel = new SLR(actualX, actualY); // Train the model on training data
const actualRegressionModel = new SLR(actualX, actualY); // Train the model on training data
const actualRegressionFunction = actualRegressionModel.toString(3);
var actual = {
x: actualX,
y: actualY,
type: 'scatter',
name: 'Actual',
};
const actualXFull = _.flatten([actualX, 16, 17, 18, 19, 20]);
var actualRegression = {
x: actualXFull,
y: _.map(actualXFull, (x) => actualRegressionModel.predict(x)),
type: 'scatter',
name: 'Actual Regression',
};
const discrepancyPercent = (1 - targetRegressionModel.slope / actualRegressionModel.slope).toFixed(2) * 100;
const bufferPercent = (actualRegressionModel.slope / targetRegressionModel.slope - 1).toFixed(2) * 100;
var actualWithBuffer = {
x: actualXFull,
y: _.map(actualXFull, (x) => actualRegressionModel.predict(x) * (bufferPercent + 100) / 100),
type: 'scatter',
name: 'Target+Buffer',
};
const urlParams = new URLSearchParams(window.location.search);
const mode = urlParams.get('mode');
var data = mode === 'data' ? [target, actual] : [target, targetRegression, actual, actualRegression, actualWithBuffer] ;
var layout = {
title: 'least squares estimates',
xaxis: {
title: 'day',
showgrid: false,
zeroline: false,
range: [-5, 25]
},
yaxis: {
title: 'impressions',
showline: false,
range: [0, 600000]
}
};
Plotly.newPlot('myDiv', data, layout, {showSendToCloud: true});
const notesEl = document.getElementById('notes');
notesEl.innerHTML = `
Target Regression: ${targetRegressionFunction}<br>
Actual Regression: ${actualRegressionFunction}<br>
Discrepancy ${discrepancyPercent}%<br>
Buffer ${bufferPercent}%<br>
Forecast Target Day 20: ${Math.round(actualRegressionModel.predict(20))}<br>
Forecast Target+Buffer Day 20: ${Math.round(actualRegressionModel.predict(20) * (bufferPercent / 100 + 1))}<br>
`;
});
</script>
</body>
</html>