TdP-prove-finali / Introduzione

Istruzioni e documentazione per la proposta e lo svolgimento delle prove finali relative al corso di Tecniche di Programmazione.
http://bit.ly/tecn-progr
Apache License 2.0
4 stars 13 forks source link

Analisi dei terremoti globali #129

Closed flvcpr closed 4 months ago

flvcpr commented 4 months ago

Studente proponente

s298367 Caprino Pagliazzo Flavio

Titolo della proposta

Studio di zone sismiche

Descrizione del problema proposto

Creare una visione globale (o ristretta a zone del mondo) dei terremoti avvenuti nel 2023, con relativo calcolo di numerose statistiche utili alla visualizzazione di diverse classifiche sulle zone più o meno rischiose e la relativa efficacia delle stazioni di rilevamento per quanto riguarda l'attività sismica

Descrizione della rilevanza gestionale del problema

È fondamentale da una collezione così ampia di dati estrarre dati di rilevanza gestionale per lo studio dei singoli casi, l'utente può scegliere di avere una visione globale dei terremoti distribuiti nei mesi dell'anno, oppure può scegliere di studiare terremoti in zone specifiche sparse per il mondo in cui è avvenuto almeno 1 terremoto. Nello studio verranno effettuate diverse analisi sui terremoti grazie alla rilevante quantità di dati per ogni terremoto presente nel database. Verrà effettuato anche uno studio sugli errori commessi dalle stazioni per rilevare le zone in cui è necessario intervento per migliorare la precisione delle misurazioni

Descrizione dei data-set per la valutazione

Link dataset: https://www.kaggle.com/datasets/mustafakeser4/earthquakes-2023-global/data

Il dataset "Earthquakes 2023 Global" fornisce informazioni preziose sui 26.642 terremoti avvenuti in tutto il mondo per l'anno 2023, riportando diversi dati necessari allo studio dei singoli casi, tra cui:

Tempo: Timestamp dell'evento sismico. Latitudine: Coordinata geografica che specifica la posizione nord-sud. Longitudine: Coordinata geografica che specifica la posizione est-ovest. Profondità: Profondità del terremoto in chilometri. Mag: Magnitudo del terremoto. TipoMag: Tipo di misura della magnitudo. Nst: Numero di stazioni sismiche che hanno riportato il terremoto. Gap: La distanza tra la copertura delle diverse stazioni sismiche. Dmin: Distanza minima dall'epicentro del terremoto alla stazione più vicina. Rms: Radice quadrata media dello spettro di ampiezza del terremoto. Rete: Rete che riporta il terremoto. Id: Identificatore univoco per l'evento sismico. Aggiornato: Timestamp che indica quando le informazioni sul terremoto sono state aggiornate per l'ultima volta. Luogo: Descrizione della posizione del terremoto. Tipo: Tipo di evento sismico (ad esempio, terremoto). ErroreOrizzontale: Errore nella determinazione della posizione orizzontale. ErroreProfondità: Errore nella determinazione della profondità. ErroreMag: Errore nella determinazione della magnitudo. MagNst: Numero di stazioni sismiche utilizzate per calcolare la magnitudo. Stato: Stato dell'evento sismico (ad esempio, revisionato). FontePosizione: Fonte che riporta la posizione del terremoto. FonteMag: Fonte che riporta la magnitudo del terremoto.

Si possono effettuare diverse analisi dalla collezione di dati, dovendo impostare una ricorsione ho scelto di creare il grafo basandomi prima sull'analisi geospaziale, potendo visualizzare così la distribuzione dei terremoti su una mappa del mondo (oppure su una zona scelta per stringere il campo) e verranno così esplorate le regioni con maggiore attività sismica grazie a un algoritmo ricorsivo.

Tutti gli altri dati possono essere ricavati dai nodi (che saranno oggetti di tipo Terremoto), e saranno usati per le seguenti analisi: temporale, magnitudo e profondità, stazioni, errori.

Descrizione preliminare degli algoritmi coinvolti

