Denisijcu commited on
Commit
418bcc2
·
verified ·
1 Parent(s): bbcb30c

upload app.py

Browse files
Files changed (1) hide show
  1. app.py +352 -0
app.py ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🏠 MiamiHomeAI - Real Estate Price Predictor for Hugging Face Spaces
2
+ # AI-powered Miami real estate price prediction
3
+
4
+ import gradio as gr
5
+ import pandas as pd
6
+ import numpy as np
7
+ from sklearn.ensemble import RandomForestRegressor
8
+ import joblib
9
+ from pathlib import Path
10
+ import json
11
+
12
+ print("🏠 MiamiHomeAI iniciando...")
13
+
14
+ # Configuración
15
+ ZONES = [
16
+ 'Beachfront', 'Coastal', 'Downtown', 'Suburban', 'Waterfront',
17
+ 'Premium', 'Luxury', 'Urban', 'Residential', 'Commercial'
18
+ ]
19
+
20
+ FLOOD_ZONES = ['X', 'AE', 'VE', 'AH', 'AO']
21
+
22
+ class FeatureEngineer:
23
+ """Feature engineering para el modelo de precios"""
24
+
25
+ @staticmethod
26
+ def create_features(data):
27
+ """Crear las mismas características que en el entrenamiento"""
28
+ df = data.copy()
29
+
30
+ # Características básicas
31
+ df['Size_per_Room'] = df['Size'] / (df['Rooms'] + 1e-6)
32
+ df['Bathroom_Ratio'] = df['Bathrooms'] / (df['Rooms'] + 1e-6)
33
+ df['Is_New'] = (df['Age'] < 3).astype(int)
34
+ df['Is_Renovated'] = ((df['Age'] > 20) & (df['Age'] < 25)).astype(int)
35
+
36
+ # Transformaciones no lineales
37
+ df['Log_Size'] = np.log1p(df['Size'])
38
+ df['Sqrt_Beach_Distance'] = np.sqrt(df['Beach_Distance'] + 1)
39
+ df['Inverse_Beach_Distance'] = 1 / (df['Beach_Distance'] + 0.1)
40
+
41
+ # Características geográficas
42
+ coastal_zones = ['Beachfront', 'Coastal', 'Waterfront']
43
+ df['Coastal_Zone'] = df['Zone'].apply(
44
+ lambda x: 1 if any(zone in str(x) for zone in coastal_zones) else 0
45
+ )
46
+ df['Premium_Zone'] = df['Zone'].apply(
47
+ lambda x: 1 if any(term in str(x) for term in ['Premium', 'Luxury']) else 0
48
+ )
49
+
50
+ # Codificación de flood zone
51
+ flood_risk_mapping = {'X': 0, 'AE': 1, 'VE': 2, 'AH': 1, 'AO': 1}
52
+ df['Flood_Risk'] = df['Flood_Zone'].map(flood_risk_mapping).fillna(0)
53
+
54
+ # Interacciones
55
+ df['Size_Flood_Risk'] = df['Size'] * df['Flood_Risk']
56
+ df['Coastal_Beach_Interaction'] = df['Coastal_Zone'] * df['Inverse_Beach_Distance']
57
+
58
+ return df
59
+
60
+ def load_model():
61
+ """Cargar modelo entrenado o crear modelo demo"""
62
+ model_files = [
63
+ "miami_premium_model_v2.joblib",
64
+ "miami_premium_model.joblib",
65
+ "miami_model.joblib",
66
+ "real_estate_model.joblib"
67
+ ]
68
+
69
+ for file_name in model_files:
70
+ if Path(file_name).exists():
71
+ try:
72
+ model_data = joblib.load(file_name)
73
+ if isinstance(model_data, dict) and 'model' in model_data:
74
+ print(f"✅ Modelo cargado: {file_name}")
75
+ return model_data['model'], True, model_data.get('metadata', {})
76
+ else:
77
+ print(f"✅ Modelo simple cargado: {file_name}")
78
+ return model_data, True, {}
79
+ except Exception as e:
80
+ print(f"❌ Error cargando {file_name}: {e}")
81
+ continue
82
+
83
+ print("⚠️ Modelo no encontrado, usando predicciones demo")
84
+ return None, False, {}
85
+
86
+ # Cargar modelo
87
+ model, model_loaded, metadata = load_model()
88
+
89
+ def predict_price(size, rooms, bathrooms, age, zone, school_rating, beach_distance, flood_zone):
90
+ """Predecir precio de la propiedad"""
91
+
92
+ try:
93
+ # Crear DataFrame con los inputs
94
+ input_data = pd.DataFrame({
95
+ 'Size': [size],
96
+ 'Rooms': [rooms],
97
+ 'Bathrooms': [bathrooms],
98
+ 'Age': [age],
99
+ 'Zone': [zone],
100
+ 'School_Rating': [school_rating],
101
+ 'Beach_Distance': [beach_distance],
102
+ 'Flood_Zone': [flood_zone]
103
+ })
104
+
105
+ if model_loaded and model is not None:
106
+ # Aplicar feature engineering
107
+ features_df = FeatureEngineer.create_features(input_data)
108
+
109
+ # Realizar predicción
110
+ try:
111
+ predicted_price = model.predict(features_df)[0]
112
+ confidence = "Alta" if model_loaded else "Demo"
113
+
114
+ # Formatear precio
115
+ price_formatted = f"${predicted_price:,.0f}"
116
+
117
+ # Análisis de factores
118
+ analysis = analyze_property_factors(
119
+ size, rooms, bathrooms, age, zone,
120
+ school_rating, beach_distance, flood_zone, predicted_price
121
+ )
122
+
123
+ result = f"""
124
+ 🏠 **PREDICCIÓN DE PRECIO - MIAMIHOMEAI**
125
+
126
+ 💰 **Precio Estimado: {price_formatted}**
127
+ 🎯 **Confianza: {confidence}**
128
+
129
+ {analysis}
130
+
131
+ 📊 **Detalles de la Propiedad:**
132
+ • 📐 Tamaño: {size:,} ft²
133
+ • 🏠 Habitaciones: {rooms}
134
+ • 🚿 Baños: {bathrooms}
135
+ • 📅 Edad: {age} años
136
+ • 🌍 Zona: {zone}
137
+ • 🎓 Rating Escolar: {school_rating}/10
138
+ • 🏖️ Distancia a Playa: {beach_distance} millas
139
+ • 🌊 Zona de Inundación: {flood_zone}
140
+
141
+ 🤖 **Modelo entrenado con técnicas avanzadas de ML**
142
+ """
143
+
144
+ except Exception as e:
145
+ result = f"❌ Error en predicción: {str(e)}"
146
+
147
+ else:
148
+ # Predicción demo
149
+ base_price = 300000
150
+ price_per_sqft = 200 + (school_rating * 20)
151
+ zone_multiplier = get_zone_multiplier(zone)
152
+ beach_bonus = max(0, (5 - beach_distance) * 50000)
153
+ age_penalty = age * 2000
154
+
155
+ demo_price = (base_price +
156
+ (size * price_per_sqft * zone_multiplier) +
157
+ beach_bonus - age_penalty)
158
+
159
+ price_formatted = f"${demo_price:,.0f}"
160
+
161
+ result = f"""
162
+ 🏠 **PREDICCIÓN DEMO - MIAMIHOMEAI**
163
+
164
+ 💰 **Precio Estimado: {price_formatted}**
165
+ 🎯 **Confianza: DEMO**
166
+
167
+ ⚠️ **MODO DEMOSTRACIÓN**
168
+ Esta es una predicción simulada para mostrar la funcionalidad.
169
+ Para predicciones reales, carga el modelo entrenado.
170
+
171
+ 📊 **Factores considerados:**
172
+ • Tamaño de la propiedad
173
+ • Calificación escolar
174
+ • Proximidad a la playa
175
+ • Zona de ubicación
176
+ • Edad de la propiedad
177
+
178
+ 🤖 **Sube tu modelo entrenado para predicciones reales**
179
+ """
180
+
181
+ return result
182
+
183
+ except Exception as e:
184
+ return f"❌ Error procesando datos: {str(e)}"
185
+
186
+ def get_zone_multiplier(zone):
187
+ """Obtener multiplicador por zona"""
188
+ multipliers = {
189
+ 'Luxury': 2.5,
190
+ 'Premium': 2.0,
191
+ 'Beachfront': 1.8,
192
+ 'Waterfront': 1.6,
193
+ 'Coastal': 1.4,
194
+ 'Downtown': 1.2,
195
+ 'Urban': 1.0,
196
+ 'Suburban': 0.9,
197
+ 'Residential': 0.8,
198
+ 'Commercial': 0.7
199
+ }
200
+ return multipliers.get(zone, 1.0)
201
+
202
+ def analyze_property_factors(size, rooms, bathrooms, age, zone, school_rating, beach_distance, flood_zone, price):
203
+ """Analizar factores que influyen en el precio"""
204
+
205
+ factors = []
206
+
207
+ # Análisis de tamaño
208
+ if size > 3000:
209
+ factors.append("🏰 **Propiedad grande** - Aumenta significativamente el valor")
210
+ elif size < 1200:
211
+ factors.append("🏠 **Propiedad compacta** - Precio más accesible")
212
+
213
+ # Análisis de ubicación
214
+ if any(term in zone for term in ['Beachfront', 'Waterfront']):
215
+ factors.append("🏖️ **Ubicación premium** - Vista al agua incrementa valor")
216
+ elif 'Luxury' in zone or 'Premium' in zone:
217
+ factors.append("💎 **Zona de lujo** - Área exclusiva con precios elevados")
218
+
219
+ # Análisis de proximidad a playa
220
+ if beach_distance < 1:
221
+ factors.append("🌊 **Muy cerca de la playa** - Excelente ubicación costera")
222
+ elif beach_distance > 5:
223
+ factors.append("🚗 **Lejos de la playa** - Precio más moderado")
224
+
225
+ # Análisis de edad
226
+ if age < 5:
227
+ factors.append("✨ **Propiedad nueva** - Sin depreciación por edad")
228
+ elif age > 30:
229
+ factors.append("🔧 **Propiedad madura** - Posible necesidad de renovación")
230
+
231
+ # Análisis escolar
232
+ if school_rating >= 8:
233
+ factors.append("🎓 **Excelentes escuelas** - Muy atractivo para familias")
234
+ elif school_rating < 5:
235
+ factors.append("📚 **Escuelas básicas** - Factor que reduce el valor")
236
+
237
+ if not factors:
238
+ factors.append("📊 **Propiedad estándar** - Características promedio del mercado")
239
+
240
+ return "\n".join([f"• {factor}" for factor in factors])
241
+
242
+ print("✅ MiamiHomeAI listo!")
243
+
244
+ # Crear interfaz Gradio
245
+ interface = gr.Interface(
246
+ fn=predict_price,
247
+ inputs=[
248
+ gr.Slider(
249
+ minimum=500, maximum=10000, value=2000, step=50,
250
+ label="🏠 Tamaño (ft²)",
251
+ info="Superficie total de la propiedad"
252
+ ),
253
+ gr.Slider(
254
+ minimum=1, maximum=10, value=3, step=1,
255
+ label="🛏️ Habitaciones",
256
+ info="Número total de habitaciones"
257
+ ),
258
+ gr.Slider(
259
+ minimum=1, maximum=8, value=2, step=0.5,
260
+ label="🚿 Baños",
261
+ info="Número de baños completos y medios"
262
+ ),
263
+ gr.Slider(
264
+ minimum=0, maximum=50, value=10, step=1,
265
+ label="📅 Edad (años)",
266
+ info="Años desde la construcción"
267
+ ),
268
+ gr.Dropdown(
269
+ choices=ZONES, value="Coastal",
270
+ label="🌍 Zona",
271
+ info="Ubicación geográfica de la propiedad"
272
+ ),
273
+ gr.Slider(
274
+ minimum=1, maximum=10, value=7, step=0.1,
275
+ label="🎓 Rating Escolar",
276
+ info="Calificación promedio de escuelas cercanas (1-10)"
277
+ ),
278
+ gr.Slider(
279
+ minimum=0, maximum=20, value=2, step=0.1,
280
+ label="🏖️ Distancia a Playa (millas)",
281
+ info="Distancia a la playa más cercana"
282
+ ),
283
+ gr.Dropdown(
284
+ choices=FLOOD_ZONES, value="X",
285
+ label="🌊 Zona de Inundación",
286
+ info="Clasificación FEMA de riesgo de inundación"
287
+ )
288
+ ],
289
+ outputs=gr.Textbox(
290
+ label="💰 Predicción de Precio",
291
+ lines=15,
292
+ show_copy_button=True
293
+ ),
294
+ title="🏠 MiamiHomeAI - Predictor de Precios Inmobiliarios",
295
+ description="""
296
+ **🎯 Inteligencia Artificial para predicción de precios inmobiliarios en Miami**
297
+
298
+ Obtén estimaciones precisas del valor de propiedades basadas en:
299
+ 📐 Características físicas • 🌍 Ubicación geográfica • 🎓 Calidad educativa • 🏖️ Proximidad costera
300
+
301
+ Desarrollado con técnicas avanzadas de Machine Learning
302
+ """,
303
+ article="""
304
+ ### 🏖️ Sobre el Mercado Inmobiliario de Miami
305
+
306
+ Miami es uno de los mercados inmobiliarios más dinámicos de Estados Unidos, caracterizado por:
307
+
308
+ **🌊 Factores Clave del Precio:**
309
+ - **Proximidad a la playa**: Las propiedades costeras pueden valer 2-3x más
310
+ - **Zona de ubicación**: Áreas como South Beach, Brickell, y Coral Gables son premium
311
+ - **Riesgo de inundación**: Factor crítico en una ciudad costera
312
+ - **Calidad escolar**: Influye significativamente en el valor residencial
313
+
314
+ **📊 Características del Modelo:**
315
+ - **Algoritmos**: Random Forest, XGBoost, LightGBM, Stacking Ensemble
316
+ - **Feature Engineering**: 15+ características derivadas automáticamente
317
+ - **Validación**: Cross-validation y división estratificada por precio
318
+ - **Precisión**: Optimizado para el mercado específico de Miami
319
+
320
+ **🎯 Casos de Uso:**
321
+ - **🏡 Compradores**: Evaluar si un precio es justo
322
+ - **🏢 Agentes**: Pricing automático de propiedades
323
+ - **💼 Inversores**: Análisis de oportunidades de inversión
324
+ - **🏦 Bancos**: Evaluación para préstamos hipotecarios
325
+
326
+ **⚠️ Disclaimers:**
327
+ - Las predicciones son estimaciones basadas en datos históricos
328
+ - El mercado inmobiliario puede fluctuar por factores externos
329
+ - Consulta siempre con profesionales inmobiliarios locales
330
+
331
+ ### 🔧 Tecnología
332
+ **Framework:** Scikit-learn, XGBoost, LightGBM • **UI:** Gradio • **Deploy:** Hugging Face Spaces
333
+
334
+ ---
335
+
336
+ **🏠 Desarrollado con ❤️ para el mercado inmobiliario de Miami**
337
+ """,
338
+ examples=[
339
+ [2500, 3, 2, 5, "Beachfront", 8.5, 0.5, "X"],
340
+ [1800, 2, 2, 15, "Downtown", 7.0, 3.0, "AE"],
341
+ [4000, 4, 3, 2, "Luxury", 9.0, 0.2, "X"],
342
+ [1200, 1, 1, 25, "Suburban", 6.0, 8.0, "VE"]
343
+ ],
344
+ cache_examples=False,
345
+ theme="default"
346
+ )
347
+
348
+ # Lanzar aplicación
349
+ if __name__ == "__main__":
350
+ print("🌐 Lanzando MiamiHomeAI...")
351
+ interface.launch()
352
+ print("🎉 ¡MiamiHomeAI lanzado exitosamente!")