Skip to content

Latest commit

 

History

105 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NYC Parking Garage EV Fire Risk Map

View the live map | Methodology & sources

An interactive risk assessment of ~6,350 parking buildings across New York City, scored on the Fire Risk Index by their vulnerability to electric vehicle battery fires in enclosed structures. Covers both standalone parking garages and residential / office / institutional buildings with dedicated parking space.

Why this exists

As EVs become more common in cities, a new fire risk is emerging in parking garages: lithium-ion battery fires that burn hotter (~5,000°F vs ~1,500°F for gas cars), last longer (60-90+ minutes vs ~30 minutes), and can reignite days later. Roughly 56% of all documented EV battery fires happen while the vehicle is parked — making parking structures the highest-exposure environment.

NYC has thousands of parking garages, many built decades before EVs existed. Some have added EV charging infrastructure without upgrading fire suppression systems. Others have no evidence of fire suppression maintenance in over 35 years of DOB records. This tool maps and scores every commercial parking garage in the city to identify which ones are most vulnerable.

Important context: EVs catch fire 20-60x less frequently than gas vehicles. The risk per vehicle is very low. But when an EV fire does happen in an enclosed structure — especially an older one without modern fire suppression — the consequences can be severe. The August 2024 Incheon, South Korea incident (140 vehicles destroyed, 23 hospitalized, 8 hours to extinguish) demonstrated this.

What it shows

~6,350 buildings scored on the Fire Risk Index. The index is a weighted sum of structural, regulatory-compliance, and EV-infrastructure factors, with hazard-mechanism caps preventing any single failure mode from being double-counted across multiple data sources. Not bounded at 100 — preserves the gap between a building with a few issues and one with many. Each building also shows a percentile rank ("worse than N% of NYC garages") for intuitive framing.

Scoring factors:

  • Structural age (0-30 pts) — Buildings built before 1968 (pre-modern NYC building code) score highest.
  • Sprinkler system evidence (0-30 pts) — Cross-references DOB sprinkler permits with FDNY fire-protection violations to determine whether a system exists. Buildings required by Local Law 26 or Local Law 16 to have sprinklers with no evidence of compliance score highest.
  • DOB LL126 parking-structure program (0-12 pts) — The 2021 periodic parking-garage inspection mandate (from DOB NOW). Unsafe report filed and not corrected (+12), or required report never filed (+8). Attributes to structural mechanism.
  • DOB ECB Class 1/2 fire-relevant violations (variable) — Active, uncured Immediately Hazardous / Class 2 violations with fire-relevant descriptions (blocked egress, elevator fireman-service failure, fire alarm, sprinkler). Weighted by category, multiplied by age since issue. Each record attributes to a hazard mechanism by description keyword (sprinkler/egress/alarm/fireman_service/structural).
  • DOB NOW fire-system device violations (0-20 pts) — Open sprinkler, emergency power, exit-sign, and structurally-compromised building filings from DOB NOW.
  • Legacy LL26/2004 active violations (0-4 pts) — Small-volume retrofit-mandate signal (sprinkler, emergency power, photoluminescent exit signs) for buildings that missed the 2019 compliance deadline.
  • FDNY fire-protection compliance (variable) — Open FDNY fire-protection violations from OATH/ECB hearings, time-weighted (older open violations score higher). Sprinkler/standpipe and inspection/testing charges attribute to sprinkler; other charges to alarm.
  • EV charger presence (0-15 pts) — Buildings with existing (operational) AFDC chargers. DC fast weighted 3x. Planned stations are tracked as a separate pending EV install signal and do not contribute to the score.
  • Multi-story structure (0-10 pts) — More floors = harder evacuation, heat rises. Underground garages identified via PLUTO basement codes + OpenStreetMap.

After summing, hazard-mechanism caps bound each mechanism's total contribution at the p95 of its raw distribution (sprinkler=30, structural=23, egress=18, fireman_service=16, other=8, power=7, alarm=6). This prevents one failing sprinkler system cited by DOB permit gap + FDNY BF12 + ECB sprinkler-keyword from contributing 3× the points one failure warrants.

Tier assignment uses a score-threshold backbone (70/50/30 = High/Elevated/Moderate) with semantic escalation: 3+ maxed mechanisms or sprinkler+structural both maxed rises a building to High regardless of raw score.

