Novità

Python - Addestramento rete neurale

Questa é un impostazione di massima che ho dato io ma nulla vieta di modificarli...infatti puoi interagire per effettuare le varie sperimentazioni. Il fatto é che ogni ottimizzatore predilige in linea di massima tale learning rate
Coem dicevi tu tempo fa occorre sperimentare anche modificando il numero di epoch ed il batch. Tutto cio ovviamente sulla quantita di dati che gli dai da digerire.Fai attenzione a non esagerare troppo da una parte o dall altra per non cadere nell overfitting in cui mi sono imbattuto prima di fissare tali parametri....che sono modificabili a piacere ma attento al rapporto/variazione tra loss e val loss...Non ci deve essere molta discrepanza tra loro
 
Ultima modifica:
Salve a Tutti questo Post mi ha fatto appassionare alle rete neurali costruite con script Python, sto provando variazioni su uno script di addestramento su le estrazioni di una singola Ruota in formato csv, alla fine mi da il numero più probabile. lo script alla fine mi da questa immaggine voi piu bravi mi spiegate il significato la Ruota è bBari ed alla fine mi da il Numero 47BA.jpegBA.jpeg
 
Premessa:
Mi rendo perfettamente conto che fare questa domanda il sabato pomeriggio, mentre ognuno è
affaccendato nelle proprie ricerche per il gioco di stasera, è quantomeno poco opporutuno....(per non
usare altri termini: rompere i c.........ni), ma sono in altomare. Perdonatemi.

Chiedo aiuto!
A: LottoPython, a chi sà

Non mi funge. La screen che allego è l'esecuz. del pitone del post177 di Lottopython, ma come potete vedere
non mi fà impostare le date di inizio e fine.
Ancora: nel terzo riquadro che ho evidenziato in rosso, risulta in attesa. Cosa si intende.

Grazie infinite a chi vorrà aiutarmi e scusate anacora per la rottura.....
 
intanto per Filippo mi sa che l'addestramento da quello che vedo sia in alto mare per cio che ti riguarda ,con l'aumentare delle epoche i loss dovrebbe diminuire per un buon addestramento della rete neurale con una curva che dovrebbe avvicinarsi il piu possibile alle epoche impostate mentre la rete apprende. credo tu sia in over-fitting al top è necessario che imposti un early stop con un range tale che se va in over si blocca e riparte

La "migliore condizione" per il train loss e l'accuracy (accuratezza) durante l'addestramento di un modello di machine learning si riferisce a uno stato in cui il modello:

  1. Minimizza il loss: Il train loss dovrebbe diminuire nel tempo. Un basso valore di loss indica che il modello sta facendo previsioni accurate sui dati di training. L'obiettivo è ridurre al minimo il loss senza incorrere in over-fitting.
  2. Massimizza l'accuracy: L'accuratezza (o precisione) misura la percentuale di previsioni corrette del modello sui dati di training. L'accuracy dovrebbe aumentare nel tempo durante l'addestramento. Un'alta accuracy indica che il modello è in grado di classificare o prevedere correttamente i dati.
In sintesi, la "migliore condizione" si verifica quando il modello mostra:

  • Un trend di loss decrescente: Il train loss diminuisce costantemente con l'aumentare delle epoche (cicli di addestramento).
  • Un trend di accuracy crescente: L'accuracy aumenta costantemente con l'aumentare delle epoche.
  • Convergenza: Il loss e l'accuracy raggiungono una situazione in cui non migliorano significativamente oltre un certo punto. Ciò suggerisce che il modello ha appreso abbastanza dai dati di addestramento.
  • Assenza di over-fitting: L'accuratezza sul set di validazione (o test) è simile all'accuratezza sul set di training. L'over-fitting si verifica quando il modello "memorizza" i dati di training anziché imparare le generalizzazioni. In questo caso, il modello funziona bene sui dati di training ma male sui dati nuovi e non visti.
