MatteoScript commited on
Commit
2de02e2
·
verified ·
1 Parent(s): fd6bb30

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +119 -80
app.py CHANGED
@@ -8,10 +8,6 @@ from collections import namedtuple
8
  import numpy as np
9
  import streamlit as st
10
  from groq import Groq
11
- from dotenv import load_dotenv
12
- import os
13
- load_dotenv()
14
- API_GROQ = os.getenv('API_GROQ')
15
 
16
  def clean_text(text):
17
  return re.sub(r'\s+', ' ', text).strip()
@@ -83,7 +79,7 @@ def extract_info(provincia, comune, prezzo_medio_mq, listing):
83
  def scrape_immobiliare(provincia, comune, prezzo_medio_mq, prezzo_minimo, prezzo_massimo, locali_minimo, locali_massimo):
84
  print(provincia + " " + comune + " " + prezzo_medio_mq)
85
  comune_url = comune.replace(" ", "-")
86
- if tipologia_case == "Asta Immobiliare":
87
  tipologia_url = "aste-immobiliari"
88
  else:
89
  tipologia_url = "vendita-case"
@@ -131,52 +127,14 @@ def get_elenco_comuni(provincia):
131
  })
132
  return results
133
 
134
- st.set_page_config(layout="wide")
135
- st.title('🏠 Immobiliare A.I. ')
136
- st.write("##### Il tuo assistente di intelligenza artificiale per la ricerca di occasioni immobiliari")
137
- with st.expander("Informazioni"):
138
- st.write("Immobiliare A.I. è la webapp che semplifica la ricerca di immobili, grazie a algoritmi avanzati che calcolano il vantaggio di ogni offerta. Trova le migliori occasioni sul mercato con analisi precise e personalizzate. Scopri l’immobile giusto per te con facilità e sicurezza!")
139
-
140
  cerca_premuto = False
141
  comuni_provincia = {}
142
 
143
- with st.sidebar:
144
- if "numero_immobili_validi" not in st.session_state:
145
- st.numero_immobili_validi = 0
146
- comuni_provincia_Brescia = get_elenco_comuni('Brescia')
147
- comuni_provincia_Bergamo = get_elenco_comuni('Bergamo')
148
- comuni_provincia = comuni_provincia_Brescia + comuni_provincia_Bergamo
149
- st.title("Filtri")
150
-
151
- tipologia_case = st.selectbox("Tipologia", ("Acquisto Immobile", "Asta Immobiliare"))
152
- elenco = [d['comune'] for d in comuni_provincia]
153
- comune_input = st.multiselect(
154
- "Comuni",
155
- elenco
156
- )
157
- prezzo_minimo = st.sidebar.slider("Prezzo Minimo (k)", min_value=0, max_value=1000, value=200)
158
- prezzo_massimo = st.sidebar.slider("Prezzo Massimo (k)", min_value=0, max_value=1000, value=230)
159
- locali = list(range(1, 21)) # Intervallo da 1 a 10
160
- locali_range = st.sidebar.select_slider(
161
- "Locali",
162
- options=locali,
163
- value=(locali[2], locali[4]) # Valore iniziale, da 1 a 5 locali
164
- )
165
- mostra_grafici = st.toggle("Mostra grafici", value = True)
166
-
167
- modello_ai = st.selectbox("Modello A.I.", ("Llama 3.1", "Mixtral 7x8b"))
168
- analisi_ai = st.toggle("Analizza i dati tramite l'A.I.", value = True)
169
-
170
- locali_minimo, locali_massimo = locali_range
171
- prezzo_minimo = prezzo_minimo*1000
172
- prezzo_massimo = prezzo_massimo*1000
173
- cerca_premuto = st.button("Cerca", use_container_width=True, type='primary')
174
-
175
- def scrivi_dataframe(output, riepilogo):
176
  if len(output) > 0:
177
  st.numero_immobili_validi = st.numero_immobili_validi + 1
178
  if not riepilogo:
179
- st.write(f"### {comune_provincia['comune']}")
180
  df = pd.DataFrame(output)
181
  df_originale = df.sort_values(by=["Vantaggio", "PrezzoMq"], ascending=[False, True])
182
  if not riepilogo:
@@ -189,7 +147,7 @@ def scrivi_dataframe(output, riepilogo):
189
  vantaggioso_count = df_originale["Vantaggioso"].sum()
190
  total_rows = df_originale.shape[0]
191
 
192
- if mostra_grafici:
193
  col1, col2, col3 = st.columns(3)
194
  with col1:
195
  vantaggioso_count = df_originale["Vantaggioso"].sum()
@@ -238,11 +196,12 @@ def scrivi_dataframe(output, riepilogo):
238
  "Locali": "Locali",
239
  "Link": st.column_config.LinkColumn("App URL")
240
  })
241
- st.write(f"Riepilogando nel comune {comune_provincia['comune']} sono presenti **{vantaggioso_count} Immobili vantaggiosi** rispetto ai {total_rows} totali")
242
  st.divider()
