← back to Commercialrealestate
scripts/export-deals-flow.py
30 lines
#!/usr/bin/env python3
# export-deals-flow.py — curate the RESELLABLE deal-flow JSON for public/deals-flow.html from the
# public-record derived_sale table (assessor Prop-13). Source-stamped per row (docs/SOURCING.md +
# always-document-source). $0, local. -> data/deals-flow.json
import sqlite3, json, os
DB=os.path.join(os.path.dirname(__file__),'..','data','assessor.sqlite')
OUT=os.path.join(os.path.dirname(__file__),'..','data','deals-flow.json')
c=sqlite3.connect(DB)
rows=c.execute("""
SELECT ain,address,use_desc,units,year_built,transfer_date,transfer_year,
assessed_value,est_sale_price,confidence
FROM derived_sale
WHERE transfer_year>=2022 AND est_sale_price IS NOT NULL
AND (
(units>=2 AND est_sale_price>=500000) -- multifamily
OR (est_sale_price>=1000000 AND lower(use_desc) IN ('commercial','industrial','institutional','recreational')) -- commercial/industrial/etc
)
ORDER BY transfer_date DESC, est_sale_price DESC
LIMIT 22000
""").fetchall()
deals=[{'ain':r[0],'address':r[1],'use':r[2],'units':r[3],'year_built':r[4],
'date':r[5],'year':r[6],'assessed':r[7],'price':r[8],'confidence':r[9],
'source':'LA County Assessor (Prop-13 reassessment)','source_type':'public-record','kind':'county-sale'} for r in rows]
json.dump({'generated':'2026-07-31','source':'LA County Assessor roll (public, resellable)','count':len(deals),'deals':deals},open(OUT,'w'))
from collections import Counter
byuse=Counter(d['use'] or '(none)' for d in deals)
print(f'deals-flow.json: {len(deals):,} curated county deals (multifamily + commercial/industrial, 2022+)')
print(' by use:', dict(byuse.most_common(6)))
c.close()