Come ottenere la migliore condizione:

  • Selezione del modello: Scegliere il modello più appropriato per il tuo problema (ad esempio, reti neurali, alberi decisionali, ecc.).
  • Preparazione dei dati:
    • Pulizia dei dati: Gestisci i dati mancanti, gli errori e le anomalie.
    • Normalizzazione/Standardizzazione: Scalare i dati per migliorare le prestazioni del modello.
    • Dividere i dati: Dividi i dati in set di training, validazione e test.
  • Impostazione degli iperparametri:
    • Learning rate: Imposta il learning rate (tasso di apprendimento) appropriato. Un learning rate troppo alto può portare a divergenza (il loss aumenta), mentre un learning rate troppo basso può rallentare l'addestramento.
    • Numero di epoche: Scegli il numero di epoche (cicli di addestramento) adeguato.
    • Funzione di loss: Seleziona la funzione di loss appropriata per il tuo problema (ad esempio, errore quadratico medio per la regressione, cross-entropy per la classificazione).
    • Ottimizzatore: Scegli un ottimizzatore (ad esempio, Adam, SGD) per aggiornare i pesi del modello.
    • Batch size: Imposta la dimensione del batch (numero di esempi utilizzati in ogni iterazione di addestramento).
  • Monitoraggio:
    • Traccia il train loss e l'accuracy durante l'addestramento.
    • Traccia il loss e l'accuracy sul set di validazione per rilevare l'over-fitting.
    • Usa tecniche di visualizzazione (come i grafici loss vs. epoche e accuracy vs. epoche) per monitorare l'andamento del modello.
  • Tecniche di regolarizzazione:
    • Regolarizzazione L1/L2: Aggiungi termini di regolarizzazione alla funzione di loss per prevenire l'over-fitting.
    • Dropout: Applica il dropout alle reti neurali per ridurre l'over-fitting.
    • Early stopping: Interrompi l'addestramento quando l'accuratezza sul set di validazione smette di migliorare per un certo numero di epoche.
  • Cross-validation: Utilizza la cross-validation per valutare le prestazioni del modello in modo più robusto.
In conclusione:
La ricerca della "migliore condizione" è un processo iterativo che richiede sperimentazione, monitoraggio e ottimizzazione. L'obiettivo è trovare un equilibrio tra la minimizzazione del loss, la massimizzazione dell'accuracy e la prevenzione dell'over-fitting.
 
Premessa:
Mi rendo perfettamente conto che fare questa domanda il sabato pomeriggio, mentre ognuno è
affaccendato nelle proprie ricerche per il gioco di stasera, è quantomeno poco opporutuno....(per non
usare altri termini: rompere i c.........ni), ma sono in altomare. Perdonatemi.

Chiedo aiuto!
A: LottoPython, a chi sà

Non mi funge. La screen che allego è l'esecuz. del pitone del post177 di Lottopython, ma come potete vedere
non mi fà impostare le date di inizio e fine.
Ancora: nel terzo riquadro che ho evidenziato in rosso, risulta in attesa. Cosa si intende.

Grazie infinite a chi vorrà aiutarmi e scusate anacora per la rottura.....
ciao e benvenuto ,non ho ben capito ma provo con il dirti che non vedo dal programma che non hai selezionato l'ottimizatore e la funzione di perdita se non preselezioni le attività necessarie non avvia il calcolo rimanendo in attesa ,ma lo vedi anche dal terminale attivo ,ossia la finestra cmd aperta
Screenshot-9.png

Screenshot-10.png
 
giusto
Salve a Tutti questo Post mi ha fatto appassionare alle rete neurali costruite con script Python, sto provando variazioni su uno script di addestramento su le estrazioni di una singola Ruota in formato csv, alla fine mi da il numero più probabile. lo script alla fine mi da questa immaggine voi piu bravi mi spiegate il significato la Ruota è bBari ed alla fine mi da il Numero 47Vedi l'allegato 2297604Vedi l'allegato 2297604
Screenshot-11.png

questo è gia leggermente migliore come loss ed epoche tende alla discesa in questo caso aumento le epoche e vediamo come si comporta

Screenshot-12.png



