diff --git a/components.d.ts b/components.d.ts index 0aedfbcc6..4a2f75458 100644 --- a/components.d.ts +++ b/components.d.ts @@ -59,6 +59,7 @@ declare module 'vue' { TrendRiskAge: typeof import('./src/components/charts/risk/age/TrendRiskAge.vue')['default'] TrendRiskCasesAge: typeof import('./src/components/charts/risk/age/TrendRiskCasesAge.vue')['default'] 'TrendRiskCasesAge copy': typeof import('./src/components/charts/risk/age/TrendRiskCasesAge copy.vue')['default'] + TrendRiskHealthConditions: typeof import('./src/components/charts/risk/health-conditions/TrendRiskHealthConditions.vue')['default'] TrendTotalCases: typeof import('./src/components/charts/overall/cases/TrendTotalCases.vue')['default'] TrendTotalCasesPerCapita: typeof import('./src/components/charts/overall/cases/TrendTotalCasesPerCapita.vue')['default'] TrendTotalDeaths: typeof import('./src/components/charts/overall/deaths/TrendTotalDeaths.vue')['default'] diff --git a/data/parser.js b/data/parser.js index 2818b631f..c21ba59ad 100644 --- a/data/parser.js +++ b/data/parser.js @@ -9,6 +9,7 @@ import OverallHospitalizations from './parser/overall/hospitalizations.js' import OverallDeaths from './parser/overall/deaths.js' import RiskAge from './parser/risk/age.js' +import RiskHealthConditions from './parser/risk/health-conditions.js' async function main() { const sources = await fg(['./data/raw/*.zip']) @@ -27,6 +28,7 @@ async function main() { await OverallDeaths(zips, counties) await RiskAge(zips) + await RiskHealthConditions(zips) } main() diff --git a/data/parser/risk/health-conditions.js b/data/parser/risk/health-conditions.js new file mode 100644 index 000000000..cd8a0d74e --- /dev/null +++ b/data/parser/risk/health-conditions.js @@ -0,0 +1,46 @@ +import mkdirp from 'mkdirp' +import path from 'path' +import fsp from 'fs/promises' +import Papa from 'papaparse' +import { getCounty } from '../../util.js' + +async function processSingleZip ({ date, zip }) { + const output = { + directory: `./public/data/risk/health-conditions/`, + file: `health-conditions.json` + } + + try { + await fsp.rm(output.directory, { recursive: true }) + } catch (e) {} + + const csv = await zip.entryData('comorbidities_sum.csv').then(res => res.toString()) + + const rows = Papa.parse(csv, { + header: true + }).data + + const results = rows.map(row => { + return { + health_condition: row.comorbidity, + sex: row.sex, + cases: +row.cases, + deaths: +row.deaths + } + }).filter(row => !!row.health_condition) + + const data = { + segment: { }, + headers: Object.keys(results[0]), + rows: results.map(row => Object.values(row)) + } + + await mkdirp(output.directory) + await fsp.writeFile(path.join(output.directory, output.file), JSON.stringify(data)) +} + +function process (zips) { + return processSingleZip(zips.at(-1)) +} + +export default process diff --git a/public/data/risk/health-conditions/health-conditions.json b/public/data/risk/health-conditions/health-conditions.json new file mode 100644 index 000000000..48c1f2db6 --- /dev/null +++ b/public/data/risk/health-conditions/health-conditions.json @@ -0,0 +1 @@ +{"segment":{},"headers":["health_condition","sex","cases","deaths"],"rows":[["Any Chronic Condition","Female",160346,6087],["Any Chronic Condition","Male",125662,6987],["Any Chronic Condition","Total",286274,13077],["Any Chronic Condition","Unknown",266,3],["Any Disability","Female",11801,1587],["Any Disability","Male",9456,1434],["Any Disability","Total",21276,3021],["Any Disability","Unknown",19,0],["Cardiovascular Disease","Female",29854,3071],["Cardiovascular Disease","Male",27385,3746],["Cardiovascular Disease","Total",57273,6819],["Cardiovascular Disease","Unknown",34,2],["Chronic Liver Disease","Female",1819,163],["Chronic Liver Disease","Male",1577,257],["Chronic Liver Disease","Total",3397,420],["Chronic Liver Disease","Unknown",1,0],["Chronic Lung Disease","Female",43275,1738],["Chronic Lung Disease","Male",27761,1763],["Chronic Lung Disease","Total",71106,3502],["Chronic Lung Disease","Unknown",70,1],["Chronic Renal Disease","Female",6815,1345],["Chronic Renal Disease","Male",6600,1669],["Chronic Renal Disease","Total",13421,3016],["Chronic Renal Disease","Unknown",6,2],["Currently Pregnant","Female",8779,22],["Currently Pregnant","Male",0,0],["Currently Pregnant","Total",8783,22],["Currently Pregnant","Unknown",4,0],["Diabetes Mellitus","Female",36341,2519],["Diabetes Mellitus","Male",30965,3055],["Diabetes Mellitus","Total",67365,5576],["Diabetes Mellitus","Unknown",59,2],["Hypertension/High blood pressure","Female",32438,1660],["Hypertension/High blood pressure","Male",25379,1829],["Hypertension/High blood pressure","Total",57879,3489],["Hypertension/High blood pressure","Unknown",62,0],["ICU","Female",6345,2682],["ICU","Male",7999,3559],["ICU","Total",14367,6244],["ICU","Unknown",23,3],["Immunocompromised Condition","Female",9333,550],["Immunocompromised Condition","Male",5405,612],["Immunocompromised Condition","Total",14746,1162],["Immunocompromised Condition","Unknown",8,0],["Missing/Unknown status on all conditions","Female",363168,1173],["Missing/Unknown status on all conditions","Male",329985,1327],["Missing/Unknown status on all conditions","Total",701056,2502],["Missing/Unknown status on all conditions","Unknown",7903,2],["None of the above conditions","Female",386415,10347],["None of the above conditions","Male",305984,11906],["None of the above conditions","Total",693561,22253],["None of the above conditions","Unknown",1162,0],["Obesity (BMI>40)","Female",11896,421],["Obesity (BMI>40)","Male",6482,387],["Obesity (BMI>40)","Total",18389,808],["Obesity (BMI>40)","Unknown",11,0],["Other Chronic Diseases","Female",38442,2488],["Other Chronic Diseases","Male",25104,2527],["Other Chronic Diseases","Total",63599,5015],["Other Chronic Diseases","Unknown",53,0],["Smoker","Female",38238,967],["Smoker","Male",45056,1801],["Smoker","Total",83347,2768],["Smoker","Unknown",53,0],["Total with completed information","Female",400790,11146],["Total with completed information","Male",316997,12774],["Total with completed information","Total",718978,23923],["Total with completed information","Unknown",1191,3]]} \ No newline at end of file diff --git a/src/components/charts/risk/health-conditions/TrendRiskHealthConditions.vue b/src/components/charts/risk/health-conditions/TrendRiskHealthConditions.vue new file mode 100644 index 000000000..b33c1afb5 --- /dev/null +++ b/src/components/charts/risk/health-conditions/TrendRiskHealthConditions.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/components/charts/risk/health-conditions/store.js b/src/components/charts/risk/health-conditions/store.js new file mode 100644 index 000000000..77942255b --- /dev/null +++ b/src/components/charts/risk/health-conditions/store.js @@ -0,0 +1,15 @@ +import { reactive, ref, watch } from 'vue' + +const store = { + data: ref(null) +} + +async function refreshData() { + store.data.value = await fetch(`/data/risk/health-conditions/health-conditions.json`).then(res => res.json()) +} + +if (globalThis.window) { + refreshData() +} + +export default store diff --git a/src/layouts/components/Navigation.vue b/src/layouts/components/Navigation.vue index 177f94907..066ecf725 100644 --- a/src/layouts/components/Navigation.vue +++ b/src/layouts/components/Navigation.vue @@ -64,20 +64,24 @@
  • - - by gender? - -
  • -
  • - - by ethnicity? - -
  • -
  • - + by health condition?
  • +
  • + + + by gender? + + Soon +
  • +
  • + + + by ethnicity? + + Soon +
  • diff --git a/src/pages/risk/health-conditions.mdx b/src/pages/risk/health-conditions.mdx new file mode 100644 index 000000000..3d819fd64 --- /dev/null +++ b/src/pages/risk/health-conditions.mdx @@ -0,0 +1,17 @@ +--- +title: Who is most at risk by health condition? +--- + + + # Who is most at risk by condition? + + ## What is this report useful for? + + This report provides charts indicating the number of cases and deaths for a number of tracked medical conditions. + + You may find it useful for assessing the relative risk of COVID to yourself or others. + + +
    + +