Spaces:
Sleeping
Sleeping
import requests | |
from bs4 import BeautifulSoup | |
import json | |
import re | |
import pandas as pd | |
from io import BytesIO | |
from collections import namedtuple | |
import numpy as np | |
import streamlit as st | |
import os | |
from groq import Groq | |
import time | |
from openpyxl import load_workbook | |
def clean_text(text): | |
return re.sub(r'\s+', ' ', text).strip() | |
def formatta_numero(stringa): | |
stringa = stringa.split(',')[0] | |
stringa = stringa.replace(".", "").replace("da", "").replace("€", "").replace("%","").replace("m²", "").replace("locali", "").replace("+", "").strip() | |
stringa = stringa.split(' ')[0] | |
if not stringa: | |
stringa = 0 | |
return stringa | |
# Estrae le informazioni dagli ANNUNCI | |
def extract_info(provincia, comune, prezzo_medio_mq, listing): | |
info = {} | |
superficie = "" | |
locali = "" | |
info['Provincia'] = provincia | |
info['Comune'] = comune | |
price_elem = listing.find('div', class_='in-listingCardPrice') | |
prezzo = clean_text(price_elem.text) if price_elem else "" | |
link_elem = listing.find('a', class_='in-listingCardTitle') | |
if link_elem: | |
link = link_elem['href'] | |
titolo = link_elem.text.strip() | |
feature_list = listing.find('div', class_='in-listingCardFeatureList') | |
if feature_list: | |
for item in feature_list.find_all('div', class_='in-listingCardFeatureList__item'): | |
use_elem = item.find('use', class_='nd-icon__use') | |
if use_elem: | |
if use_elem.get('xlink:href') == '#planimetry': | |
locali = item.find('span').text.strip() | |
elif use_elem.get('xlink:href') == '#size': | |
superficie = item.find('span').text.strip() | |
image_url = "" | |
img = listing.find('figure', class_='nd-figure nd-ratio in-photo') | |
if img: | |
image_url = img.find('img')['src'] | |
superficie = formatta_numero(superficie) | |
locali = formatta_numero(locali) | |
prezzo = formatta_numero(prezzo) | |
prezzo_medio_mq = formatta_numero(prezzo_medio_mq) | |
info['Immagine'] = image_url | |
info['Titolo'] = titolo | |
info['Prezzo'] = int(prezzo) | |
info['Superficie'] = int(superficie) | |
try: | |
prezzo_numerico = int(prezzo) | |
superficie_numerica = int(superficie) | |
info['PrezzoMq'] = prezzo_numerico // superficie_numerica | |
prezzo_medio_mq = formatta_numero(prezzo_medio_mq) | |
prezzo_medio_mq_numerico = int(prezzo_medio_mq) | |
differenza = prezzo_medio_mq_numerico - info['PrezzoMq'] | |
vantaggio = (differenza / prezzo_medio_mq_numerico) * 100 | |
vantaggio = max(0, vantaggio) | |
vantaggio = int(vantaggio) | |
except (ValueError, ZeroDivisionError): | |
info['PrezzoMq'] = 0 | |
vantaggio = 0 | |
info['Locali'] = int(locali) | |
info['Link'] = link | |
info['PrezzoMedioMq'] = int(prezzo_medio_mq) | |
info['Vantaggio'] = vantaggio | |
if info['PrezzoMq']< int(prezzo_medio_mq) and info['PrezzoMq']>0: | |
info['Vantaggioso'] = True | |
else: | |
info['Vantaggioso'] = False | |
return info | |
def normalize_title(title): | |
return title.lower().replace(',', '').replace('.', '').replace(' ', ' ').replace(' n ', ' ').replace('V. ', 'via ').strip() | |
# Legge gli ANNUNCI (pagina x pagina) sulla base del COMUNE di appartenenza | |
def scrape_immobiliare(provincia, comune, prezzo_medio_mq, prezzo_minimo, prezzo_massimo, locali_minimo, locali_massimo): | |
print(provincia + " " + comune + " " + prezzo_medio_mq) | |
comune_url = comune.replace(" ", "-").replace("è", "e").replace("é", "e").replace("ò", "o").replace("à", "a").replace("ù", "u").replace("ì", "i").replace("'", "-") | |
if st.tipologia_case == "Asta Immobiliare": | |
tipologia_url = "aste-immobiliari" | |
else: | |
tipologia_url = "vendita-case" | |
base_url = f"https://www.immobiliare.it/{tipologia_url}/{comune_url}/?prezzoMinimo={prezzo_minimo}&prezzoMassimo={prezzo_massimo}&localiMinimo={locali_minimo}&localiMassimo={locali_massimo}&random=123456" | |
results = [] | |
page = 1 | |
url = base_url | |
while True: | |
print(f'Elaborazione pagina {page}') | |
try: | |
response = requests.get(url, allow_redirects=True, timeout=10) | |
soup = BeautifulSoup(response.content, 'html.parser') | |
listings = soup.find_all('li', class_='nd-list__item in-searchLayoutListItem') | |
if not listings: | |
break | |
for listing in listings: | |
results.append(extract_info(provincia, comune, prezzo_medio_mq, listing)) | |
pagination = soup.find('div', class_='in-pagination__list') | |
if pagination: | |
next_page = pagination.find('a', class_='in-pagination__item', string=lambda text: text and text.strip().isdigit()) | |
if not next_page: | |
break | |
page += 1 | |
url = base_url + '&pag=' + str(page) | |
except requests.exceptions.TooManyRedirects as e: | |
print(f"Errore: {e}") | |
break | |
if st.tipologia_case == "Acquisto Immobile": | |
results = [obj for obj in results if 'asta' not in obj['Titolo'].lower()] | |
seen_titles = set() | |
results = [ | |
obj for obj in results | |
if normalize_title(obj['Titolo']) not in seen_titles and not seen_titles.add(normalize_title(obj['Titolo'])) | |
] | |
return base_url, json.dumps(results, ensure_ascii=False, indent=2) | |
# Restituisce l'elenco dei COMUNI di una Provincia e il PREZZO MEDIO | |
def get_elenco_comuni(provincia): | |
base_url = f"https://www.immobiliare.it/mercato-immobiliare/lombardia/{provincia}-provincia/" | |
results = [] | |
print(f'Lettura Comuni e Prezzo Medio al Mq') | |
response = requests.get(base_url) | |
soup = BeautifulSoup(response.content, 'html.parser') | |
rows = soup.find_all('tr', class_='nd-table__row') | |
results = [] | |
for row in rows: | |
cells = row.find_all('td', class_='nd-table__cell') | |
if len(cells) >= 2: | |
comune = cells[0].get_text(strip=True) | |
prezzo_vendita = cells[1].get_text(strip=True) | |
results.append({ | |
'provincia': provincia, | |
'comune': comune, | |
'prezzo': prezzo_vendita | |
}) | |
results.append({ | |
'provincia': provincia, | |
'comune': "Provincia di " + provincia, | |
'prezzo': '0' | |
}) | |
return results | |
cerca_premuto = False | |
comuni_provincia = {} | |
def scrivi_dataframe(url_ricerca, output, riepilogo, comune, da_excel = False, df_excel = None): | |
if len(output) > 0 or (da_excel and df_excel is not None): | |
#for comune_excel, df_comune in dataframes_per_comune.items(): | |
# if comune_excel == comune: | |
# print('a') | |
# Da fare MATTEO st.write(df_comune) | |
st.numero_immobili_validi = st.numero_immobili_validi + 1 | |
if not riepilogo or da_excel: | |
st.write(f"### {comune}") | |
if da_excel: | |
df = df_excel | |
else: | |
df = pd.DataFrame(output) | |
df_originale = df.sort_values(by=["Vantaggio", "PrezzoMq"], ascending=[False, True]) | |
if not riepilogo: | |
columns_to_display = ["Vantaggioso", "Vantaggio", "Immagine", "Titolo", "PrezzoMq", "Prezzo", "Superficie", "Locali", "PrezzoMedioMq", "Link"] | |
else: | |
columns_to_display = ["Vantaggioso", "Vantaggio", "Immagine", "Comune", "Titolo", "PrezzoMq", "Prezzo", "Superficie", "Locali", "PrezzoMedioMq", "Link"] | |
df = df_originale[columns_to_display] | |
df = df.style.format(thousands='.') | |
vantaggioso_count = df_originale["Vantaggioso"].sum() | |
total_rows = df_originale.shape[0] | |
if st.mostra_grafici: | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
vantaggioso_count = df_originale["Vantaggioso"].sum() | |
total_rows = df_originale.shape[0] | |
st.metric("Numero Immobili", int(total_rows), int(vantaggioso_count)) | |
st.write('Prezzo Totale') | |
chart_data = df_originale["Prezzo"] | |
st.line_chart(chart_data, color = "#FF4B4B", height=110) | |
with col2: | |
vantaggioso_count = df_originale["Vantaggioso"].sum() | |
total_rows = df_originale.shape[0] | |
st.metric("% Immobili Vantaggiosi", int((vantaggioso_count/total_rows)* 100), 100-int((vantaggioso_count/total_rows)* 100)) | |
st.write('Locali') | |
immobili_per_locali = df_originale.sort_values(by=["Locali"], ascending=[True]).groupby("Locali").size() | |
st.bar_chart(immobili_per_locali, color = "#ffb7b7", height=110) | |
with col3: | |
superficie_count = df_originale["Superficie"].sum() | |
total_rows = df_originale.shape[0] | |
st.metric("Media Superficie", int(superficie_count//total_rows), int(superficie_count)) | |
st.write('Prezzo Medio al Metro Quadro') | |
chart_data = df_originale["PrezzoMq"] | |
st.area_chart(chart_data, color = "#FF4B4B", height=110) | |
st.dataframe(df, hide_index=True, use_container_width=True, | |
column_config ={ | |
"Vantaggioso": st.column_config.CheckboxColumn("Vantaggioso"), | |
"Vantaggio": st.column_config.ProgressColumn( | |
"Punteggio", | |
help="Vantaggio in %", | |
format='%f', | |
min_value=0, | |
max_value=100, | |
), | |
"Immagine": st.column_config.ImageColumn("Anteprima", help="Anteprima", width="small"), | |
"PrezzoMq": "€/Mq", | |
"PrezzoMedioMq": "Media €/Mq", | |
"Prezzo": st.column_config.NumberColumn( | |
"Prezzo Totale", | |
help="Il prezzo totale dell'immobile in EURO", | |
step=1, | |
format="%d €", | |
), | |
"Superficie": "Superficie", | |
"Locali": "Locali", | |
"Link": st.column_config.LinkColumn("App URL") | |
}) | |
testo_riepilogativo = f"Riepilogando nel comune [{comune}]({url_ricerca}) sono presenti **{vantaggioso_count} Immobili vantaggiosi** rispetto ai {total_rows} totali" | |
st.write(testo_riepilogativo) | |
st.divider() | |
def analizza_dati_ai(output, tipologia): | |
Ak = os.getenv('API_GROQ') | |
#Ak = st.secret('API_GRPQ') | |
client = Groq(api_key=Ak) | |
if tipologia == 1: | |
prompt_messages = [ | |
{ | |
"role": "system", | |
"content": """Sei un'assistente virtuale specializzata nel supporto agli investitori immobiliari. | |
Il tuo compito è analizzare i dati di un file CSV contenente un elenco di immobili e fornire consigli, idee e analisi dettagliate | |
per massimizzare il profitto attraverso la riqualificazione e rivendita degli stessi. | |
Devi considerare vari fattori come la posizione degli immobili, il prezzo di acquisto, il potenziale valore di mercato post-riqualificazione, | |
i costi stimati per la ristrutturazione e altri dati pertinenti. | |
Il tuo obiettivo è offrire suggerimenti strategici basati sui dati, evidenziare le migliori opportunità di investimento, | |
identificare eventuali rischi, e fornire consigli pratici per ottimizzare i profitti. Rispondi in modo chiaro, conciso e professionale.""" | |
}, | |
{ | |
"role": "user", | |
"content": f"""Ho un file CSV con un elenco di immobili che sto considerando per un investimento. | |
Vorrei che tu analizzassi i dati e mi fornissi consigli dettagliati su come posso massimizzare il mio profitto attraverso la riqualificazione e la rivendita di questi immobili. | |
Per ogni immobile, per favore prendi in considerazione i seguenti aspetti:\n\n | |
1. Valore attuale: Quanto vale l'immobile al momento dell'acquisto?\n | |
2. Costi di riqualificazione stimati: Quanto potrebbe costare la ristrutturazione o la riqualificazione?\n | |
3. Valore di mercato potenziale: Quanto potrebbe valere l'immobile una volta riqualificato?\n | |
4. Rendimento potenziale: Qual è il margine di profitto previsto, tenendo conto dei costi totali?\n | |
5. Tempistica di rivendita: In quanto tempo è probabile che l'immobile venga venduto una volta riqualificato?\n | |
6. Analisi del mercato locale: Qual è la situazione del mercato immobiliare nella zona specifica? Ci sono trend emergenti?\n | |
7. Rischi potenziali: Quali sono i possibili rischi o svantaggi legati a ciascun immobile?\n | |
Infine, suggeriscimi le migliori opportunità di investimento tra gli immobili elencati, | |
con una breve spiegazione del motivo per cui questi immobili sono i più promettenti. | |
DATI UN PUNTEGGIO DA 0 A 100 e mostra i primi 5 in ordine di punteggio DECRESCENTE! | |
\n\n{output[:30000]}""" | |
} | |
] | |
elif tipologia==2: | |
prompt_messages = [ | |
{ | |
"role": "system", | |
"content": """Sei un'assistente virtuale specializzata nel supporto agli investitori immobiliari""" | |
}, | |
{ | |
"role": "user", | |
"content": f"""Ho un file CSV con un elenco di immobili che sto considerando per un investimento. | |
Analizza i dati fornendo un punteggio da 1 a 100 degli immobili specificando PRO e CONTRO per ognuno. Mettili in ORDINE di punteggio DECRESCENTE. Restituisci un CSV formattato\n\n{output}""" | |
} | |
] | |
print(prompt_messages) | |
response_area = st.empty() | |
with st.spinner("Generazione in corso..."): | |
completion = client.chat.completions.create( | |
model="llama-3.1-70b-versatile", | |
messages=prompt_messages, | |
temperature=1, | |
max_tokens=2048, | |
top_p=1, | |
stream=True, | |
stop=None, | |
) | |
response_text = "" | |
for chunk in completion: | |
response_text += chunk.choices[0].delta.content or "" | |
response_area.markdown(response_text + "▌") | |
response_area.markdown(response_text) | |
def inizializza(): | |
if 'logged_in' not in st.session_state: | |
st.session_state['logged_in'] = False | |
if "numero_immobili_validi" not in st.session_state: | |
st.numero_immobili_validi = 0 | |
if 'tipologia_case' not in st.session_state: | |
st.session_state['tipologia_case'] = '' | |
if 'mostra_grafici' not in st.session_state: | |
st.session_state['mostra_grafici'] = False | |
if 'analisi_ai' not in st.session_state: | |
st.session_state['analisi_ai'] = False | |
if 'modello_ai' not in st.session_state: | |
st.session_state['modello_ai'] = '' | |
if 'initialized' not in st.session_state: | |
st.session_state['initialized'] = False | |
if 'comuni_totali' not in st.session_state: | |
st.session_state['comuni_totali'] = None | |
def login_page(): | |
login_container = st.empty() | |
with login_container: | |
log1, log2, log3 = st.columns([1.5, 3, 1.5]) | |
with log2: | |
st.title('🏠 Immobiliare A.I. ') | |
st.write("") | |
#USERNAME = st.secrets["login"]["username"] | |
#PASSWORD = st.secrets["login"]["password"] | |
USERNAME = 'altero' | |
PASSWORD = os.getenv('PASSWORD_LOGIN') | |
with st.form(key='login_form'): | |
username_input = st.text_input('Username') | |
password_input = st.text_input('Password', type='password') | |
login_button = st.form_submit_button('Login') | |
if login_button: | |
if username_input == USERNAME and password_input == PASSWORD: | |
st.session_state['logged_in'] = True | |
login_container.empty() | |
else: | |
st.error("Username o password errati") | |
st.set_page_config(layout='wide') | |
st.title('🏠 Immobiliare A.I. ') | |
st.write("##### Il tuo assistente di intelligenza artificiale per la ricerca di occasioni immobiliari") | |
with st.expander("Informazioni"): | |
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!") | |
if 'initialized' not in st.session_state: | |
inizializza() | |
st.session_state['initialized'] = True | |
with st.sidebar: | |
if st.session_state.get('comuni_totali') is None: | |
comuni_provincia_Brescia = get_elenco_comuni('Brescia') | |
comuni_provincia_Bergamo = get_elenco_comuni('Bergamo') | |
comuni_provincia_Milano = get_elenco_comuni('Milano') | |
comuni_provincia_Verona = get_elenco_comuni('Verona') | |
comuni_provincia = comuni_provincia_Brescia + comuni_provincia_Bergamo + comuni_provincia_Milano + comuni_provincia_Verona | |
st.session_state['comuni_totali'] = comuni_provincia | |
else: | |
comuni_provincia = st.session_state['comuni_totali'] | |
st.title("Filtri") | |
st.tipologia_case = st.selectbox("Tipologia", ("Asta Immobiliare", "Acquisto Immobile"), ) | |
elenco = [d['comune'] for d in comuni_provincia] | |
comune_input = st.multiselect( | |
"Comuni", | |
elenco | |
) | |
min_value = 0 | |
max_value = 1000 | |
prezzo = st.slider( | |
"Intervallo Prezzo (k €)", | |
min_value=min_value, | |
max_value=max_value, | |
value=(0, 250), | |
) | |
prezzo_minimo, prezzo_massimo = prezzo | |
locali = list(range(1, 21)) # Intervallo da 1 a 10 | |
locali_range = st.sidebar.select_slider( | |
"Locali", | |
options=locali, | |
value=(locali[2], locali[4]) # Valore iniziale, da 1 a 5 locali | |
) | |
st.mostra_grafici = st.toggle("Mostra grafici", value = True) | |
st.analisi_ai = st.toggle("Analizza i dati tramite l'A.I.", value = True) | |
locali_minimo, locali_massimo = locali_range | |
prezzo_minimo = prezzo_minimo*1000 | |
prezzo_massimo = prezzo_massimo*1000 | |
# Carica i file | |
uploaded_files = None | |
if st.tipologia_case == "Asta Immobiliare": | |
uploaded_files = st.file_uploader("Choose files", type=["xlsx", "xls", "csv"], accept_multiple_files=True) | |
cerca_premuto = st.button("Cerca", use_container_width=True, type='primary') | |
def calcola_prezzo_mq(row): | |
if pd.isnull(row['Prezzo']) or pd.isnull(row['Superficie']) or row['Superficie'] == 0: | |
return 0 | |
else: | |
return row['Prezzo'] // row['Superficie'] | |
def calcola_vantaggio(row): | |
if pd.isnull(row['PrezzoMedioMq']) or pd.isnull(row['PrezzoMq']): | |
return 0 | |
else: | |
if isinstance(row['PrezzoMedioMq'], str): | |
prezzo_medio_mq_numerico = int(row['PrezzoMedioMq'].replace(".", "")) | |
else: | |
prezzo_medio_mq_numerico = row['PrezzoMedioMq'] | |
differenza = prezzo_medio_mq_numerico - int(row['PrezzoMq']) | |
if prezzo_medio_mq_numerico != 0: | |
vantaggio = (differenza / prezzo_medio_mq_numerico) * 100 | |
else: | |
vantaggio = 0 | |
vantaggio = max(0, vantaggio) | |
vantaggio = int(vantaggio) | |
return vantaggio | |
def calcola_vantaggioso(row): | |
if isinstance(row['PrezzoMedioMq'], str): | |
prezzo_medio_mq_numerico = int(row['PrezzoMedioMq'].replace(".", "")) | |
else: | |
prezzo_medio_mq_numerico = row['PrezzoMedioMq'] | |
if row['PrezzoMq'] < prezzo_medio_mq_numerico: | |
return True | |
else: | |
return False | |
def importa_excel(file): | |
df = None | |
if file.name.endswith('.csv'): | |
df = pd.read_csv(file) | |
elif file.name.endswith('.xlsx') or file.name.endswith('.xls'): | |
df = pd.read_excel(file) | |
else: | |
st.error(f"Formato di file non supportato: {file.name}") | |
if df is not None: | |
wb = load_workbook(file) | |
ws = wb.active | |
if df.columns[0] != "Comune": | |
df = pd.read_excel(file, header=1) | |
if 'Link asta' in df.columns: | |
link_column_index = df.columns.get_loc("Link asta") + 1 | |
for i in range(2, ws.max_row + 1): | |
cell = ws.cell(row=i, column=link_column_index) | |
if cell.hyperlink: | |
df.at[i - 2, "Link asta"] = cell.hyperlink.target | |
else: | |
df.at[i - 2, "Link asta"] = "" | |
if 'Perizia' in df.columns: | |
link_column_index = df.columns.get_loc("Perizia") + 1 | |
for i in range(2, ws.max_row + 1): | |
cell = ws.cell(row=i, column=link_column_index) | |
if cell.hyperlink: | |
df.at[i - 2, "Perizia"] = cell.hyperlink.target | |
columns_to_display = ["Comune", "Off. min. [€]", "Locali [nr]", "Mq", "Descrizione", "Link asta", "Perizia"] | |
df = df[columns_to_display] | |
df = df.rename(columns={ | |
"Off. min. [€]": 'Prezzo', | |
'Locali [nr]': 'Locali', | |
'Descrizione':'Titolo', | |
'Mq':'Superficie', | |
'Link asta': 'Link' | |
}) | |
df['Prezzo'] = df['Prezzo'].fillna(0).astype(int) | |
df['Superficie'] = df['Superficie'].fillna(0).astype(int) | |
df['Locali'] = df['Locali'].fillna(0).astype(int) | |
df['PrezzoMq'] = df.apply(calcola_prezzo_mq, axis=1) | |
df['PrezzoMq'] = df['PrezzoMq'].fillna(0).astype(int) | |
df['Immagine'] = "" | |
mappatura_prezzi = {item['comune'].lower(): item['prezzo'] for item in comuni_provincia} | |
df['PrezzoMedioMq'] = df['Comune'].str.lower().map(mappatura_prezzi).combine_first(df['Prezzo']) | |
df['Vantaggio'] = df.apply(calcola_vantaggio, axis=1) | |
df['Vantaggioso'] = df.apply(calcola_vantaggioso, axis=1) | |
return df | |
if cerca_premuto: | |
dfs = [] | |
if uploaded_files: | |
for file in uploaded_files: | |
df = importa_excel(file) | |
dfs.append(df) | |
if dfs: | |
st.info('Aste PVP') | |
concatenated_df = pd.concat(dfs, ignore_index=True) | |
concatenated_df = concatenated_df.sort_values(by=['Comune', 'Vantaggio', 'PrezzoMq'], ascending=[True, False, False]) | |
dataframes_per_comune = {comune: df for comune, df in concatenated_df.groupby('Comune')} | |
for comune, df_comune in dataframes_per_comune.items(): | |
scrivi_dataframe('', [], False, comune, True, df_comune) | |
concatenated_df = concatenated_df.sort_values(by=['Vantaggio', 'PrezzoMq'], ascending=[False, False]) | |
scrivi_dataframe('', [], False, 'Riepilogo PVP', True, concatenated_df) | |
st.success("File Excel importati con successo") | |
if len(comune_input)>0: | |
comuni_selezionati = comune_input | |
comuni_selezionati = [comune.upper() for comune in comuni_selezionati] | |
if "PROVINCIA DI BRESCIA" in comuni_selezionati: | |
comuni_selezionati.remove("PROVINCIA DI BRESCIA") | |
comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'BRESCIA']) | |
comuni_selezionati.remove("PROVINCIA DI BRESCIA") | |
if "PROVINCIA DI MILANO" in comuni_selezionati: | |
comuni_selezionati.remove("PROVINCIA DI MILANO") | |
comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'MILANO']) | |
comuni_selezionati.remove("PROVINCIA DI MILANO") | |
if "PROVINCIA DI VERONA" in comuni_selezionati: | |
comuni_selezionati.remove("PROVINCIA DI VERONA") | |
comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'VERONA']) | |
comuni_selezionati.remove("PROVINCIA DI VERONA") | |
if "PROVINCIA DI BERGAMO" in comuni_selezionati: | |
comuni_selezionati.remove("PROVINCIA DI BERGAMO") | |
comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'BERGAMO']) | |
comuni_selezionati.remove("PROVINCIA DI BERGAMO") | |
output = [] | |
output_singolo = [] | |
if st.tipologia_case == "Asta Immobiliare": | |
st.info('Aste Immobiliare.it') | |
else: | |
st.info('Vendita Immobiliare.it') | |
for comune_provincia in comuni_provincia: | |
if comune_provincia['comune'].upper() in comuni_selezionati: | |
with st.spinner(f"Ricerca Immobili Comune: {comune_provincia['comune']}"): | |
url_ricerca, json_object = scrape_immobiliare(comune_provincia['provincia'], | |
comune_provincia['comune'], | |
comune_provincia['prezzo'], | |
prezzo_minimo, | |
prezzo_massimo, | |
locali_minimo, | |
locali_massimo) | |
output_singolo = json.loads(json_object) | |
scrivi_dataframe(url_ricerca, output_singolo, False, comune_provincia['comune']) | |
output += output_singolo | |
time.sleep(0.10) | |
if len(comuni_selezionati)>1 and st.numero_immobili_validi>1: | |
st.write(f"### Comuni Selezionati") | |
scrivi_dataframe('', output, True, '') | |
if st.numero_immobili_validi > 0 and st.analisi_ai: | |
st.title("✨ Analisi Intelligenza Artificiale") | |
st.write("### Considerazioni") | |
analizza_dati_ai(output, 1) | |
#st.divider() | |
#st.write("### Dettagliata") | |
#analizza_dati_ai(output, 2) | |
st.success("Elaborazione Completata") | |
if not uploaded_files and len(comune_input) == 0: | |
st.error("Per favore, inserisci il nome di un comune o seleziona un file excel") | |
#if 'initialized' not in st.session_state: | |
# st.session_state['initialized'] = True | |
# inizializza() | |
# st.set_page_config(layout='wide') | |
#if not st.session_state['logged_in']: | |
# login_page() | |
#if st.session_state['logged_in']: | |
# main() |