sembra che il 48 36 sia atteso su FI CA
 
intanto per Filippo mi sa che l'addestramento da quello che vedo sia in alto mare per cio che ti riguarda ,con l'aumentare delle epoche i loss dovrebbe diminuire per un buon addestramento della rete neurale con una curva che dovrebbe avvicinarsi il piu possibile alle epoche impostate mentre la rete apprende. credo tu sia in over-fitting al top è necessario che imposti un early stop con un range tale che se va in over si blocca e riparte

La "migliore condizione" per il train loss e l'accuracy (accuratezza) durante l'addestramento di un modello di machine learning si riferisce a uno stato in cui il modello:

  1. Minimizza il loss: Il train loss dovrebbe diminuire nel tempo. Un basso valore di loss indica che il modello sta facendo previsioni accurate sui dati di training. L'obiettivo è ridurre al minimo il loss senza incorrere in over-fitting.
  2. Massimizza l'accuracy: L'accuratezza (o precisione) misura la percentuale di previsioni corrette del modello sui dati di training. L'accuracy dovrebbe aumentare nel tempo durante l'addestramento. Un'alta accuracy indica che il modello è in grado di classificare o prevedere correttamente i dati.
In sintesi, la "migliore condizione" si verifica quando il modello mostra:

  • Un trend di loss decrescente: Il train loss diminuisce costantemente con l'aumentare delle epoche (cicli di addestramento).
  • Un trend di accuracy crescente: L'accuracy aumenta costantemente con l'aumentare delle epoche.
  • Convergenza: Il loss e l'accuracy raggiungono una situazione in cui non migliorano significativamente oltre un certo punto. Ciò suggerisce che il modello ha appreso abbastanza dai dati di addestramento.
  • Assenza di over-fitting: L'accuratezza sul set di validazione (o test) è simile all'accuratezza sul set di training. L'over-fitting si verifica quando il modello "memorizza" i dati di training anziché imparare le generalizzazioni. In questo caso, il modello funziona bene sui dati di training ma male sui dati nuovi e non visti.
Come ottenere la migliore condizione:

  • Selezione del modello: Scegliere il modello più appropriato per il tuo problema (ad esempio, reti neurali, alberi decisionali, ecc.).
  • Preparazione dei dati:
    • Pulizia dei dati: Gestisci i dati mancanti, gli errori e le anomalie.
    • Normalizzazione/Standardizzazione: Scalare i dati per migliorare le prestazioni del modello.
    • Dividere i dati: Dividi i dati in set di training, validazione e test.
  • Impostazione degli iperparametri:
    • Learning rate: Imposta il learning rate (tasso di apprendimento) appropriato. Un learning rate troppo alto può portare a divergenza (il loss aumenta), mentre un learning rate troppo basso può rallentare l'addestramento.
    • Numero di epoche: Scegli il numero di epoche (cicli di addestramento) adeguato.
    • Funzione di loss: Seleziona la funzione di loss appropriata per il tuo problema (ad esempio, errore quadratico medio per la regressione, cross-entropy per la classificazione).
    • Ottimizzatore: Scegli un ottimizzatore (ad esempio, Adam, SGD) per aggiornare i pesi del modello.
    • Batch size: Imposta la dimensione del batch (numero di esempi utilizzati in ogni iterazione di addestramento).
  • Monitoraggio:
    • Traccia il train loss e l'accuracy durante l'addestramento.
    • Traccia il loss e l'accuracy sul set di validazione per rilevare l'over-fitting.
    • Usa tecniche di visualizzazione (come i grafici loss vs. epoche e accuracy vs. epoche) per monitorare l'andamento del modello.
  • Tecniche di regolarizzazione:
    • Regolarizzazione L1/L2: Aggiungi termini di regolarizzazione alla funzione di loss per prevenire l'over-fitting.
    • Dropout: Applica il dropout alle reti neurali per ridurre l'over-fitting.
    • Early stopping: Interrompi l'addestramento quando l'accuratezza sul set di validazione smette di migliorare per un certo numero di epoche.
  • Cross-validation: Utilizza la cross-validation per valutare le prestazioni del modello in modo più robusto.