See the full methodology for scoring details, data source documentation, and limitations.

Scoring history

  • v2.0 (2026-04-19) — "Fire Risk Index" rename; hazard-mechanism caps replace per-source caps; score unclamped with percentile rank surfaced; semantic tier rules with escalation safety nets. Scoring changes: (1) HAZARD_CAPS now bound each of the 7 failure mechanisms (sprinkler=30, structural=23, egress=18, fireman_service=16, other=8, power=7, alarm=6) at the p95 of their raw distribution, removing the need for per-source caps that were masking real multi-source signal; (2) score is no longer clamped at 100 — preserving the worst-building signal over a familiar scale, with percentile_rank ("worse than X% of NYC garages") added for intuitive framing; (3) ECB classifier tightened — dropped UNSAFE keyword (was sweeping LL11 facade-cycle reports that aren't fire risks) and added negative filter for benign "GAS FIRED BOILER" / "FIRE-HYDRANT" matches. AFDC fetch broadened: dropped the facility_type in (PAY_GARAGE, PARKING_GARAGE) pre-filter (was dropping mall Superchargers like Atlas Park); added access=public,private and status=E,P to capture tenant-only / workplace / fleet chargers and AFDC-registered planned installs. Station count 271→1,082; garages with chargers 237→632. New "pending EV install" signal combines AFDC-planned + DOB NOW electrical permits (dm9a-ab7w) with EV keywords and 2025+ filing date — flags 89 parking structures with forward-looking install activity not yet reflected in AFDC. Map UI: hazard contributions breakdown in popup, composite "DOB Fire Records" column, garage-type filter, pending-EV filter toggle, deep links to NYC Open Data for FDNY / DOB ECB / DOB EV permit records, percentile subtitle.
  • v1.3 (2026-04-17) — DOB violation signal rebuilt. Dropped the keyword-matched 3h2n-5cm9 DOB Violations filter (too narrow — caught only 406 garages on a taxonomy that's mostly administrative follow-up records) in favor of three targeted sources: (1) DOB NOW Safety Violations (855j-jady) restricted to the Local Law 126 parking-structure inspection program (picks up buildings with filed-but-not-corrected "unsafe" reports, +12 flat, and buildings that never filed the mandated inspection at all, +8 flat — no age decay because the LL126 program is only ~4 months old). (2) DOB ECB Violations (6bgk-3dad) filtered to active+uncured Class 1 / Hazardous and fire-relevant Class 2, with weighting by category (Construction fire-keyword / fireman-service elevator / other Class 1) and age multiplier (older uncured = ×1.25–×2). (3) Legacy 3h2n-5cm9 narrowed to active LL26/2004 violations only. 2425 Sedgwick Ave (the Bronx garage closed by DOB per Nov 2024 News12 coverage) was missed entirely by v1.2's DOB filter — it now scores 97 under v1.3 with the LL126 "Unsafe report filed" signal surfaced. Signal expansion brought ~106 additional buildings into the High tier. See research/version_comparison_v1_2_to_v1_3.md for rank churn.
  • v1.2 (2026-04-16) — Fixed charger-to-building matching for buildings with garage entrances on a different street than their PLUTO primary address. When PAD resolves a charger address to a building outside the target set (garagearea=0, not G-class), the matcher now falls through to point-in-polygon using the charger's actual coordinates. Fixed 19 wrong-BBL matches (e.g., Dime Building's S 4th St garage entrance was matching to the neighboring walk-up instead of the building itself at 277 S 5th), dropped 11 phantom entries, confirmed 34 legitimate extra garages where PLUTO under-reports garagearea. 6,164 buildings scored.
  • v1.1 (2026-04-15) — Sprinkler factor rebuilt as evidence-based (DOB permits + FDNY confirmation + retrofit mandate flags). New FDNY fire-protection compliance factor added from OATH/ECB hearings data (time-weighted open violations). Buildings with FDNY sprinkler maintenance violations (BF12) now count as confirmed sprinkler presence. LL26/LL16 retrofit mandate flags added for buildings required to have sprinklers with no evidence of compliance.
  • v1 (2026-04) — Building selection rebuilt around PLUTO's garagearea field. Previous versions scored standalone G-class garages plus any non-G building with an EV charger match, which made the non-G subset definitionally "has EV charger." v1 scores every NYC building with garagearea >= 1000 sqft regardless of EV presence, catching the ~5,000 under-apartment / under-office / under-hospital garages that PLUTO classifies by the building above. Charger-to-building matching rewritten around NYC Planning Labs Geosearch (PAD-backed address lookup) with ArcGIS MapPLUTO point-in-polygon as fallback.

Data sources

Source What it provides
NYC PLUTO Building class, year built, floors, basement, location (857K records bulk downloaded)
DOB Permit Issuance Historical sprinkler permits (pre-2021)
DOB NOW Build Recent sprinkler permits (2021+)
DOB Violations Legacy BIS DOB violations. In v1.3+ narrowed to active Local Law 26/2004 records (exit signs, emergency power, sprinkler retrofit) — the only substantive signal unique to this dataset.
DOB ECB Violations DOB violations adjudicated at OATH/ECB — includes hazard class (Class 1 / Class 2) and full violation descriptions. Primary DOB source in v1.3+.
DOB NOW Safety Violations Newer (post-2021) DOB violations with device_type taxonomy. Includes the Local Law 126 parking-structure inspection program (filed/unsafe reports).
OATH/ECB Hearings FDNY fire-protection violations (sprinkler maintenance, inspection/testing failures, compliance status)
AFDC Alt Fuel Stations EV charger locations, port counts. v2.0 broadened the fetch: drops the facility_type pre-filter, adds access=public,private and status=E,P to capture tenant-only / workplace / planned chargers (station count 271 → 1,082).
DOB NOW Electrical Permit Applications Post-2019 electrical permits. v2.0 uses this for the "pending EV install" signal — BBLs with EV-keyword electrical permits filed 2025+ but no AFDC existing-charger listing. Drives the pending-install filter + popup badge.
OpenStreetMap via Overpass API Parking type classification (underground/multi-storey/surface)

v1 also uses NYC Planning Labs Geosearch (PAD-backed) for charger address resolution and the NYC ArcGIS MapPLUTO endpoint for spatial fallback. Both are free and keyless.

All NYC Open Data is free and keyless (Socrata API). AFDC requires a free NREL API key.

Running it yourself

git clone https://github.com/sarahduve/ev-fire-risk.git
cd ev-fire-risk
pip install -r requirements.txt

# Step 1: Fetch raw data (~10 min)
# Downloads PLUTO bulk data, queries DOB permits/violations, resolves chargers
# via PAD. Saves to cached_data.json so you don't have to re-fetch for scoring.
export NREL_API_KEY="your-key-here"
python3 fetch_data.py

# Step 2: Score garages (instant — reads from cache)
# Re-run freely when tweaking scoring weights, labels, or formula
python3 score_garages.py

# Step 3: Build the interactive map (instant)
python3 build_map.py

open ev_fire_risk_map.html

Requires Python 3.10+ and shapely (for point-in-polygon matching fallback).

The fetch/score separation means you only re-run the slow API step when data is stale. Scoring and map changes are instant.

Key limitations

  • Fire suppression data measures maintenance, not capability. DOB digital records start ~1990. "No permits on record" may mean no system, or a system with no recorded maintenance in 35+ years. Either way, it almost certainly doesn't meet the 2022 NFPA OH2 standard (33% higher sprinkler density). See methodology for details.
  • Scoring formula is calibrated for parking-dominant buildings but applied uniformly. An old apartment building with 5,000 sqft of ground-floor parking gets scored the same way as a standalone parking structure. The "no sprinkler permit on record" penalty (+25) is particularly likely to trigger for older non-G-class buildings where permit history may relate to non-parking portions. Interpret non-G-class scores with this caveat.
  • Charger data is a lower bound. AFDC is voluntary and self-reported. Listed garage stations undercount the true number.
  • Underground classification is incomplete. PLUTO basement codes + OSM identify ~200 underground garages. The true number is higher. INRIX has better data but requires enterprise licensing.
  • garagearea is self-reported on PLUTO. Some small ground-floor garages may be under-reported; some large ones may conflate parking with storage/service space.
  • This is not a structural assessment. A high score means risk factors are present — it does not mean a fire will occur or that the building is unsafe.

License

MIT

About

NYC parking garage fire risk scoring for EV charging infrastructure

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages