About this project
San Francisco's rent ordinance covers multi-unit buildings completed before June 1979, and the assessor publishes every parcel's completion year, units and class each year, so the covered stock can be counted rather than estimated. This project counts it for each of the Civic Atlas's 117 neighborhoods, then measures the Rent Board's eviction notices (deduplicated to filings, because a tenth are re-served), buyout agreements and petitions against that stock; net units on building permits against all residential units; and the assessor's reassessments at sale as the one price signal a Prop 13 roll carries. A two-by-two of exits against arrivals was fixed before the numbers were seen, with absolute thresholds, a floor on eligible units, Poisson intervals beside every rate and a written rule for what no finding looks like. The moratorium years are excluded, the roll's one corrupted class is corrected per parcel, and the buildings that file thirty notices in a day are named rather than averaged.
›How this was built
- –Six DataSF datasets and four FRED series, pulled with column selection and streamed page by page into SQLite; the 3.9-million-row assessor roll is pulled one roll year at a time so a run can resume.
- –Every point is tagged to the 117 Civic Atlas neighborhoods by point-in-polygon with sf-civic's own method; the source's 41-name label agreed on 100% of the pilot's rows and is kept as a cross-check.
- –The pre-registered read (window, floor, thresholds, intervals, and what no finding looks like) was written into analysis/pressure.py before it was run. An adversarial audit of the first result corrected two definitions (units rather than building-day filings; one row per permit rather than per address) and one 50,000-unit typo in the roll; the thresholds were left alone and both results are recorded.
- –A gate suite in one harness checks pulls, tagging, the eligibility rule, the corrupted roll class, notice grain, the permit type rule, the sales admission rule, freshness and fingerprints; every analysis file carries the load it was built on and the export refuses a mismatch.
- –Checked against the city's own figures: the covered stock is 1.3% from the Rent Board's published estimate of about 173,000 units (2017), the eviction counts by cause match its annual reports every fiscal year since 2013, and a decade of permitted units sits within 6% of Planning's Housing Inventory; three gates carry those references.
- –The map, projection and ramp are the Civic Atlas's, imported rather than copied; this project's thresholds are its own because the Atlas's clamp would bin every rate below one per thousand as neutral.
- Started
- September 2, 2026
- Last updated
- September 2, 2026
- Delivery
- native
- Tags
- datahousingmapssql