In conclusione:
La ricerca della "migliore condizione" è un processo iterativo che richiede sperimentazione, monitoraggio e ottimizzazione. L'obiettivo è trovare un equilibrio tra la minimizzazione del loss, la massimizzazione dell'accuracy e la prevenzione dell'over-fitting.
Ho apportato delle modifiche allo script ora la figura è questa BA1.jpeg
 
Ho apportato delle modifiche allo script ora la figura è questa Vedi l'allegato 2297606
è quasi impossibile per me capire che dati hai apportato alla tua rete neurale i grafici mi fanno capire che non sta imparando molto la rete o meglio va in over .non so neanche quali parametri stai utilizzando o come è impostata la tua rete neurale ,di primo acchitto ti ho risposto al post precedente
 
Ciao Lottopython e molte grazie per avermi risposto praticamente all'istante!

Niente,
sicuramente ho sbagliato qualcosa nell'installazione....
Ho il pitone 3.10 e non l'ultima versione (come qualcuno aveva suggerito non ricordo in
quale post in precedenza, non ricordo quale...).

Per Lottopython:
nell'esecuzione del code del tuo post172, nell'interfaccia risultante non mi viene
visualizzata la sezione per poter selezionare la ruota (vedi screen allegata): da cosa
potrebbe dipendere secondo te?


Per Max63, per chi sà:
Una domanda moooolto basica (non crocifiggetemi, vi prego):
quali files andavano installati nella stessa ubicazione del pitone?
Molto probabilmente l'errore è propio lì (almeno spero...)
Anche perchè se viene visualizzata l'interfaccia nell'esecuzione, vuol
dire che il pitone si è mosso....


Lo sò che l'argomento di questo thread non sarebbe per novizi
della programmazione (è evidente), ma credo di non essere il solo quindi
ho azzardato la domanda, scusatemi ancora....
 

Allegati

  • 2025-02-15_173122.png
    2025-02-15_173122.png
    13,9 KB · Visite: 6
Ciao Lottopython e molte grazie per avermi risposto praticamente all'istante!

Niente,
sicuramente ho sbagliato qualcosa nell'installazione....
Ho il pitone 3.10 e non l'ultima versione (come qualcuno aveva suggerito non ricordo in
quale post in precedenza, non ricordo quale...).

Per Lottopython:
nell'esecuzione del code del tuo post172, nell'interfaccia risultante non mi viene
visualizzata la sezione per poter selezionare la ruota (vedi screen allegata): da cosa
potrebbe dipendere secondo te?


Per Max63, per chi sà:
Una domanda moooolto basica (non crocifiggetemi, vi prego):
quali files andavano installati nella stessa ubicazione del pitone?
Molto probabilmente l'errore è propio lì (almeno spero...)
Anche perchè se viene visualizzata l'interfaccia nell'esecuzione, vuol
dire che il pitone si è mosso....


Lo sò che l'argomento di questo thread non sarebbe per novizi
della programmazione (è evidente), ma credo di non essere il solo quindi
ho azzardato la domanda, scusatemi ancora....
è semplice mancano le librerie aggiornate o devi aggiornare python all'ultima versione.

:
Questo codice necessita delle seguenti librerie per essere funzionale:

  • tkinter: import tkinter as tk - Per creare l'interfaccia grafica (GUI).
  • tkinter.messagebox: from tkinter import messagebox - Per mostrare messaggi di errore e informativi nell'interfaccia.
  • tkinter.filedialog: from tkinter import filedialog - Per permettere all'utente di selezionare file e salvare risultati.
  • pandas: import pandas as pd - Per la manipolazione e l'analisi dei dati in formato tabellare (DataFrame).
  • math: import math - Per funzioni matematiche di base.
  • scipy.stats: from scipy.stats import binom - Per calcoli statistici, in particolare per la distribuzione binomiale utilizzata per stimare le probabilità.
