Perfetto, ottima scelta. Sono completamente d’accordo. Completare il set di strumenti di analisi di base darà alla sinapsi “Market Explorer” una completezza notevole e un grande valore per l’utente, consolidando il lavoro che abbiamo appena fatto.
Titolo dell’Implementazione: Sinapsi “Market Explorer” - Milestone 3: Analisi di Stagionalità
Implementeremo entrambi gli strumenti che hai menzionato (Strumento 3 e 4) in questa milestone, dato che sono concettualmente molto simili e possono condividere parte della logica.
Piano d’Azione: Milestone 3: Analisi di Stagionalità
Obiettivo Finale della Milestone: L’utente può selezionare due nuovi tipi di analisi (“Stagionalità Mensile” e “Rendimento per Giorno del Mese”) e visualizzare i rispettivi grafici a barre/linee.
Capitolo 1: La Logica di Calcolo (Backend)
- Obiettivo: Estendere l’
AnalysisEngineper calcolare le aggregazioni mensili e giornaliere. Questi calcoli useranno dati a intervallo giornaliero (1d), che abbiamo già. - Task 1.1: Aggiunta del Calcolo per Stagionalità Mensile
- File da modificare:
fire/synapses/explorer/analysis_engine.py - Azione: Aggiungeremo un nuovo metodo statico
calculate_monthly_seasonality(dataframe). Questo metodo:- Calcolerà i rendimenti giornalieri (
pct_change). - Estrarrà il mese dall’indice.
- Userà
groupby('month')per calcolare il rendimento medio per ogni mese. - Restituirà una
pd.Seriescon i mesi come indice e i rendimenti medi come valori.
- Calcolerà i rendimenti giornalieri (
- File da modificare:
- Task 1.2: Aggiunta del Calcolo per Rendimento Giornaliero
- File da modificare:
fire/synapses/explorer/analysis_engine.py - Azione: Aggiungeremo un altro metodo statico
calculate_day_of_month_returns(dataframe). Questo metodo:- Calcolerà i rendimenti giornalieri.
- Estrarrà il giorno del mese dall’indice (
index.day). - Userà
groupby('day')per calcolare il rendimento medio per ogni giorno del mese. - Restituirà una
pd.Seriescon i giorni (1-31) come indice.
- File da modificare:
Capitolo 2: L’Interfaccia Utente (Frontend)
- Obiettivo: Creare un nuovo widget generico per i grafici a barre/linee e integrarlo nell’interfaccia dell’Explorer.
- Task 2.1: Creazione di un Widget Generico per Grafici Semplici
- Nuovo File:
fire/ui_components/charts/bar_line_chart_widget.py - Azione: Creeremo un widget flessibile, basato su Matplotlib, che può disegnare sia un grafico a barre che un grafico a linee. Esporrà due metodi:
plot_bar_chart(...)eplot_line_chart(...). Questo ci evita di creare due file quasi identici.
- Nuovo File:
- Task 2.2: Aggiornamento del Pannello di Controllo Principale
- File da modificare:
fire/synapses/explorer/explorer_tab_widget.py - Azione:
- Aggiungeremo le due nuove opzioni (“Stagionalità Mensile”, “Rendimento per Giorno del Mese”) al
QComboBoxe al dizionarioanalysis_types. - Creeremo un’istanza del nostro nuovo
BarLineChartWidgete la aggiungeremo alloQStackedWidget.
- Aggiungeremo le due nuove opzioni (“Stagionalità Mensile”, “Rendimento per Giorno del Mese”) al
- File da modificare:
Capitolo 3: Integrazione e Flusso di Lavoro
- Obiettivo: Aggiornare il worker e le connessioni per gestire le nuove analisi.
- Task 3.1: Aggiornamento del
ExplorerWorker- File:
fire/synapses/explorer/explorer_worker.py - Azione:
- Modificheremo la logica di
runper controllare se l’analisi richiesta è una di quelle nuove. Se sì, dovrà richiedere i dati coninterval='1d'. - Aggiungeremo i nuovi
elifper chiamarecalculate_monthly_seasonalityecalculate_day_of_month_returns. - Impacchetteremo i risultati in dizionari con chiavi appropriate (es.
'monthly_seasonality_data').
- Modificheremo la logica di
- File:
- Task 3.2: Aggiornamento della Logica di Connessione
- File:
fire/synapses/explorer/explorer_tab_widget.py - Azione: Modificheremo lo slot
on_analysis_finishedper riconoscere le nuove chiavi nel dizionario dei risultati, mostrare la pagina corretta delloQStackedWidget(quella con ilBarLineChartWidget) e chiamare il metodo di plot appropriato (plot_bar_chartoplot_line_chart).
- File:
Prossimo Passo
Se questo piano ti convince, il nostro prossimo passo concreto sarà il Task 1.1: modificare l’AnalysisEngine per aggiungere il metodo calculate_monthly_seasonality.