I nodi saranno i terremoti, ma essendo quasi 30.000 nodi c'è bisogno di creare dei vincoli tramite dati inseriti dall'utente, ricavati dai menu a tendina riempiti all'apertura del programma, pensavo di poter dividere i terremoti in base alle seguenti caratteristiche: -mese dell'anno (riducendo a circa 1/12 i nodi, obbligatorio per creare il grafo) -zona del mondo (in alcuni casi potrebbe generare grafi con pochi nodi, quindi scelgo di tenerlo come dato opzionale nella creazione del grafo). Come prima cosa verranno riempiti due dropdown, rispettivamente con i mesi (scritti in forma letterale per avere piu pulizia nel menu) e con le zone del mondo. Il singolo mese verrà convertito in datetime e verranno selezionati i terremoti avvenuti nel mese. Per quanto riguarda la zona il database non fornisce la colonna "Regione", ma da un indirizzo generico nella forma: posizione+regione/stato , quindi è necessario dividere la stringa (esempio: 96 km SE of Atlasovo, Russia -> nel menu a tendina verrà visualizzato "Russia"), avendo così una lista di 401 zone del mondo (perchè in alcuni casi divide in regioni, non sempre è presente lo stato), se selezionato sarà un vincolo aggiuntivo e verrà eseguita una query secondaria (perchè altrimenti controllo solo se la data del terremoto è relativa al mese selezionato). La seconda quindi sarà simile alla prima ma avente in più la condizione che la posizione del terremoto deve contenere il valore del secondo dropdown. È anche presente un campo di testo "soglia-peso" (obbligatorio per creare il grafo). Alla pressione del bottone "crea grafo" verrà creato quest'ultimo avente come nodi i terremoti che rispettano le condizioni. Per gestire il peso degli archi ho pensato di definirlo tramite una distanza soglia tra due epicentri, due terremoti sono collegati se sono avvenuti entro una distanza di ("soglia-peso")km, utilizzerò la libreria Geopy per la distanza geodetica. Il peso dell'arco sarà quindi la distanza tra due nodi se collegati. Una volta creato il grafo, procedo a attivare i relativi bottoni per le analisi successive.