Per installare queste librerie, puoi usare il comando pip nel tuo terminale (assicurati di avere Python installato):

Copy pip install pandas scipy

tkinter è generalmente incluso con l'installazione standard di Python, quindi non è necessario installarlo separatamente, a meno che tu non stia usando una distribuzione specifica o un ambiente virtuale in cui potresti doverlo installare.

upgrade python: python3 -m pip install --upgrade pip

ti consiglio di utilizzare questo piccolo codice : lo trasporti su desk apri un txt e lo rinomi .py e da li lanci qualsiasi comando o script
inoltre puoi incollare i codici dei programmi nelle chat ia e chiedere quali tipo di librerie necessita


Codice:
import tkinter as tk
import os

def apri_cmd():
    directory = r"C:TUOPERCORSO\Python\Python312"
    os.system(f"start cmd /K cd /D {directory}")

root = tk.Tk()
root.title("Apri Prompt dei Comandi")
root.geometry("200x100")

btn_apri_cmd = tk.Button(root, text="Apri CMD", command=apri_cmd)
btn_apri_cmd.pack()

root.mainloop()
 
Ciao Lottopython e molte grazie per avermi risposto praticamente all'istante!

Niente,
sicuramente ho sbagliato qualcosa nell'installazione....
Ho il pitone 3.10 e non l'ultima versione (come qualcuno aveva suggerito non ricordo in
quale post in precedenza, non ricordo quale...).

Per Lottopython:
nell'esecuzione del code del tuo post172, nell'interfaccia risultante non mi viene
visualizzata la sezione per poter selezionare la ruota (vedi screen allegata): da cosa
potrebbe dipendere secondo te?


Per Max63, per chi sà:
Una domanda moooolto basica (non crocifiggetemi, vi prego):
quali files andavano installati nella stessa ubicazione del pitone?
Molto probabilmente l'errore è propio lì (almeno spero...)
Anche perchè se viene visualizzata l'interfaccia nell'esecuzione, vuol
dire che il pitone si è mosso....


Lo sò che l'argomento di questo thread non sarebbe per novizi
della programmazione (è evidente), ma credo di non essere il solo quindi
ho azzardato la domanda, scusatemi ancora....

l'ho modificato nella gestione delle ruote ,ora non hai bisogno delle ruote in formato txt. le estrazioni li gestisce online occhi sempre a come imposti le date YYYY-MM-DD è fondamentale
Codice:
import tkinter as tk
from tkinter import messagebox, filedialog
import pandas as pd
import math
from scipy.stats import binom
import requests
from io import StringIO

def carica_dati(file_url, start_date=None, end_date=None):
    try:
        response = requests.get(file_url)
        response.raise_for_status()  # Solleva un'eccezione per errori HTTP

        df = pd.read_csv(StringIO(response.text), sep='\t', header=None, names=['Data', 'Ruota', 'Numero1', 'Numero2', 'Numero3', 'Numero4', 'Numero5'])
        df['Data'] = pd.to_datetime(df['Data'], errors='coerce')
        df = df.dropna(subset=['Data'])
        if start_date and end_date:
            df = df[(df['Data'] >= start_date) & (df['Data'] <= end_date)]
            
        for colonna in ['Numero1', 'Numero2', 'Numero3', 'Numero4', 'Numero5']:
            df[colonna] = df[colonna].apply(lambda x: str(int(x)).zfill(2) if pd.notna(x) and str(x).isdigit() else None)
        return df
    except requests.exceptions.RequestException as e:
        messagebox.showerror("Errore di Rete", f"Errore nel recuperare il file da {file_url}: {e}")
        return None
    except ValueError as e:
        messagebox.showerror("Errore di Formattazione", f"Errore nel file: {e}")
        return None
    except Exception as e:
        messagebox.showerror("Errore", f"Errore generico: {e}")
        return None