243
 
244
- def analizza_dati_ai(output, tipologia):
245
- client = Groq(api_key=API_GROQ)
 
246
  if tipologia == 1:
247
  prompt_messages = [
248
  {
@@ -304,34 +263,114 @@ def analizza_dati_ai(output, tipologia):
304
  response_area.markdown(response_text + "▌")
305
  response_area.markdown(response_text)
306
 
307
- if cerca_premuto:
308
- if len(comune_input)>0:
309
- comuni_selezionati = comune_input
310
- comuni_selezionati = [comune.upper() for comune in comuni_selezionati]
311
- output = []
312
- output_singolo = []
313
- for comune_provincia in comuni_provincia:
314
- if comune_provincia['comune'].upper() in comuni_selezionati:
315
- with st.spinner(f"Ricerca Immobili Comune: {comune_provincia['comune']}"):
316
- output_singolo = json.loads(scrape_immobiliare(comune_provincia['provincia'],
317
- comune_provincia['comune'],
318
- comune_provincia['prezzo'],
319
- prezzo_minimo,
320
- prezzo_massimo,
321
- locali_minimo,
322
- locali_massimo))
323
- scrivi_dataframe(output_singolo, False)
324
- output += output_singolo
325
- if len(comuni_selezionati)>1 and st.numero_immobili_validi>1:
326
- st.write(f"### Comuni Selezionati")
327
- scrivi_dataframe(output, True)
328
- if st.numero_immobili_validi > 0 and analisi_ai:
329
- st.title("✨ Analisi Intelligenza Artificiale")
330
- st.write("### Considerazioni")
331
- analizza_dati_ai(output, 1)
332
- #st.divider()
333
- #st.write("### Dettagliata")
334
- #analizza_dati_ai(output, 2)
335
- st.success("Elaborazione Completata")
336
- else:
337
- st.error("Per favore, inserisci il nome di un comune.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  import numpy as np
9
  import streamlit as st
10
  from groq import Groq
 
 
 
 
11
 
12
  def clean_text(text):
13
  return re.sub(r'\s+', ' ', text).strip()
 
79
  def scrape_immobiliare(provincia, comune, prezzo_medio_mq, prezzo_minimo, prezzo_massimo, locali_minimo, locali_massimo):
80
  print(provincia + " " + comune + " " + prezzo_medio_mq)
81
  comune_url = comune.replace(" ", "-")
82
+ if st.tipologia_case == "Asta Immobiliare":
83
  tipologia_url = "aste-immobiliari"
84
  else:
85
  tipologia_url = "vendita-case"
 
127
  })
128
  return results
129
 
 
 
 
 
 
 
130
  cerca_premuto = False
131
  comuni_provincia = {}
132
 
133
+ def scrivi_dataframe(output, riepilogo, comune):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  if len(output) > 0:
135
  st.numero_immobili_validi = st.numero_immobili_validi + 1
136
  if not riepilogo:
137
+ st.write(f"### {comune}")
138
  df = pd.DataFrame(output)
139
  df_originale = df.sort_values(by=["Vantaggio", "PrezzoMq"], ascending=[False, True])
140
  if not riepilogo:
 
147
  vantaggioso_count = df_originale["Vantaggioso"].sum()
148
  total_rows = df_originale.shape[0]
149
 
150
+ if st.mostra_grafici:
151
  col1, col2, col3 = st.columns(3)
152
  with col1:
153
  vantaggioso_count = df_originale["Vantaggioso"].sum()
 
196
  "Locali": "Locali",
197
  "Link": st.column_config.LinkColumn("App URL")
198
  })
199
+ st.write(f"Riepilogando nel comune {comune} sono presenti **{vantaggioso_count} Immobili vantaggiosi** rispetto ai {total_rows} totali")
200
  st.divider()
201
 
202
+ def analizza_dati_ai(output, tipologia):
203
+ Ak = "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"
204
+ client = Groq(api_key=Ak)
205
  if tipologia == 1:
