Piano d’Azione: Milestone 2: Box Plot dei Rendimenti
Obiettivo Finale della Milestone: L’utente può scegliere un nuovo tipo di analisi (“Distribuzione Rendimenti”) e vedere un box plot che mostra la distribuzione dei rendimenti orari per ogni giorno della settimana.
Il piano sarà molto simile al precedente, ma ancora più semplice perché molte parti esistono già.
Capitolo 1: La Logica di Calcolo (Backend)
-
Obiettivo: Estendere il nostro motore di analisi per preparare i dati per il box plot.
-
Task 1.1: Aggiornamento dell’AnalysisEngine
-
File da modificare: fire/synapses/explorer/analysis_engine.py
-
Azione: Aggiungeremo un nuovo metodo statico prepare_boxplot_data(dataframe). Questo metodo:
-
Prenderà il DataFrame orario come input.
-
Calcolerà i rendimenti percentuali (pct_change).
-
Estrarrà il giorno della settimana dall’indice.
-
Restituirà un DataFrame pulito con due sole colonne: day_of_week e returns. Questo è il formato ideale per la libreria seaborn per generare un box plot.
-
-
-
Test di Capitolo 1: Testeremo il nuovo metodo in isolamento, verificando che restituisca un DataFrame nel formato corretto.
Capitolo 2: L’Interfaccia Utente (Frontend)
-
Obiettivo: Creare un nuovo widget per il box plot e integrarlo nell’interfaccia esistente dell’Explorer.
-
Task 2.1: Creazione del Widget per il Box Plot
-
Nuovo File: fire/ui_components/charts/boxplot_widget.py
-
Azione: Creeremo un nuovo widget, molto simile all’HeatmapWidget, che incapsula un canvas di Matplotlib/Seaborn. Esporrà un metodo plot_boxplot(dataframe) per disegnare il grafico.
-
-
Task 2.2: Aggiornamento del Pannello di Controllo Principale
-
File da modificare: fire/synapses/explorer/explorer_tab_widget.py
-
Azione: Modificheremo l’interfaccia per permettere all’utente di scegliere quale analisi eseguire.
-
Aggiungeremo un QComboBox (un menu a tendina) con le opzioni: “Heatmap Rendimenti Orari” e “Distribuzione Rendimenti (Box Plot)“.
-
Il bottone “Analizza” cambierà testo in base alla selezione.
-
Invece di contenere direttamente la heatmap, il pannello dei risultati conterrà un QStackedWidget. Questo è un widget che permette di avere più “pagine” e di mostrarne solo una alla volta. Avremo una pagina per la heatmap e una per il box plot.
-
-
-
Test di Capitolo 2: Verificheremo che la nuova UI con il menu a tendina e lo QStackedWidget funzioni correttamente, mostrando il widget appropriato quando si cambia la selezione.
Capitolo 3: Integrazione e Flusso di Lavoro
-
Obiettivo: Aggiornare il worker e le connessioni per gestire la nuova opzione di analisi.
-
Task 3.1: Aggiornamento del ExplorerWorker
-
File: fire/synapses/explorer/explorer_worker.py
-
Azione: Modificheremo il worker per renderlo più flessibile.
-
Aggiungeremo un nuovo parametro analysis_type al suo init.
-
Nel metodo run, useremo un if/elif per chiamare il metodo corretto dell’AnalysisEngine in base all’analysis_type ricevuto.
-
Il dizionario dei risultati ora conterrà una chiave che riflette il tipo di analisi (es. ‘heatmap_data’ o ‘boxplot_data’).
-
-
-
Task 3.2: Aggiornamento della Logica di Connessione
-
File: fire/synapses/explorer/explorer_tab_widget.py e main_window.py
-
Azione:
-
In explorer_tab_widget.py: Quando l’utente clicca “Analizza”, il widget leggerà la selezione dal QComboBox e la passerà nel segnale analysis_requested. Lo slot on_analysis_finished ora dovrà controllare il tipo di dato ricevuto per sapere quale pagina dello QStackedWidget mostrare e a quale widget passare i dati.
-
In main_window.py: Lo slot on_run_explorer_analysis verrà aggiornato per accettare e passare il nuovo parametro analysis_type al worker.
-
-
-
Test di Capitolo 3 (Test Finale): L’intera feature dovrebbe funzionare. L’utente potrà selezionare “Box Plot”, cliccare “Analizza”, e il grafico corretto apparirà.
Prossimo Passo
Se questo piano ti convince, il nostro prossimo passo concreto sarà il Task 1.1: modificare l’AnalysisEngine per aggiungere la logica di preparazione dei dati per il box plot.
19.5s
Use Arrow Up and Arrow Down to select a turn, Enter to jump to it, and Escape to return to the chat.