def calcola_statistiche_numeri_successivi(df, numero):
    df_numeri = df[['Numero1', 'Numero2', 'Numero3', 'Numero4', 'Numero5']]
    
    # Analisi dei numeri successivi
    filtro_successivi = df_numeri.shift(1).apply(lambda x: x == numero).any(axis=1)
    numeri_successivi = df[filtro_successivi].iloc[:, 2:].values.flatten()
    numeri_successivi = pd.Series(numeri_successivi).dropna()

    # Analisi dei numeri precedenti
    filtro_precedenti = df_numeri.shift(-1).apply(lambda x: x == numero).any(axis=1)
    numeri_precedenti = df[filtro_precedenti].iloc[:, 2:].values.flatten()
    numeri_precedenti = pd.Series(numeri_precedenti).dropna()

    if numeri_successivi.empty and numeri_precedenti.empty:
        return None, f"Il numero {numero} non ha seguito né preceduto immediato sulla ruota."

    statistiche = {}
    
    if not numeri_successivi.empty:
        conteggio_numeri_successivi = numeri_successivi.value_counts()
        numeri_top_successivi = conteggio_numeri_successivi.head(4)
        percentuali_successivi = (numeri_top_successivi / len(numeri_successivi)) * 100
        media_successivi = numeri_successivi.astype(int).mean()
        deviazione_standard_successivi = numeri_successivi.astype(int).std()
        
        statistiche['successivi'] = {
            'numeri_top': numeri_top_successivi,
            'percentuali': percentuali_successivi,
            'media': media_successivi,
            'deviazione_standard': deviazione_standard_successivi,
            'dati': numeri_successivi
        }

    if not numeri_precedenti.empty:
        conteggio_numeri_precedenti = numeri_precedenti.value_counts()
        numeri_top_precedenti = conteggio_numeri_precedenti.head(4)
        percentuali_precedenti = (numeri_top_precedenti / len(numeri_precedenti)) * 100
        media_precedenti = numeri_precedenti.astype(int).mean()
        deviazione_standard_precedenti = numeri_precedenti.astype(int).std()
        
        statistiche['precedenti'] = {
            'numeri_top': numeri_top_precedenti,
            'percentuali': percentuali_precedenti,
            'media': media_precedenti,
            'deviazione_standard': deviazione_standard_precedenti,
            'dati': numeri_precedenti
        }
    
    freq_uscita_numero = (df.iloc[:, 2:] == numero).sum().sum() / (len(df) * 5)

    # Probabilità di vedere il numero spia almeno una volta in un dato numero di estrazioni
    def calcola_estrazioni_necessarie(probabilita, freq):
        estrazioni = 1
        while True:
            probabilita_attuale = 1 - binom.cdf(0, estrazioni, freq)
            if probabilita_attuale >= probabilita:
                return estrazioni
            estrazioni += 1

    estrazioni_50_percento = calcola_estrazioni_necessarie(0.50, freq_uscita_numero)
    estrazioni_90_percento = calcola_estrazioni_necessarie(0.90, freq_uscita_numero)

    return (statistiche, freq_uscita_numero, estrazioni_50_percento, estrazioni_90_percento), None

def scegli_miglior_ruota(risultati):
    # Logica per scegliere la ruota migliore in base alle statistiche calcolate
    miglior_ruota = None
    miglior_valutazione = -float('inf')
    
    for ruota, risultato in risultati:
        statistiche, freq_uscita_numero, estrazioni_50_percento, estrazioni_90_percento = risultato
        
        # Esempio di valutazione basata su frequenza e deviazione standard
        valutazione = 0
        if 'successivi' in statistiche:
            valutazione += statistiche['successivi']['media'] - statistiche['successivi']['deviazione_standard']
        if 'precedenti' in statistiche:
            valutazione += statistiche['precedenti']['media'] - statistiche['precedenti']['deviazione_standard']
        
        if valutazione > miglior_valutazione:
            miglior_valutazione = valutazione
            miglior_ruota = (ruota, risultato)
    
    return miglior_ruota

