← 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()