hopkins_parser = async function(metric = "confirmed") {
const hopkins = aq.fromCSV(await fetch(`https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_${metric}_US.csv`).then(d => d.text()))
const date_names = hopkins.columnNames().map(d => [d, new Date(Date.parse(d))]).filter(d => Date.parse(d[0])).map(d => d[1].toISOString().slice(0, 10))
const t2 = hopkins
.select(aq.not(["Lat", "Long", "Long_", "code3", "iso3", "iso2", "UID", "Admin2", "Province_State", "Country_Region"]))
.derive({FIPS: d => op.padstart(d.FIPS, 5, "0")})
.fold(aq.range(2, hopkins.numCols() - 1))
.groupby(["FIPS", "Combined_Key"])
.orderby("key")
.rollup({values: d => op.values(d.value)})
const counts = new Float32Array(date_names.length)
const rolling = new Float32Array(date_names.length)
const pingpong = new Float32Array(date_names.length)
const datecounts = new Map()
for (let row of t2) {
const val = row.values
counts[0] = 0
let smooth = 2
for (let i = 1; i < val.length; i++) {
counts[i] = val[i] > val[i-1] ? val[i] - val[i-1] : 0
}
for (let i = 0; i < smooth; i++) {
rolling[i] = d3.mean(counts.slice(0, i))
}
for (let i = smooth; i < counts.length; i ++) {
rolling[i] = d3.mean(counts.slice(i-smooth, i + 1))
}
pingpong.fill(0)
if (!datecounts.get(row.FIPS)) {
datecounts.set(row.FIPS, new Map())
}
let fipcounts = datecounts.get(row.FIPS)
for (let i = 0; i < rolling.length; i++) {
const date = date_names[i]
fipcounts.set(date, rolling[i])
}
}
return datecounts
}