def cerca_numeri():
    ruote_selezionate = listbox_ruote.curselection()
    if not ruote_selezionate:
        messagebox.showinfo("Nessuna Ruota Selezionata", "Seleziona almeno una ruota.")
        return

    numeri_spia = [entry.get().zfill(2) for entry in entry_numeri if entry.get().isdigit() and 1 <= int(entry.get()) <= 90]
    if not numeri_spia:
        messagebox.showinfo("Numeri Spia Invalidi", "Inserisci numeri spia validi (1-90).")
        return
    
    try:
        start_date = pd.to_datetime(start_date_entry.get(), format='%Y-%m-%d')
        end_date = pd.to_datetime(end_date_entry.get(), format='%Y-%m-%d')
    except ValueError:
        messagebox.showinfo("Date Invalidi", "Inserisci date valide nel formato YYYY-MM-DD.")
        return

    risultati = []
    messaggi_errore = []
    for ruota_index in ruote_selezionate:
        ruota = listbox_ruote.get(ruota_index)
        file_url = file_ruote.get(ruota)
        if file_url:
            df = carica_dati(file_url, start_date, end_date)
            if df is not None:
                for numero in numeri_spia:
                    risultato, errore = calcola_statistiche_numeri_successivi(df, numero)
                    if errore:
                        messaggi_errore.append(errore)
                    if risultato is not None:
                        risultati.append((ruota, risultato))

    if risultati:
        miglior_ruota = scegli_miglior_ruota(risultati)
        if miglior_ruota:
            ruota, risultato = miglior_ruota
            statistiche, freq_uscita_numero, estrazioni_50_percento, estrazioni_90_percento = risultato

            messaggio = f"Per la ruota di {ruota}, le statistiche dei numeri spia sono:\n"
            
            if 'successivi' in statistiche:
                messaggio += "Numeri successivi:\n"
                for num, freq in statistiche['successivi']['numeri_top'].items():
                    percentuale = statistiche['successivi']['percentuali'][num]
                    messaggio += f"- Numero: {num}, Frequenza: {freq}, Percentuale: {percentuale:.2f}%\n"
                messaggio += f"Media dei numeri successivi: {statistiche['successivi']['media']:.2f}\n"
                messaggio += f"Deviazione standard dei numeri successivi: {statistiche['successivi']['deviazione_standard']:.2f}\n"
            
            if 'precedenti' in statistiche:
                messaggio += "Numeri precedenti:\n"
                for num, freq in statistiche['precedenti']['numeri_top'].items():
                    percentuale = statistiche['precedenti']['percentuali'][num]
                    messaggio += f"- Numero: {num}, Frequenza: {freq}, Percentuale: {percentuale:.2f}%\n"
                messaggio += f"Media dei numeri precedenti: {statistiche['precedenti']['media']:.2f}\n"
                messaggio += f"Deviazione standard dei numeri precedenti: {statistiche['precedenti']['deviazione_standard']:.2f}\n"
            
            messaggio += f"Frequenza di uscita del numero spia: {freq_uscita_numero:.2f}\n"
            messaggio += f"Numero stimato di estrazioni necessarie per avere il numero spia con probabilità del 50%: {estrazioni_50_percento}\n"
            messaggio += f"Numero stimato di estrazioni necessarie per avere il numero spia con probabilità del 90%: {estrazioni_90_percento}\n"
            messaggio += "\n"
        
            risultato_text.delete(1.0, tk.END)
            risultato_text.insert(tk.END, messaggio)
    else:
        risultato_text.delete(1.0, tk.END)
        if messaggi_errore:
            risultato_text.insert(tk.END, "\n".join(messaggi_errore))
        else:
            risultato_text.insert(tk.END, "Nessun risultato trovato.")

def salva_risultati():
    results = risultato_text.get(1.0, tk.END)
    if not results.strip():
        messagebox.showinfo("Nessun Risultato", "Non ci sono risultati da salvare.")
        return
    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")])
    if file_path:
        with open(file_path, "w") as file:
            file.write(results)
        messagebox.showinfo("Salvataggio", "I risultati sono stati salvati correttamente.")

# Definizione della finestra principale
root = tk.Tk()
root.title("Analisi dei Numeri Spia")
root.geometry("1200x700")

