ShelterShield is built to be auditable: every score traces back to public data through a reproducible pipeline. This page documents the sources, the index construction, and the limits of the current version.
| Source | Role | License |
|---|---|---|
| NYC Evictions6z8x-wfk4 | Displacement pressure (executed residential evictions) | NYC Open Data (public domain) |
| NYC PLUTO64uk-42ks | Residential units, assessed value, year built | NYC Open Data (public domain) |
| NYC 2020 Census Tracts63ge-mke6 | Tract geometry + GEOID join spine | NYC Open Data (public domain) |
Evictions census_tract mapped to CT2020 (~91.5% coverage); unmatched tracts excluded and reported.
The Displacement-Risk Composite Score aggregates three percentile-normalized domains, each oriented so that higher values indicate higher priority for attention:
Each domain is converted to a percentile rank, then combined with a weighted geometric mean (which penalizes tracts that are extreme on one domain but low on others, rather than letting a single domain dominate). The result is re-ranked to a 0–100 score.
Tracts are placed in a 2×2 of displacement risk (above/below median) by residential-stock presence (above/below median) into four capital archetypes: Preserve (high risk, substantial stock), Protect (high risk, thinner stock — tenant protection), Produce (lower risk, capacity to build), and Monitor. A Preservation Priority Score ranks tracts by at-risk units × risk, for capital allocation.
The entire pipeline is a single command — npm run data (python3 scripts/build_index.py) — which pulls the sources, builds the domains, computes the composite, and writes validated GeoJSON/JSON the app consumes. No manual steps, no hand-edited numbers.