206
  prompt_messages = [
207
  {
 
263
  response_area.markdown(response_text + "▌")
264
  response_area.markdown(response_text)
265
 
266
+ def inizializza():
267
+ if 'logged_in' not in st.session_state:
268
+ st.session_state['logged_in'] = False
269
+ if "numero_immobili_validi" not in st.session_state:
270
+ st.numero_immobili_validi = 0
271
+ if 'tipologia_case' not in st.session_state:
272
+ st.session_state['tipologia_case'] = ''
273
+ if 'mostra_grafici' not in st.session_state:
274
+ st.session_state['mostra_grafici'] = False
275
+ if 'analisi_ai' not in st.session_state:
276
+ st.session_state['analisi_ai'] = False
277
+ if 'modello_ai' not in st.session_state:
278
+ st.session_state['modello_ai'] = ''
279
+
280
+ def main():
281
+ st.title('🏠 Immobiliare A.I. ')
282
+ st.write("##### Il tuo assistente di intelligenza artificiale per la ricerca di occasioni immobiliari")
283
+ with st.expander("Informazioni"):
284
+ st.write("Immobiliare A.I. è la webapp che semplifica la ricerca di immobili, grazie a algoritmi avanzati che calcolano il vantaggio di ogni offerta. Trova le migliori occasioni sul mercato con analisi precise e personalizzate. Scopri l’immobile giusto per te con facilità e sicurezza!")
285
+
286
+ with st.sidebar:
287
+ comuni_provincia_Brescia = get_elenco_comuni('Brescia')
288
+ comuni_provincia_Bergamo = get_elenco_comuni('Bergamo')
289
+ comuni_provincia = comuni_provincia_Brescia + comuni_provincia_Bergamo
290
+ st.title("Filtri")
291
+
292
+ st.tipologia_case = st.selectbox("Tipologia", ("Acquisto Immobile", "Asta Immobiliare"))
293
+ elenco = [d['comune'] for d in comuni_provincia]
294
+ comune_input = st.multiselect(
295
+ "Comuni",
296
+ elenco
297
+ )
298
+ prezzo_minimo = st.sidebar.slider("Prezzo Minimo (k)", min_value=0, max_value=1000, value=200)
299
+ prezzo_massimo = st.sidebar.slider("Prezzo Massimo (k)", min_value=0, max_value=1000, value=230)
300
+ locali = list(range(1, 21)) # Intervallo da 1 a 10
301
+ locali_range = st.sidebar.select_slider(
302
+ "Locali",
303
+ options=locali,
304
+ value=(locali[2], locali[4]) # Valore iniziale, da 1 a 5 locali
305
+ )
306
+ st.mostra_grafici = st.toggle("Mostra grafici", value = True)
307
+
308
+ st.modello_ai = st.selectbox("Modello A.I.", ("Llama 3.1", "Mixtral 7x8b"))
309
+ st.analisi_ai = st.toggle("Analizza i dati tramite l'A.I.", value = True)
310
+
311
+ locali_minimo, locali_massimo = locali_range
312
+ prezzo_minimo = prezzo_minimo*1000
313
+ prezzo_massimo = prezzo_massimo*1000
314
+ cerca_premuto = st.button("Cerca", use_container_width=True, type='primary')
315
+
316
+ if cerca_premuto:
317
+ if len(comune_input)>0:
318
+ comuni_selezionati = comune_input
319
+ comuni_selezionati = [comune.upper() for comune in comuni_selezionati]
320
+ output = []
321
+ output_singolo = []
322
+ for comune_provincia in comuni_provincia:
323
+ if comune_provincia['comune'].upper() in comuni_selezionati:
324
+ with st.spinner(f"Ricerca Immobili Comune: {comune_provincia['comune']}"):
325
+ output_singolo = json.loads(scrape_immobiliare(comune_provincia['provincia'],
326
+ comune_provincia['comune'],
327
+ comune_provincia['prezzo'],
328
+ prezzo_minimo,
329
+ prezzo_massimo,
330
+ locali_minimo,
331
+ locali_massimo))
332
+ scrivi_dataframe(output_singolo, False, comune_provincia['comune'])
333
+ output += output_singolo
334
+ if len(comuni_selezionati)>1 and st.numero_immobili_validi>1:
335
+ st.write(f"### Comuni Selezionati")
336
+ scrivi_dataframe(output, True, '')
337
+ if st.numero_immobili_validi > 0 and st.analisi_ai:
338
+ st.title("✨ Analisi Intelligenza Artificiale")
339
+ st.write("### Considerazioni")
340
+ analizza_dati_ai(output, 1)
341
+ #st.divider()
342
+ #st.write("### Dettagliata")
343
+ #analizza_dati_ai(output, 2)
344
+ st.success("Elaborazione Completata")
345
+ else:
346
+ st.error("Per favore, inserisci il nome di un comune.")
347
+
348
+ def login_page():
349
+ login_container = st.empty()
350
+ with login_container:
351
+ log1, log2, log3 = st.columns([1.5, 3, 1.5])
352
+ with log2:
353
+ st.title('🏠 Immobiliare A.I. ')
354
+ st.write("")
355
+ USERNAME = st.secrets["login"]["username"]
356
+ PASSWORD = st.secrets["login"]["password"]
357
+
358
+ with st.form(key='login_form'):
359
+ username_input = st.text_input('Username')
360
+ password_input = st.text_input('Password', type='password')
361
+ login_button = st.form_submit_button('Login')
362
+
363
+ if login_button:
364
+ if username_input == USERNAME and password_input == PASSWORD:
365
+ st.session_state['logged_in'] = True
366
+ login_container.empty()
367
+ else:
368
+ st.error("Username o password errati")
369
+
370
+ if __name__ == '__main__':
371
+ inizializza()
372
+ st.set_page_config(layout='wide')
373
+ if not st.session_state['logged_in']:
374
+ login_page()
375
+ if st.session_state['logged_in']:
376
+ main()