data = (await d3.csv(DATA_URL)).map(d => ({
northernVariant: parseVariantResults(d['Northern\rVariant\rResults']),
southernVariant: parseVariantResults(d['Southern\rVariant Results']),
...d,
date: d3.utcParse('%m/%d/%Y')(d['Sample Date']),
southern: toIntOrNull(d['Southern\r(copies/mL)']),
northern: toIntOrNull(d['Northern\r(copies/mL)']),
southernAvg: toIntOrNull(d['Southern\r7 day avg']),
northernAvg: toIntOrNull(d['Northern\r7 day avg']),
}))
.map(d => ({
...d,
southernLow: d.southern - toIntOrNull(d['Southern\rLow Confidence\rInterval']),
northernLow: d.northern - toIntOrNull(d['Northern\rLow Confidence\rInterval']),
southernHigh: d.southern + toIntOrNull(d['Southern\rHigh Confidence\rInterval']),
northernHigh: d.northern + toIntOrNull(d['Northern\rHigh Confidence\rInterval']),
}))
.map((d, i, arr) => {
const windowStart = Math.max(0, i - 7)
const windowEnd = i
const window = arr.slice(windowStart, windowEnd)
return {
...d,
southernLowAvg: d3.mean(window.filter(d => d.southernLow), d => d.southernLow),
northernLowAvg: d3.mean(window.filter(d => d.northernLow), d => d.northernLow),
southernHighAvg: d3.mean(window.filter(d => d.southernHigh), d => d.southernHigh),
northernHighAvg: d3.mean(window.filter(d => d.northernHigh), d => d.northernHigh),
}
})
.map((d, i, arr) => (
[
{
system: 'northern',
date: d.date,
concentration: d.northern,
concentrationAvg: d.northernAvg,
ciHigh: d.northernHigh,
ciLow: d.northernLow,
avgHigh: d.northernHighAvg,
avgLow: d.northernLowAvg,
},
{
system: 'southern',
date: d.date,
concentration: d.southern,
concentrationAvg: d.southernAvg,
ciHigh: d.southernHigh,
ciLow: d.southernLow,
avgHigh: d.southernHighAvg,
avgLow: d.southernLowAvg,
}
]
))
.flat()