UrbanNestRealty / data /generate_data.py
jaydeb2023
Initial PropBazaar SaaS deployment
ad8fdff
Raw
History Blame Contribute Delete
6.54 kB
"""
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))}")