calculateAndMergeTrueProjectedCases = {
return function(rows) {
const filteredRows = _.filter(rows, row => moment(row[fields.date]).isBetween(graphStartDate, artificialTimeSeriesEnd, null, "[]"))
console.log("filtered", filteredRows)
const filteredStartDate = moment.max(moment(_.first(rows)[fields.date]), graphStartDate)
const endDate = moment.max([moment(_.last(rows)[fields.date]), artificialTimeSeriesEnd])
const startDate = moment.min([filteredStartDate, moment(endDate).subtract(averageDaysToDeathAfterInfection, 'days')])
const numDays = endDate.diff(startDate, "days")
const days = _.map(_.range(0, numDays + 1), diff => moment(startDate).add(diff, "days"))
console.log("days", days)
const dateIndexedFilteredRows = _.fromPairs(_.map(filteredRows, row => [(moment(row[fields.date]).format("YYYY-MM-DD")), row]))
let projectedDays = []
let lastDaysCases = undefined
for (const day of days) {
const currentDateData = dateIndexedFilteredRows[day.format("YYYY-MM-DD")]
const xDaysInFutureData = dateIndexedFilteredRows[moment(day).add(averageDaysToDeathAfterInfection, "days").format("YYYY-MM-DD")]
if (xDaysInFutureData) {
const projected = xDaysInFutureData[fields["total-deaths"]] / (infectedFatalityRate/100)
lastDaysCases = projected
if (currentDateData) {
projectedDays.push(assemblyFinalDataRow(currentDateData, projected))
}
else {
projectedDays.push(assemblyFinalDataRow({[fields.date]: day.format("YYYY-MM-DD")}, projected))
}
}
else {
if (lastDaysCases === undefined) {
console.log("lastdayscases was not defined!")
}
else {
let doublingTime = doublingTimeBeforeLockdown
let projected = lastDaysCases * 2**(1/doublingTime)
lastDaysCases = projected
if (currentDateData) {
projectedDays.push(assemblyFinalDataRow(currentDateData, projected))
}
else {
projectedDays.push(assemblyFinalDataRow({[fields.date]: day.format("YYYY-MM-DD")}, projected))
}
}
}
}
console.log("projected", projectedDays)
return projectedDays
}
}