Published
Edited
Dec 9, 2020
1 star
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
filtered.map(d => d.v)
Insert cell
Insert cell
Insert cell
Insert cell
legend({ color: colorScale.domain(cutoffExtent) })
Insert cell
import { legend } from "@d3/color-legend"
Insert cell
weeks = d3.range(example.length).reverse()
Insert cell
function value(d) {
if (!d) return 1;
let used = +d["icu_beds_used_7_day_avg"];
let total = +d["total_icu_beds_7_day_avg"];
// there is an assumption
// if (total < used) total = used;
// percent icu used out of total on average
return used / total;
}
Insert cell
example = eventsByHospital.get("310024")
Insert cell
filtered = hospitals
.filter(d => {
let events = eventsByHospital.get(d.hospital_pk);
if (events && events[week]) return value(events[week]) > cutoffPercent;
})
.sort(function(a, b) {
let eventsA = eventsByHospital.get(a.hospital_pk);
let eventsB = eventsByHospital.get(b.hospital_pk);
if (!eventsA || !eventsB) return -1;
return value(eventsA[week]) - value(eventsB[week]);
})
.map(d => {
let p = projection([d.LONGITUDE, d.LATITUDE]);

// total_icu_beds_7_day_avg
// icu_beds_used_7_day_avg
// total_beds_7_day_avg
let events = eventsByHospital.get(d.hospital_pk);
// console.log(d, events);
// if (!events || !events.length) return;
if (events && events[week] && p) {
let v = value(events[week]);
return {
...d,
events: events,
v
};
}
return null;
// return eventsByHospital.get(d.hospital_pk)[week]; //.map(d => value(d));
})
.filter(d => !!d)
Insert cell
metrics = [
"total_icu_beds_7_day_avg",
"total_staffed_adult_icu_beds_7_day_avg",
"icu_beds_used_7_day_avg"
]
Insert cell
metric = metrics[0]
Insert cell
// colorScale = d3.scaleSequential(d3.interpolateGreys)
// colorScale = d3.scaleSequential(d3.interpolateMagma)
colorScale = d3.scaleSequential(d3.interpolateTurbo)
Insert cell
extent = d3.extent(eventsByHospital, d => value(d[1][week])) //[cutoffPercent, 101]
Insert cell
cutoffExtent = [cutoffPercent, 1]
Insert cell
metricNormalize = d3
.scaleLinear()
.range([0, 1])
// .domain(extent)
.domain([cutoffPercent, 1])
Insert cell
metricRadius = d3
.scaleSqrt()
.range([1, 3])
// .domain(extent)
.domain([cutoffPercent, 1])
Insert cell
eventsByHospital.get("010108")
Insert cell
import { countyShapes, stateShapes } from "@enjalot/us-county-datasets"
Insert cell
import { scaleCanvas } from "@john-guerra/canvas-retina-display"
Insert cell
mapWidth = hires == "true" ? 4096 : width
Insert cell
height = hires == "true" ? 2048 : width * 0.67
Insert cell
hospitals = FileAttachment("hospitals-maplarge.csv").csv()
Insert cell
Insert cell
hospitalsByPK = new Map(hospitals.map(d => [d.hospital_pk, d]))
Insert cell
Insert cell
hhs = FileAttachment(
"slimmed-reported_hospital_capacity_admissions_facility-level_weekly_average_timeseries_20201207.csv"
).csv()
Insert cell
hhs.filter(d => d.hospital_pk == "010108")
Insert cell
// how many events per hospital (seems 18)
d3.rollup(hhs, v => v.length, d => d.hospital_pk)
Insert cell
eventsByHospital = d3.group(hhs, d => d.hospital_pk)
Insert cell
// how many events per county
d3.rollup(hhs, v => v.length, d => hospitalsByPK.get(d.hospital_pk).fips_code)
Insert cell
d3 = require("d3@6", "d3-geo", "d3-geo-projection@3")
Insert cell
Insert cell
/*
mkdir data
curl https://healthdata.gov/sites/default/files/reported_hospital_capacity_admissions_facility-level_weekly_average_timeseries_20201207.csv > data/reported_hospital_capacity_admissions_facility-level_weekly_average_timeseries_20201207.csv
npm install d3
node slim.js
*/

/*
let fs = require("fs")
let d3 = require("d3")

let dir = "data/"
let filename = "reported_hospital_capacity_admissions_facility-level_weekly_average_timeseries_20201207.csv"
let txt = fs.readFileSync(dir + filename).toString().slice(1) // weird character at begin of file
let data = d3.csvParse(txt)

let todelete = "hospital_name,address,city,state,zip,fips_code,hospital_subtype,ccn,is_metro_micro".split(",")
Object.keys(data[0]).forEach(key => {
if(key.indexOf("previous_day") >= 0) {
todelete += "," + key
}
})
todelete = todelete.split(",")
console.log("todelete", todelete)

let slimmed = data
.filter(d => !!d.address)
// .filter(d => !!d.fips_code)
.map(function(d) {
let obj = {...d}
Object.keys(obj).forEach(key => {
let v = obj[key]
if(v == "-999999" || v == "-999999.0") obj[key] = ""
})

// we can look up all these fields in the hospitals geocoded map
todelete.forEach(del => {
delete obj[del]
})
return obj
})

console.log("writing slimmed full file")
fs.writeFileSync(dir + "slimmed-" + filename, d3.csvFormat(slimmed))

// // let byStateFips = d3.rollup(data, v => v.length, d => d.fips_code.slice(0,2))
let byStateFips = d3.group(data, d => d.fips_code.slice(0,2))

let states = Array.from(byStateFips.keys())

states.forEach(state => {
let d = byStateFips.get(state)
console.log(state, d.length)
fs.writeFileSync(dir + state + "-slimmed-" + filename, d3.csvFormat(d))
})
*/
Insert cell
import { world } from "@d3/world-map"
Insert cell
topojson = require("topojson-client@3")
Insert cell
import { select } from "@jashkenas/inputs"
Insert cell
import { Scrubber } from "@mbostock/scrubber"
Insert cell
land = topojson.feature(world, world.objects.land)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more