Spaces:
Sleeping
Sleeping
File size: 6,542 Bytes
ad8fdff | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | """
Generate realistic property listings + insurance + documents data.
Run: python data/generate_data.py
"""
import json, random, sqlite3
from pathlib import Path
from datetime import date, timedelta
random.seed(42)
LOCATIONS = [
"Andheri West","Andheri East","Bandra West","Bandra East",
"Juhu","Versova","Santacruz West","Santacruz East",
"Khar","Vile Parle","Goregaon","Malad","Kandivali",
"Borivali","Dadar","Worli","Lower Parel","Prabhadevi",
"Powai","Vikhroli","Ghatkopar","Mulund","Thane",
"Navi Mumbai","Kharghar","Panvel","Ulwe","Dombivli",
"Kalyan","Mira Road","Vasai","Nalasopara",
]
PREMIUM = {"Bandra West","Juhu","Worli","Lower Parel","Prabhadevi","Khar","Santacruz West"}
BUILDERS = [
"Lodha Group","Godrej Properties","Oberoi Realty","Hiranandani",
"Shapoorji Pallonji","Runwal Group","Rustomjee","Kalpataru",
"L&T Realty","Mahindra Lifespaces","Prestige Group",
"Raymond Realty","Piramal Realty","Tata Housing",
]
PROP_TYPES = ["Apartment","Flat","Villa","Row House","Penthouse","Studio","Duplex"]
FURNISHINGS = ["Fully Furnished","Semi Furnished","Unfurnished"]
STATUSES = ["Ready to Move","Under Construction","Ready to Move","Ready to Move"]
AMENITIES_POOL = [
"Gym","Swimming Pool","Club House","Parking","Security","Power Backup","Lift",
"Garden","Jogging Track","Kids Play Area","Indoor Games","CCTV","Intercom",
"Visitor Parking","Terrace","Co-working Space","Library","Mini Theatre","Pet-friendly",
]
INS_COMPANIES = [
"New India Assurance","HDFC ERGO","Bajaj Allianz","ICICI Lombard",
"National Insurance","Oriental Insurance","United India",
]
INS_STATUSES = ["ACTIVE","ACTIVE","ACTIVE","PENDING","EXPIRED"]
DOCUMENT_TYPES = [
"Sale Agreement","NOC from Society","Occupation Certificate",
"Property Card","Index II","Stamp Duty Receipt","Possession Letter",
"Title Search Report","Encumbrance Certificate","Building Plan Approval",
]
DOC_STATUSES = ["RECEIVED","PENDING","RECEIVED","RECEIVED","MISSING"]
def price_range(bhk, location):
base = {1:(0.45,1.2),2:(0.9,2.5),3:(1.5,4.5),4:(3.0,8.0),5:(6.0,18.0)}
lo,hi = base.get(bhk,(1.0,3.0))
if location in PREMIUM: lo,hi = lo*1.6, hi*2.0
return round(random.uniform(lo,hi),2)
def area_range(bhk):
ranges = {1:(380,550),2:(650,950),3:(1000,1600),4:(1800,3000),5:(3200,6000)}
lo,hi = ranges.get(bhk,(600,1200))
return random.randint(lo,hi)
properties, insurance, documents = [], [], []
pid = 1001
for _ in range(300):
bhk = random.choices([1,2,3,4,5], weights=[15,35,30,15,5])[0]
location = random.choice(LOCATIONS)
ptype = random.choice(PROP_TYPES)
price = price_range(bhk, location)
area = area_range(bhk)
floors = random.randint(10,45)
floor = random.randint(1,floors)
amenities= random.sample(AMENITIES_POOL, k=random.randint(5,12))
furnish = random.choice(FURNISHINGS)
status = random.choice(STATUSES)
builder = random.choice(BUILDERS)
society = f"{builder.split()[0]} {random.choice(['Grandeur','Heights','Residences','Enclave','Greens','Palms','Towers','Estates','Park','Vista','Elysium','Artesia'])}"
age = random.randint(0,15)
ppsf = round((price*100)/(area/100), 0)
city = "Mumbai" if location not in ["Thane","Navi Mumbai","Kharghar","Panvel","Ulwe","Dombivli","Kalyan","Mira Road","Vasai","Nalasopara"] else "MMR"
prop = {
"id": pid,
"title": f"{bhk} BHK {ptype} in {location}",
"bhk": bhk, "type": ptype,
"location": location, "city": city,
"price_cr": price,
"price_display": f"₹{price} Cr",
"area_sqft": area,
"price_per_sqft": int(ppsf),
"floor": floor, "total_floors": floors,
"furnishing": furnish,
"amenities": amenities,
"parking": "Parking" in amenities,
"pool": "Swimming Pool" in amenities,
"age_years": age,
"status": status,
"builder": builder,
"society": society,
"bedrooms": bhk,
"bathrooms": bhk if bhk<=3 else bhk-1,
"balconies": random.randint(1,min(bhk,3)),
"facing": random.choice(["East","West","North","South","North-East","North-West"]),
"listed_days_ago": random.randint(1,90),
"contact": f"+91-9{random.randint(100000000,999999999)}",
"description": (
f"Spacious {bhk} BHK {ptype.lower()} in {society}, {location}. "
f"{'Ready to move. ' if status=='Ready to Move' else 'Under construction. '}"
f"{furnish} unit, {area} sqft, floor {floor}/{floors}. "
f"Key amenities: {', '.join(amenities[:5])}. "
f"Priced at ₹{price} Cr (₹{int(ppsf):,}/sqft). Built by {builder}."
),
"available": True,
"featured": random.random() < 0.1,
}
properties.append(prop)
# Insurance record
ins_status = random.choice(INS_STATUSES)
start = date.today() - timedelta(days=random.randint(10,350))
expiry = start + timedelta(days=365)
insurance.append({
"property_id": pid,
"company": random.choice(INS_COMPANIES),
"policy_no": f"POL-{pid}-{random.randint(10000,99999)}",
"status": ins_status,
"start_date": start.isoformat(),
"expiry_date": expiry.isoformat(),
"premium_annual": random.randint(8000,45000),
"followup_person": random.choice(["Rajan Sharma","Priya Ghosh","Amit Das","Sneha Patil","Rahul Mehta"]),
"followup_contact": f"+91-9{random.randint(100000000,999999999)}",
"notes": random.choice(["Renewal reminder sent","Follow up urgently","Paid","","On hold"]),
})
# 2-4 documents per property
doc_types = random.sample(DOCUMENT_TYPES, k=random.randint(2,5))
for dt in doc_types:
documents.append({
"property_id": pid,
"document_type": dt,
"status": random.choice(DOC_STATUSES),
"received_date": (date.today() - timedelta(days=random.randint(0,180))).isoformat() if random.random()>0.3 else None,
"notes": "",
})
pid += 1
# Save JSON
DATA_DIR = Path(__file__).parent
(DATA_DIR / "properties.json").write_text(json.dumps(properties, indent=2))
print(f"Generated {len(properties)} properties, {len(insurance)} insurance records, {len(documents)} documents")
print(f"Price range: ₹{min(p['price_cr'] for p in properties)} – ₹{max(p['price_cr'] for p in properties)} Cr")
print(f"Locations: {len(set(p['location'] for p in properties))}")
|