Analisi Temporale: Devo dividere in due casi: caso in cui venga inserita la zona: distanza media di giorni tra un terremoto e l'altro e frequenza nel mese caso in cui non venga inserita la zona: come prima, ma avrò un dizionario (chiave: luogo, valore: distanza di tempo media) per ogni zona del mondo, ordinando la lista per verificare eventuali corrispondenze o coincidenze tra zone diverse. La frequenza verrà calcolata come l'inverso del numero di terremoti nell'arco del mese (contando come giorni 28, 30 o 31 in base al mese) nella zona selezionata (o nel mondo). La distanza media dei terremoti nel mese verra calcolata nel seguente modo: ordino i terremoti in ordine cronologico, guardo quanti giorni passano tra un terremoto e l'altro e eseguo la media dividendo per il numero di intervalli. Esempio: 5 terremoti avvenuti (partendo dal primo) a distanza (uno con l'altro) di 10, 4, 7, 9 giorni, nell'intervallo di tempo (1 mese) avrò una distanza media tra terremoti di 7.5 giorni e avrò 1 terremoto ogni (esempio: Novembre 30 giorni) 6 giorni

Analisi delle Stazioni: Ogni terremoto del grafo è stato rilevato da un numero diverso di stazioni, si può ordinare la lista di nodi per numero di stazioni che hanno rilevato il singolo terremoto e visualizzare quindi le zone (relative all'epicentro) meglio fornite di stazioni (se più stazioni rilevano il singolo terremoto vuol dire che nella zona in cui è avvenuto ci sono più stazioni installate). Si possono evidenziare così le zone meno fornite di stazioni.

Analisi degli Errori: Un bottone per il calcolo dei 3 errori Alla pressione di ogni bottone verrano create 3 copie della lista di nodi, ognuna ordinata per i 3 parametri, verranno stampati i luoghi degli epicentri ordinati, andando così a trovare le zone in cui eventualmente è necessario intervenire per sistemare le stazioni.

Analisi della Magnitudo e Profondità: nell'interfaccia saranno presenti due campi di testo: uno per inserire il valore "magnitudo" e uno per inserire un vincolo numerico ("n-classifica"): se verrà inserito il primo stamperò a video i terremoti aventi quella magnitudo + - 0.5 unita, se viene invece inserito il vincolo numerico stamperò 2 classifiche (una dal primo al n-esimo, l'altra dal "meno"-n-esimo all'ultimo) ordinati per magnitudo: dal maggiore in ordine decrescente la prima, dal minore in ordine crescente la seconda. Esempio: grafo con 100 nodi, n=10 come vincolo, stampo i primi 10 (decrescente partendo dal massimo) e gli ultimi 10 (crescente partendo dal minimo), va gestito il caso in cui venga inserito un vincolo maggiore del numero di nodi, segnalando all'utente di selezionare nuovamente il numero, oppure per semplificare il lavoro dell'utente si può scrivere la classifica tenendo conto del numero dei nodi senza scatenare errori (sempre nel caso in cui venga inserito un valore non utilizzabile). Stesso discorso per la profondità. Non posso riempire entrambi i TextField, deve essere solo uno attivo.

Algoritmo ricorso: si parte da ogni nodo impostato come sorgente (avrò un richiamo alla ricorsione dentro a un ciclo per tutti i nodi), verrà aggiunto al parziale un nodo se tra i nodi del grafo (anche tra parti scollegate tra di loro), la distanza dal nodo che sto per aggiungere col nodo di partenza non supera la "soglia ricorsione" inserita dall’utente in km, facendo così ho per ogni nodo del grafo un numero di terremoti che saranno entro un raggio dal nodo sorgente, anche non per forza collegati col nodo sorgente (nella ricorsione non dovrò quindi iterare sui vicini, ma su tutti i nodi del grafo) Questa ricorsione da come risultato per ogni nodo del grafo (creato con una soglia) la quantità di terremoti che rientrano in una seconda soglia. Partendo da un nodo sorgente posso avere nel raggio della ricorsione anche diverse isole del grafo scollegate tra di loro, ma che comunque rientrano nella "soglia-ricorsione" inserita dall'utente. Al termine della ricorsione per ogni nodo vado a salvare in un dizionario (avente come chiavi i nodi) il valore il numero di nodi entro il raggio. Ordino il dizionario per valori decrescenti e vado a stampare la lista dei terremoti (ad esempio si potrebbe visualizzare il luogo e il numero di terremoti nel raggio di km) Per visualizzarlo: Al centro ho un nodo sorgente, il nodo fa parte di un albero (con quindi i terremoti collegati). Nel raggio della ricorsione posso anche andare a intercettare terremoti non collegati al nodo sorgente, ma comunque all'interno del raggio, lasciando libero l'utente di scegliere a piacimento le due soglie dei TextField.

Parametri della ricorsione: condizione terminale: dal nodo sorgente non ho piu nodi del grafo entro il raggio condizione di aggiunta al parziale: tra i nodi del grafo ho un nodo la cui distanza non supera la "soglia-ricorsione" peso del parziale: lunghezza del parziale / (raggio^2)*pigreco

Descrizione preliminare delle funzionalità previste per l’applicazione software

Riga 1: Dropdown "Mese" - Dropdown "Luogo" - TextField "Soglia peso".

Riga 2: Bottone "Crea Grafo".

Riga 3: ListView "txtresult1" (contenente dettagli del grafo, numero nodi e numero archi).

Riga 4: Bottone "Analisi temporale" - Bottone "Analisi Stazioni" - Bottone "Analisi Errori".

Riga 5: Bottone "Analisi Potenza" - TextField "Magnitudo" - TextField "N Classifica"

Riga 6: ListView "txtresult2" (contenente i risultati delle analisi) (si potrebbe anche mettere un textresult per ogni bottone)

Riga 7: TextField "Soglia Ricorsione" - Bottone "Calcola Densità".

Riga 8: ListView "txtresult3" (contenente la lista di chiave-valore della ricorsione, ordinata per peso del parziale).

JosephAv commented 4 months ago

Ecco la tua repo: https://github.com/TdP-prove-finali/CaprinoFlavio.git