Przeglądaj źródła

Regression line 10 days into future

Fela Maslen 5 lat temu
rodzic
commit
3b5b918edd
2 zmienionych plików z 17 dodań i 4 usunięć
  1. 5 1
      src/types.ts
  2. 12 3
      src/utils/regression.ts

+ 5 - 1
src/types.ts

@@ -5,9 +5,13 @@ export type Case = {
 
 export type Cases = Case[];
 
+export type FutureCase = {
+  date: Date;
+};
+
 export type Data = {
   date: number;
-  value: number;
+  value?: number;
   regression?: number;
 }[];
 

+ 12 - 3
src/utils/regression.ts

@@ -1,9 +1,12 @@
 import differenceInDays from 'date-fns/differenceInDays';
-import { Cases, Data } from '../types';
+import addDays from 'date-fns/addDays';
+import { Cases, Data, FutureCase } from '../types';
 
 // Start the regression line after this many cases have been recorded in total
 const regressionStart = 50;
 
+const futureDays = 10;
+
 const mean = (values: number[]): number =>
   values.reduce((last, value) => last + value, 0) / values.length;
 
@@ -61,9 +64,15 @@ export function getExponentialRegression(cases: Cases): Data {
     return Math.exp(slope * xValue + intercept);
   };
 
-  return cases.map(({ date, value }) => ({
+  const lastDate = cases[cases.length - 1].date;
+
+  const future: FutureCase[] = new Array(futureDays)
+    .fill(0)
+    .map((_, index) => ({ date: addDays(lastDate, index + 1) }));
+
+  return [...cases, ...future].map(({ date, ...rest }) => ({
     date: date.getTime(),
-    value,
     regression: regressionAtDate(date),
+    ...rest,
   }));
 }