// // data will be sorted by earliest to latest const rawAudits = rawJson.audits; const latest = rawAudits.reverse(); const sdmAudits = rawAudits.filter( row => row.company === "SDM"); const todayMoment = moment(new Date()); // Landing - 4 Dates - a week apart const isDaysApart = (row, range) => { const start = moment(new Date()).subtract(range.start, 'days'); const end = moment(new Date()).subtract(range.end, 'days'); const test = moment(row.created_on); const isBetween = test.isBetween(start, end, 'days'); //const difference = todayMoment return isBetween; } const thisWeekfilter = row => { const isBetween = isDaysApart(row, {start: 7, end: 0}); if (row.label === "Landing" && isBetween){ return row; } } const lastWeekfilter = row => { const isBetween = isDaysApart(row, {start: 14, end: 7}); if (row.label === "Landing" && isBetween){ return row; } } const threeWeeksAgofilter = row => { const isBetween = isDaysApart(row, {start: 21, end: 14}); if (row.label === "Landing" && isBetween){ return row; } } const fourWeeksAgofilter = row => { const isBetween = isDaysApart(row, {start: 28, end: 21}); if (row.label === "Landing" && isBetween){ return row; } } // currently we can go only go back 3 weeks const landingMomentsThisWeek = sdmAudits.find(thisWeekfilter); const landingMomentsLastWeek = sdmAudits.find(lastWeekfilter); const landingMomentsThreeWeeksAgo = sdmAudits.find(threeWeeksAgofilter); // const landingMomentsFourWeeksAgo = sdmAudits.find(fourWeeksAgofilter); console.log("y landingMomentsThreeWeeksAgo: ", landingMomentsThreeWeeksAgo) function addRow(arrHead, tableId, label, prop) { const empTab = document.getElementById(tableId); var rowCnt = empTab.rows.length; // GET TABLE ROW COUNT. var tr = empTab.insertRow(rowCnt); // TABLE ROW. tr = empTab.insertRow(rowCnt); for (var c = 0; c < arrHead.length; c++) { var td = document.createElement('td'); // TABLE DEFINITION. td = tr.insertCell(c); // CREATE AND ADD TEXTBOX IN EACH CELL. var ele = document.createElement('input'); ele.setAttribute('type', 'text'); ele.setAttribute('value', arrHead[c]); td.appendChild(ele); } } // https://stackoverflow.com/questions/6195335/linear-regression-in-javascript function linearRegression(y,x){ var lr = {}; var n = y.length; var sum_x = 0; var sum_y = 0; var sum_xy = 0; var sum_xx = 0; var sum_yy = 0; for (var i = 0; i < y.length; i++) { sum_x += x[i]; sum_y += y[i]; sum_xy += (x[i]*y[i]); sum_xx += (x[i]*x[i]); sum_yy += (y[i]*y[i]); } lr['slope'] = (n * sum_xy - sum_x * sum_y) / (n*sum_xx - sum_x * sum_x); lr['intercept'] = (sum_y - lr.slope * sum_x)/n; lr['r2'] = Math.pow((n*sum_xy - sum_x*sum_y)/Math.sqrt((n*sum_xx-sum_x*sum_x)*(n*sum_yy-sum_y*sum_y)),2); return lr; } function linearRegressionGain(x, y) { var xs = 0; // sum(x) var ys = 0; // sum(y) var xxs = 0; // sum(x*x) var xys = 0; // sum(x*y) var yys = 0; // sum(y*y) var n = 0; for (; n < x.length && n < y.length; n++) { xs += x[n]; ys += y[n]; xxs += x[n] * x[n]; xys += x[n] * y[n]; yys += y[n] * y[n]; } var div = n * xxs - xs * xs; var gain = (n * xys - xs * ys) / div; var offset = (ys * xxs - xs * xys) / div; var correlation = Math.abs((xys * n - xs * ys) / Math.sqrt((xxs * n - xs * xs) * (yys * n - ys * ys))); return { gain: gain, offset: offset, correlation: correlation }; } const thisWeek = Number(landingMomentsThisWeek.performance_score); const lastWeek = Number(landingMomentsLastWeek.performance_score); const threeWeeksAgo = Number(landingMomentsThreeWeeksAgo.performance_score); var known_y = [1, 2, 3]; var known_x = [threeWeeksAgo, lastWeek, thisWeek]; var slope = linearRegression(known_y, known_x); var lr = linearRegressionGain(known_y, known_x); const getTrend = lr => { let trend; if (lr.gain > 0){ trend = `Up ${lr.gain.toFixed(1)}` } else if (lr.gain < 0) { trend = `Down ${lr.gain.toFixed(1)}` } else { trend = "No Change"; } return trend; } const perfArr = [ landingMomentsThisWeek.label, "unavailable", String(landingMomentsThreeWeeksAgo.performance_score), String(landingMomentsLastWeek.performance_score), String(landingMomentsThisWeek.performance_score), getTrend(lr) ] addRow(perfArr, "performanceMonthTable") const thisWeekInt = Number(landingMomentsThisWeek.time_to_interactive.slice(0,-1)); const lastWeekInt = Number(landingMomentsLastWeek.time_to_interactive.slice(0,-1)); const threeWeeksAgoInt = Number(landingMomentsThreeWeeksAgo.time_to_interactive.slice(0,-1)); var known_y_int = [1, 2, 3]; var known_x_int = [threeWeeksAgoInt, lastWeekInt, thisWeekInt]; var lr_int = linearRegressionGain(known_y_int, known_x_int); const interactiveArr = [ "time to interactive", "unavailable", String(landingMomentsThreeWeeksAgo.time_to_interactive), String(landingMomentsLastWeek.time_to_interactive), String(landingMomentsThisWeek.time_to_interactive), getTrend(lr_int) ] const addRows = () => { const rows = ["time_to_contentful_paint","time_to_meaningful_paint","time_to_interactive"]; rows.forEach( row => { const thisWInt = Number(landingMomentsThisWeek[row].slice(0,-1)); const lastWInt = Number(landingMomentsLastWeek[row].slice(0,-1)); const threeWInt = Number(landingMomentsThreeWeeksAgo[row].slice(0,-1)); const known_y_int = [1, 2, 3]; const known_x_int = [threeWInt, lastWInt, thisWInt]; const lr_int = linearRegressionGain(known_y_int, known_x_int); const arr = [ row.split("_").join(" "), "unavailable", String(landingMomentsThreeWeeksAgo[row]), String(landingMomentsLastWeek[row]), String(landingMomentsThisWeek[row]), getTrend(lr_int) ] addRow(arr, "interactiveMonthTable") }) } addRows()