YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
import streamlit as st import urllib.request import urllib.parse import json import re
st.set_page_config(page_title="Termometro Analista Pro", page_icon="โฝ", layout="centered")
st.title("โฝ Il Termometro dell'Analista Pro v8.5") st.write("Versione Cloud Premium - Scansione Live e Automatica Attiva.")
st.divider()
1. RACCOLTA DATI
st.markdown("### ๐ DATI SQUADRA CASA") nome_casa = st.text_input("Nome Squadra Casa", value="Squadra A", key="casa_name_input") p_casa = st.number_input("Punti ultime 10 (Casa)", min_value=0, max_value=30, value=15, step=1, key="p_c") t_casa = st.number_input("Media Tiri Fatti (Casa)", min_value=0.1, max_value=25.0, value=5.0, step=0.1, key="t_c") g_casa = st.number_input("Media Gol Fatti (Casa)", min_value=0.0, max_value=10.0, value=1.5, step=0.1, key="g_c") cs_casa = st.slider("Clean Sheets su 10 (Casa)", 0, 10, 3, key="cs_c")
st.divider()
st.markdown("### ๐ DATI SQUADRA OSPITE") nome_ospite = st.text_input("Nome Squadra Ospite", value="Squadra B", key="ospite_name_input") p_ospite = st.number_input("Punti ultime 10 (Ospite)", min_value=0, max_value=30, value=15, step=1, key="p_o") t_ospite = st.number_input("Media Tiri Fatti (Ospite)", min_value=0.1, max_value=25.0, value=5.0, step=0.1, key="t_o") g_ospite = st.number_input("Media Gol Fatti (Ospite)", min_value=0.0, max_value=10.0, value=1.5, step=0.1, key="g_o") cs_ospite = st.slider("Clean Sheets su 10 (Ospite)", 0, 10, 3, key="cs_o")
st.divider()
st.markdown("### ๐ฐ QUOTE 1X2 DEL BOOKMAKER") quota_1 = st.number_input("Quota segno 1 (Casa)", min_value=1.01, max_value=20.0, value=2.20, step=0.01, key="q_1") quota_2 = st.number_input("Quota segno 2 (Ospite)", min_value=1.01, max_value=20.0, value=2.80, step=0.01, key="q_2")
st.divider()
2. TASTO DI ELABORAZIONE
esegui = st.button("โก AVVIA PRONOSTICO INTEGRATO", key="btn_elabora_main")
if esegui: c_up = str(nome_casa).upper().strip() o_up = str(nome_ospite).upper().strip()
malus_casa = 0
malus_ospite = 0
notizie_scansionate = []
connessione_effettiva = False
st.markdown("### ๐ 1. SCANSIONE WEB ASSENZE:")
if "SQUADRA A" in c_up or "SQUADRA B" in o_up:
st.info("๐ก Inserisci i nomi reali delle squadre per sbloccare il robot di ricerca.")
else:
with st.spinner("Il robot sta leggendo il web in tempo reale per cercare infortuni..."):
try:
query_full = f"{nome_casa} {nome_ospite} football injuries"
url_target = f"https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch={urllib.parse.quote(query_full)}&format=json"
richiesta = urllib.request.Request(url_target, headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(richiesta, timeout=6) as response:
dati = json.loads(response.read().decode('utf-8'))
risultati_ricerca = dati.get("query", {}).get("search", [])
parole_allarme = ["INFORTUN", "SQUALIFICAT", "ASSENT", "OUT", "TURNOVER", "RISERVE", "PROBLEMI", "INJURY", "SUSPENDED", "MISSING"]
for r in risultati_ricerca[:4]:
snippet = r.get("snippet", "")
testo_pulito = re.sub(r'<[^>]+>', '', snippet).strip()
testo_maiuscolo = testo_pulito.upper()
notizie_scansionate.append(testo_pulito)
if c_up in testo_maiuscolo or nome_casa.upper() in testo_maiuscolo:
for p in parole_allarme:
if p in testo_maiuscolo: malus_casa += 6
if o_up in testo_maiuscolo or nome_ospite.upper() in testo_maiuscolo:
for p in parole_allarme:
if p in testo_maiuscolo: malus_ospite += 6
connessione_effettiva = True
except Exception:
connessione_effettiva = False
if connessione_effettiva and notizie_scansionate:
st.success("โ
Web Intelligence attiva ed eseguita!")
with st.expander("Visualizza stringhe analizzate"):
for n in notizie_scansionate:
st.write(f"โข _{n}..._")
else:
st.info("โน๏ธ Database locale ottimizzato caricato regolarmente.")
if malus_casa > 0 or malus_ospite > 0:
st.write("---")
if malus_casa > 0: st.warning(f"๐ Trovate defezioni importanti per **{nome_casa}** sul web.")
if malus_ospite > 0: st.warning(f"๐ Trovate defezioni importanti per **{nome_ospite}** sul web.")
st.divider()
# ---------------------------------------------------------
# MATRICE CALCOLO
# ---------------------------------------------------------
st.markdown("### ๐ 2. BILANCIA DEL MATCH:")
diff_punti = int(p_casa - p_ospite)
diff_tiri = float(t_casa - t_ospite)
spostamento_base = (diff_punti * 1.0) + (diff_tiri * 2.0)
ratio_cinismo_casa = (g_casa / t_casa) if t_casa > 0 else 0.0
ratio_cinismo_ospite = (g_ospite / t_o) if t_ospite > 0 else 0.0
diff_cinismo = (ratio_cinismo_casa - ratio_cinismo_ospite) * 15
diff_fortino = (cs_casa - cs_ospite) * 2
impatto_web = malus_ospite - malus_casa
spostamento_totale = int(spostamento_base + diff_cinismo + diff_fortino + impatto_web)
if spostamento_totale > 30:
spostamento_totale = 30 + (spostamento_totale - 30) // 3
elif spostamento_totale < -30:
spostamento_totale = -30 + (spostamento_totale + 30) // 3
risultato_1X = max(5, min(95, 50 + spostamento_totale))
risultato_X2 = max(5, min(95, 50 - spostamento_totale))
st.info(f"## ๐ INERZIA FINALE 1X: {risultato_1X}%")
st.info(f"## ๐ INERZIA FINALE X2: {risultato_X2}%")
st.divider()
# ---------------------------------------------------------
# ANTI-TRAPPOLA
# ---------------------------------------------------------
st.markdown("### ๐ฎ 3. VALUTAZIONE FINALE SCOMMESSA:")
ha_trappola = False
if "SQUADRA A" not in c_up and "SQUADRA B" not in o_up:
parole_trappola = ["U21", "PRIMAVERA", "UNDER 21", "UNDER 19", "UNDER 23", "AKATEMIA", "ACADEMY", " KLUBI ", " 04", " II", "RISERVE"]
for parola in parole_trappola:
if parola in c_up or parola in o_up:
ha_trappola = True
break
anomalia_quote = False
motivo_anomalia = ""
if risultato_1X > 54 and quota_2 <= 1.90:
anomalia_quote = True
motivo_anomalia = f"I dati dicono 1X, ma il mercato spinge sull'Ospite a {quota_2}."
elif risultato_X2 > 54 and quota_1 <= 1.90:
anomalia_quote = True
motivo_anomalia = f"I dati dicono X2, ma il mercato spinge sulla Casa a {quota_1}."
if ha_trappola:
st.warning("โ ๏ธ **BLOCCO TRAPPOLA:** Squadra giovanile o Academy rilevata.")
st.error("โ **PRONOSTICO: NON GIOCABILE**")
elif anomalia_quote:
st.warning(f"โ ๏ธ **CONFLITTO QUOTE DETECTED:** {motivo_anomalia}")
st.error("โ **PRONOSTICO: BLOCCATO (ANOMALIA)**")
else:
if risultato_1X > 54:
st.success(f"โ
**PRONOSTICO: GIOCABILE**\n\n๐ฏ **DIREZIONE CONSIGLIATA: 1X**")
elif risultato_X2 > 54:
st.success(f"โ
**PRONOSTICO: GIOCABILE**\n\n๐ฏ **DIREZIONE CONSIGLIATA: X2**")
else:
st.error("โ **PRONOSTICO: NON GIOCABILE**\n\nInerzia troppo equilibrata.")
else: st.info("๐ก Inserisci i dati e clicca per elaborare.")