Published
Edited
Feb 16, 2022
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
domainsZScore = domains.map((domain) => ({
...domain,
indicators: domain.indicators.map((indicator) => {
const direction = indicator.negative ? -1 : 1;
return {
...indicator,
values: indicator.values.map((value) => ({
...value,
zScore:
((value.value - indicator.stats.mean) / indicator.stats.stddev) *
direction
}))
};
})
}))
Insert cell
Insert cell
Insert cell
Insert cell
domainScores = domainsZScore.map(domain => ({
...domain,
domainScore: domain.indicators.reduce((memo, indicator) => indicator.values.map(value => {
const { geoid, zScore } = value;
const match = memo.find(m => m.geoid === geoid);
return {
geoid,
domainScore: match ? match.domainScore + zScore : zScore,
}
}), []).map(ds => ({
...ds,
domainScore: ds.domainScore / domain.indicators.length,
}))
}))
Insert cell
Insert cell
Insert cell
Insert cell
finalScores = domainScores.reduce((memo, domain) => domain.domainScore.map(value => {
const { geoid, domainScore } = value;
const weighted = domainScore * (domain.weight / 100);
const match = memo.find(m => m.geoid === geoid);
return {
geoid,
value: match ? match.value + weighted : weighted,
}
}), [])
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
domainsRaw = (
await fetch(`https://hpi-api.vercel.app/api/domains?key=${API_KEY}`)
).json()
Insert cell
indicators = (
await fetch(`https://hpi-api.vercel.app/api/indicators?key=${API_KEY}`)
).json()
Insert cell
indicatorStats = Promise.all(
indicators.map((indicator) => {
const year = d3.max(indicator.dates);
return fetch(
`https://hpi-api.vercel.app/api/stats?geography=tracts&year=${year}&indicator=${indicator.varname}&key=${API_KEY}`
)
.then((statsResponse) => statsResponse.json())
.then((stats) => ({
...indicator,
stats: stats.sort((a, b) => new Date(b.date) - new Date(a.date))[0]
}));
})
)
Insert cell
indicatorsFull = Promise.all(
indicatorStats.map((indicator) => {
const year = d3.max(indicator.dates);
return fetch(
`https://hpi-api.vercel.app/api/data?geography=tracts&year=${year}&indicator=${indicator.varname}&format=json&key=${API_KEY}`
)
.then((indicatorResponse) => indicatorResponse.json())
.then((values) => ({
...indicator,
values
}));
})
)
Insert cell
domains = domainsRaw.map((domain) => ({
...domain,
indicators: domain.indicators.map((indicator) =>
indicatorsFull.find((i) => i.varname === indicator)
)
}))
Insert cell
hpiScores = (
await fetch(
`https://hpi-api.vercel.app/api/data?geography=tracts&year=2022&indicator=hpi2score&format=json&key=${API_KEY}`
)
).json()
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