# Definizione degli URL dei file delle ruote
file_ruote = {
    'BA': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/BARI.txt',
    'CA': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/CAGLIARI.txt',
    'FI': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/FIRENZE.txt',
    'GE': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/GENOVA.txt',
    'MI': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/MILANO.txt',
    'NA': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/NAPOLI.txt',
    'PA': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/PALERMO.txt',
    'RM': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/ROMA.txt',
    'TO': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/TORINO.txt',
    'VE': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/VENEZIA.txt',
    'NZ': 'https://raw.githubusercontent.com/Lottopython/estrazioni/refs/heads/main/NAZIONALE.txt'
}

frame = tk.Frame(root, padx=10, pady=10)
frame.pack(expand=True, fill=tk.BOTH)

label_ruote = tk.Label(frame, text="Seleziona Ruota:", font=("Helvetica", 14))
label_ruote.place(relx=0.05, rely=0.05, relwidth=0.15, relheight=0.05)

listbox_ruote = tk.Listbox(frame, font=("Helvetica", 12), selectmode=tk.MULTIPLE)
for ruota in file_ruote.keys():
    listbox_ruote.insert(tk.END, ruota)
listbox_ruote.place(relx=0.05, rely=0.1, relwidth=0.15, relheight=0.4)

label_numeri_spia = tk.Label(frame, text="Numeri Spia:", font=("Helvetica", 14))
label_numeri_spia.place(relx=0.25, rely=0.05, relwidth=0.2, relheight=0.05)

entry_numeri = []
for i in range(5):
    entry_numero = tk.Entry(frame, font=("Helvetica", 12))
    entry_numero.place(relx=0.25, rely=0.1 + i * 0.1, relwidth=0.2, relheight=0.05)
    entry_numeri.append(entry_numero)

start_date_label = tk.Label(frame, text="Data Inizio:", font=("Helvetica", 14))
start_date_label.place(relx=0.55, rely=0.05, relwidth=0.15, relheight=0.05)

start_date_entry = tk.Entry(frame, font=("Helvetica", 12))
start_date_entry.place(relx=0.55, rely=0.1, relwidth=0.2, relheight=0.05)

end_date_label = tk.Label(frame, text="Data Fine:", font=("Helvetica", 14))
end_date_label.place(relx=0.55, rely=0.2, relwidth=0.15, relheight=0.05)

end_date_entry = tk.Entry(frame, font=("Helvetica", 12))
end_date_entry.place(relx=0.55, rely=0.25, relwidth=0.2, relheight=0.05)

button_cerca = tk.Button(frame, text="Cerca", font=("Helvetica", 14), command=cerca_numeri)
button_cerca.place(relx=0.8, rely=0.1, relwidth=0.15, relheight=0.1)

button_salva = tk.Button(frame, text="Salva Risultati", font=("Helvetica", 14), command=salva_risultati)
button_salva.place(relx=0.8, rely=0.25, relwidth=0.15, relheight=0.1)

risultato_text = tk.Text(frame, font=("Helvetica", 12))
risultato_text.place(relx=0.05, rely=0.6, relwidth=0.9, relheight=0.35)

root.mainloop()

Screenshot-13.png
 

Ultima estrazione Lotto

  • Estrazione del lotto
    sabato 15 febbraio 2025
    Bari
    72
    78
    23
    39
    06
    Cagliari
    18
    02
    32
    45
    07
    Firenze
    77
    37
    02
    57
    36
    Genova
    28
    24
    46
    21
    90
    Milano
    01
    85
    25
    39
    86
    Napoli
    26
    08
    90
    31
    34
    Palermo
    49
    81
    73
    87
    38
    Roma
    47
    74
    01
    11
    40
    Torino
    32
    41
    15
    07
    46
    Venezia
    33
    10
    59
    79
    30
    Nazionale
    03
    73
    16
    65
    04
    Estrazione Simbolotto
    Cagliari
    24
    15
    40
    05
    28
Indietro
Alto