GaetanoParente commited on
Commit
4bdde62
·
1 Parent(s): 2c267ea

aggiunto modulo forecasting e update sentiment con modello CNN

Browse files
.gitattributes CHANGED
@@ -2,3 +2,5 @@
2
  *.h5 filter=lfs diff=lfs merge=lfs -text
3
  multi-classification-tokenizer.json filter=lfs diff=lfs merge=lfs -text
4
  *.safetensors filter=lfs diff=lfs merge=lfs -text
 
 
 
2
  *.h5 filter=lfs diff=lfs merge=lfs -text
3
  multi-classification-tokenizer.json filter=lfs diff=lfs merge=lfs -text
4
  *.safetensors filter=lfs diff=lfs merge=lfs -text
5
+ data/model/sentiment_cnn/variables/* filter=lfs diff=lfs merge=lfs -text
6
+ *.pb filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -8,55 +8,72 @@ colorTo: purple
8
  pinned: false
9
  ---
10
 
11
- # 🚀 NGT AI Platform
12
 
13
- **NextGenTech AI Platform** è una suite modulare di Intelligenza Artificiale progettata per dimostrare capacità avanzate in ambito **NLP** (Natural Language Processing) e **Computer Vision**.
14
 
15
- La piattaforma è costruita con un'architettura ibrida che integra modelli **TensorFlow/Keras** (Legacy) e **PyTorch/Transformers** (NextGenTech), il tutto esposto tramite un'interfaccia web interattiva basata su **Gradio**.
16
 
17
- ![Platform UI](https://img.shields.io/badge/UI-Gradio-orange) ![Python](https://img.shields.io/badge/Python-3.10-blue) ![Framework](https://img.shields.io/badge/Hybrid-PyTorch%20%2B%20TensorFlow-purple)
18
 
19
  ---
20
 
21
- ## 🧩 Moduli Disponibili
22
 
23
- ### 1. 🧩 BPO Intelligent Dispatcher (NextGen)
24
- Un sistema avanzato per l'analisi dei ticket di assistenza clienti (Business Process Outsourcing).
25
- * **Tecnologia:** DistilBERT (Fine-tuned) + spaCy (NER) + Sentiment BPO Engine.
 
 
 
 
 
 
 
 
 
 
 
26
  * **Workflow:**
27
  1. **Intent Classification:** Riconosce l'intento (es. *Amministrazione*, *Supporto Tecnico*, *Churn*).
28
  2. **Smart Urgency:** Calcola la priorità incrociando gravità del problema, intento e Sentiment Score.
29
  3. **Action Recommendation:** Suggerisce l'azione di business concreta (es. *"Apertura Ticket JIRA L1"*, *"Alert Retention"*).
30
  4. **Hybrid NER:** Estrae ed evidenzia graficamente dati sensibili (Codici Cliente, Fatture, Email).
31
 
32
- ### 2. 🩻 Healthcare Diagnostics (Computer Vision)
33
- Suite di supporto diagnostico basata su Convolutional Neural Networks (CNN).
34
- * **Chest X-Ray Analyzer:**
35
- * **Obiettivo:** Screening rapido di patologie polmonari infettive
36
- * **Classi:** Il modello discrimina tra 4 stati: Rischio Polmonite, Rischio Tubercolosi, Negativo Polmonite, Negativo Tubercolosi.
37
- * **Architettura:** CNN custom addestrata su dataset radiografici pubblici (resize 224x224).
38
- * **Use Case:** Triage automatizzato per dare priorità ai casi sospetti in lista d'attesa.
39
- * **Diabetic Retinopathy Screening:**
40
- * **Obiettivo:** Analisi automatizzata del fondo oculare (Fundus Image) per individuare microaneurismi o emorragie tipiche della retinopatia.
41
- * **Output:** Fornisce una "Second Opinion" strutturata in due parti: Diagnosi Clinica (Presenza/Assenza) e Livello di Confidenza (%).
42
- * **Architettura:** Binary Classification CNN con preprocessing dell'immagine (Normalization & Resizing).
43
- * **Use Case:** Screening di massa preventivo per pazienti diabetici asintomatici.
44
-
45
- ### 3. 📢 NLP & Text Analysis
46
- Moduli di analisi semantica per l'automazione dei processi documentali.
47
- * **Smart Content Tagger (News Classification):**
48
- * **Obiettivo:** Categorizzazione automatica di flussi di notizie per redazioni e archivi digitali.
49
- * **Classi:** Il modello distingue tra Economia, Politica, Scienza & Tecnica, Sport, Storia.
50
- * **Architettura:** Rete Neurale ricorrente (Input Sequence Padding a 200 token) per catturare il contesto semantico oltre la semplice keyword density.
51
- * **Sentiment Analysis (BPO Edition):**
52
- * **Modello:** Rete neurale ottimizzata su dataset "Small Data" (1.2k esempi reali Helpdesk).
53
- * **Caratteristiche:** Calibrato per distinguere lamentele reali da falsi positivi (gestione avanzata di "router", "fattura" e negazioni).
54
- * **Integrazione:** Fornisce il punteggio emotivo al modulo BPO Dispatcher.
 
 
 
 
 
 
55
  ---
56
 
57
  ## 🛠️ Installazione
58
 
59
- Il progetto richiede **Python 3.10**. Si consiglia l'uso di un virtual environment.
60
 
61
  ### 1. Clona il repository
62
  ```bash
@@ -84,14 +101,22 @@ Nota: Il sistema scaricherà automaticamente anche il modello linguistico italia
84
 
85
  Affinché la piattaforma funzioni, è necessario posizionare i modelli addestrati nella cartella corretta. Assicurati che la struttura sia la seguente:
86
 
 
87
  ngt-ai-platform/
88
- ├── app.py # Entry point dell'applicazione
89
- ├── requirements.txt # Dipendenze
90
- ├── modules/ # Logica di business
 
 
 
 
 
91
  └── data/
92
- ├── model/ # CARTELLA MODELLI (Non versionata)
93
- ├── gallery/ # Immagini di esempio per la Demo
94
- └── tokenizer/ # tokenizer per la BinaryClassification e MultiClassification
 
 
95
 
96
  ### 🚀 Avvio Piattaforma
97
 
 
8
  pinned: false
9
  ---
10
 
11
+ # 🚀 NGT AI Platform (v2.0)
12
 
13
+ **NextGenTech AI Platform** è un orchestratore modulare di Intelligenza Artificiale progettato per ambienti Enterprise. Dimostra capacità avanzate in **NLP** (Natural Language Processing), **Predictive Analytics** e **Computer Vision**, integrate in una dashboard professionale.
14
 
15
+ La piattaforma adotta un'architettura ibrida (**TensorFlow/Keras** + **PyTorch** + **Scikit-Learn**) ed è stata aggiornata con una **UI/UX avanzata** basata su **Gradio 5**, caratterizzata da visualizzazioni interattive, gestione dello stato e navigazione contestuale.
16
 
17
+ ![Platform UI](https://img.shields.io/badge/UI-Gradio%205.x-orange) ![Python](https://img.shields.io/badge/Python-3.10-blue) ![Architecture](https://img.shields.io/badge/Hybrid-Multi%20Model-purple) ![License](https://img.shields.io/badge/License-Apache%202.0-green)
18
 
19
  ---
20
 
21
+ ## Key Features
22
 
23
+ Oltre ai modelli AI, la piattaforma implementa pattern di sviluppo Full Stack moderni:
24
+
25
+ * **📊 Interactive Dashboards:** Grafici dinamici (Plotly) con zoom, tooltip e selezione temporale per l'analisi dei dati.
26
+ * **🗂️ Context-Aware Sidebar:** La barra laterale cambia dinamicamente contenuto (cartelle e file) in base al Tab selezionato.
27
+ * **🔄 Dynamic Backtesting:** Il modulo di forecasting si adatta automaticamente alla quantità di dati storici forniti, separando training e test set al volo.
28
+ * **🖱️ Click-to-Load System:** Caricamento istantaneo dei file di test cliccando direttamente nella sidebar.
29
+
30
+ ---
31
+
32
+ ## 🧩 Moduli AI Disponibili
33
+
34
+ ### 1. 🎧 BPO Intelligent Dispatcher (NextGen)
35
+ Il cuore della piattaforma per l'automazione dell'Assistenza Clienti.
36
+ * **Tecnologia:** DistilBERT (Fine-tuned) + spaCy (NER) + Custom Logic.
37
  * **Workflow:**
38
  1. **Intent Classification:** Riconosce l'intento (es. *Amministrazione*, *Supporto Tecnico*, *Churn*).
39
  2. **Smart Urgency:** Calcola la priorità incrociando gravità del problema, intento e Sentiment Score.
40
  3. **Action Recommendation:** Suggerisce l'azione di business concreta (es. *"Apertura Ticket JIRA L1"*, *"Alert Retention"*).
41
  4. **Hybrid NER:** Estrae ed evidenzia graficamente dati sensibili (Codici Cliente, Fatture, Email).
42
 
43
+ ### 2. 🔮 AI Workforce Forecaster
44
+ Modulo di pianificazione predittiva.
45
+ * **Obiettivo:** Superare i limiti dei modelli statistici classici (Erlang-C) utilizzando il Machine Learning per prevedere i volumi di traffico.
46
+ * **Tecnologia:** Random Forest Regressor + Plotly (Visualizzazione).
47
+ * **Funzionalità Chiave:**
48
+ * **Dynamic Backtesting:** Il sistema apprende dalle prime *n-1* settimane caricate e verifica la precisione sull'ultima settimana (Ground Truth).
49
+ * **Seasonality Awareness:** Il modello cattura automaticamente pattern orari (picchi 10:00/16:00), giornalieri (Lunedì vs Weekend) e trend settimanali.
50
+ * **Interactive Dashboard:** Grafico interattivo che permette di zoomare su specifici intervalli orari e confrontare visivamente la curva *Reale* con quella *Pianificata* (AI).
51
+
52
+ ### 3. 📢 Sentiment Analysis (BPO Edition)
53
+ * **Specializzazione:** Modello di rete neurale addestrato su dataset "Small Data" (1.2k esempi reali Helpdesk).
54
+ * **Caratteristiche:** Calibrato specificamente per evitare falsi positivi su termini tecnici (es. "guasto", "disdetta") che i modelli generici fraintendono.
55
+ * **Integrazione:** Fornisce il punteggio emotivo utilizzato dal *BPO Dispatcher* per il calcolo dell'urgenza.
56
+
57
+ ### 4. 📰 Smart Content Tagger (News)
58
+ * **Obiettivo:** Assistente editoriale per la categorizzazione automatica di flussi di notizie.
59
+ * **Classi:** *Economia, Politica, Scienza, Sport, Storia*.
60
+ * **Architettura:** Deep Learning su sequenze di testo (Embedding layer + Global Average Pooling).
61
+
62
+ ### 5. 🩻 Chest X-Ray Analyzer (Computer Vision)
63
+ Supporto decisionale per il triage radiologico.
64
+ * **Obiettivo:** Screening rapido di patologie polmonari.
65
+ * **Classi:** *Rischio Polmonite*, *Rischio Tubercolosi*, *Negativo Polmonite*, *Negativo Tubercolosi*.
66
+ * **Architettura:** CNN custom addestrata su dataset radiografici pubblici (resize 224x224).
67
+
68
+ ### 6. 👁️ Diabetic Retinopathy Screening
69
+ * **Obiettivo:** Analisi automatizzata del fondo oculare (Fundus Image) per screening preventivo.
70
+ * **Output Avanzato:** Restituisce una **Diagnosi Clinica** (Presenza/Assenza) separata dal **Livello di Confidenza** (%).
71
+
72
  ---
73
 
74
  ## 🛠️ Installazione
75
 
76
+ Il progetto richiede **Python 3.10**.
77
 
78
  ### 1. Clona il repository
79
  ```bash
 
101
 
102
  Affinché la piattaforma funzioni, è necessario posizionare i modelli addestrati nella cartella corretta. Assicurati che la struttura sia la seguente:
103
 
104
+ ```bash
105
  ngt-ai-platform/
106
+ ├── app.py # Entry point (Gradio UI & Event Logic)
107
+ ├── style.css # Foglio di stile CSS (Layout & Design)
108
+ ├── requirements.txt # Dipendenze Python
109
+ ├── modules/
110
+ │ ├── utilities/ # Utils (Loader, Sidebar Logic, HTML Render)
111
+ │ ├── forecasting.py # Logica ML per il forecasting
112
+ │ ├── bpo_dispatcher.py # Business Logic BPO
113
+ │ └── ... # Altri moduli di classificazione
114
  └── data/
115
+ ├── model/ # Modelli .h5 e .bin (Non versionati)
116
+ ├── export/ # CSV generati per il modulo Forecaster
117
+ ├── gallery/ # Dataset Demo (xray, retinopaty, ecc.)
118
+ └── tokenizer/ # Tokenizer JSON per i modelli Keras
119
+ ```
120
 
121
  ### 🚀 Avvio Piattaforma
122
 
app.py CHANGED
@@ -1,11 +1,13 @@
1
  import gradio as gr
2
  import cv2
 
3
  import modules.utilities.utils as utils
4
  from modules.binary_classification import binary_classification as binary
5
  from modules.image_classification import image_classification as image
6
  from modules.multilabel_classification import multi_classification as multi
7
  from modules.retina import predict_diabetic_retinopathy as retina_detector
8
  from modules.bpo_dispatcher import predict_bpo_ticket
 
9
 
10
  # --- CONFIGURAZIONE TEMA ---
11
  theme = gr.themes.Soft(
@@ -21,6 +23,27 @@ theme = gr.themes.Soft(
21
  PATH_ROOT = "./data/gallery"
22
  PATH_RETINA = "./data/gallery/retinopaty"
23
  PATH_XRAY = "./data/gallery/xray"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
  def binary_classification(text):
26
  if text.strip(): return binary(text)
@@ -105,10 +128,12 @@ with gr.Blocks(title="NGT AI Platform", theme=theme, css_paths="style.css") as d
105
  with gr.Column(scale=1, elem_classes="header-text-col"):
106
  gr.Markdown("""<h1>AI Platform</h1><div class='subheader'>Advanced Machine Learning Solutions</div>""")
107
 
108
- # --- TAB 1: BPO INTELLIGENT DISPATCHER ---
109
  with gr.Tab("🧩 BPO Dispatcher") as tab_bpo:
110
- gr.Markdown("### Intelligent Ticket Routing & NER")
111
- gr.Markdown("Sistema proprietario per l'analisi automatica dei ticket di assistenza. Il modello identifica l'intento, l'urgenza e i dati sensibili del cliente.")
 
 
112
 
113
  with gr.Row(elem_classes="responsive-row"):
114
  # INPUT
@@ -149,72 +174,100 @@ with gr.Blocks(title="NGT AI Platform", theme=theme, css_paths="style.css") as d
149
  inputs=bpo_input,
150
  outputs=[bpo_intent_output, bpo_urgency_output, bpo_action_output, bpo_ner_output]
151
  )
152
-
153
- # --- TAB 2: Chest X-Ray Diagnostics ---
154
- with gr.Tab("🩻 Chest X-Ray Diagnostics") as tab_xray:
155
-
156
- # 1. DISCLAIMER MEDICO (Fondamentale)
157
  gr.Markdown("""
158
- # 🩻 Analisi Radiografica Toracica (Supporto Decisionale)
159
-
160
- **DISCLAIMER:** Questo modulo è un prototipo di ricerca AI. **NON sostituisce il parere di un medico.**
161
- Il sistema è addestrato per identificare pattern visivi associati a:
162
- * **Polmonite** (Pneumonia)
163
- * **Tubercolosi** (Tuberculosis)
164
-
165
- *Caricare solo immagini radiografiche frontali (Chest X-Ray) o utilizzare gli esempi recuperabili nella sidebar laterale.*
166
  """)
167
 
168
  with gr.Row():
169
- # COLONNA INPUT
170
- with gr.Column(scale=1):
171
- image_input = gr.Image(type="numpy", label="Carica Radiografia", height=400)
172
- analyze_btn_img = gr.Button("🏥 Avvia Diagnosi AI", variant="primary")
173
-
174
- # COLONNA OUTPUT
175
  with gr.Column(scale=1):
176
  with gr.Group():
177
- gr.Markdown("#### 📋 Referto AI", elem_classes="h4-margin")
178
- output_label = gr.Label(num_top_classes=4, label="Probabilità Patologia")
 
 
 
179
 
180
- analyze_btn_img.click(image, inputs=image_input, outputs=output_label)
181
-
182
- # --- TAB 3: Diabetic Retinopathy ---
183
- with gr.Tab("👁️ Diabetic Retinopathy") as tab_retina:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  gr.Markdown("""
185
- # 👁️ Screening Retinopatia Diabetica
186
- **DISCLAIMER:** Questo modulo è un prototipo di ricerca AI. **NON sostituisce il parere di un medico.** Sistema di supporto decisionale. Analizza scansioni del fondo oculare.
 
187
 
188
- *Caricare solo immagini di retinografie digitali o utilizzare gli esempi recuperabili nella sidebar laterale.*
 
 
 
189
  """)
190
 
 
 
 
 
 
 
 
 
 
 
 
191
  with gr.Row():
192
- # COLONNA INPUT
193
- with gr.Column(scale=1):
194
- image_input_dr = gr.Image(
195
- type="numpy",
196
- label="Carica Scansione Retinica",
197
- height=400,
198
- sources=["upload", "clipboard"]
199
  )
200
- analyze_btn_dr = gr.Button("🏥 Analisi Fondo Oculare", variant="primary")
201
-
202
- # COLONNA OUTPUT
203
- with gr.Column(scale=1):
204
- with gr.Group():
205
- gr.Markdown("### 📋 Esito Screening", elem_classes="h4-margin")
206
- # Output 1: La Diagnosi (Testo)
207
- output_dr_diagnosis = gr.Label(label="Diagnosi AI")
208
- # Output 2: La Percentuale (Testo/Numero)
209
- output_dr_prob = gr.Label(label="Livello di Confidenza (Rischio)")
210
 
211
- analyze_btn_dr.click(
212
- retina_detector,
213
- inputs=image_input_dr,
214
- outputs=[output_dr_diagnosis, output_dr_prob]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  )
216
-
217
- # --- TAB 4: News Classification (AI Editor) ---
218
  with gr.Tab("📰 Smart Content Tagger") as tab_news:
219
 
220
  # 1. HEADER & CONTESTO
@@ -259,67 +312,72 @@ with gr.Blocks(title="NGT AI Platform", theme=theme, css_paths="style.css") as d
259
  multi_output = gr.Label(num_top_classes=5, label="Confidenza del Modello")
260
 
261
  analyze_btn_multi.click(multi, inputs=multi_input, outputs=multi_output)
262
-
263
- # --- TAB 5: Sentiment Analysis (BPO) ---
264
- with gr.Tab("📢 Sentiment Analysis (BPO)") as tab_sentiment:
265
 
266
- # 1. HEADER E GUIDA UTENTE
267
  gr.Markdown("""
268
- # 😠/😍 Analizzatore di Sentiment (Dominio Helpdesk)
269
-
270
- **ATTENZIONE:** Questo modello è **altamente specializzato** nel dominio dell'Assistenza Clienti (Telco/Energy).
271
 
272
- * ✅ **Usa questo modulo per:** Ticket di guasti, lamentele amministrative, feedback su operatori, richieste di disdetta.
273
- * ❌ **NON usare questo modulo per:** Frasi generiche ("Il cielo è blu"), recensioni di film, o linguaggio comune non tecnico.
 
 
274
 
275
- _Il modello potrebbe interpretare frasi generiche positive come negative se non contengono parole chiave del suo vocabolario specifico._
276
  """)
277
 
278
- # 2. DETTAGLI TECNICI (Nascosti in un Accordion per pulizia)
279
- with gr.Accordion("ℹ️ Come funziona questo modello?", open=False):
280
- gr.Markdown("""
281
- Questo sistema utilizza una rete neurale leggera addestrata su un dataset proprietario di **1.200 interazioni reali** cliente-operatore.
282
-
283
- * **Preprocessing:** Lemmatizzazione Spacy + Rimozione Stopwords (con Whitelist per le negazioni).
284
- * **Architettura:** Dense Neural Network con Dropout e L2 Regularization.
285
- * **Focus:** È calibrato per rilevare l'urgenza nascosta anche in frasi apparentemente calme.
286
- """)
287
-
288
- # 3. INTERFACCIA
289
  with gr.Row():
290
- with gr.Column():
291
- # Input Text
292
- sentiment_input = gr.Textbox(
293
- label="Inserisci il testo del ticket o della mail",
294
- placeholder="Es: Non funziona internet e nessuno mi risponde...",
295
- lines=3
296
- )
 
 
 
297
 
298
- # ESEMPI CLICCABILI (Fondamentali per guidare l'utente!)
299
- gr.Examples(
300
- examples=[
301
- ["L'assistenza ricevuta è stata pessima, sono deluso."],
302
- ["Il router funziona benissimo, grazie per la velocità."],
303
- ["Non ho ancora ricevuto la fattura di gennaio."],
304
- ["Sono due giorni che ho la linea ferma, è inaccettabile!"],
305
- ["L'operatore Marco è stato gentilissimo e ha risolto tutto."]
306
- ],
307
- inputs=sentiment_input,
308
- label="Prova questi esempi BPO:"
 
 
 
 
 
 
 
 
 
309
  )
 
 
 
 
 
 
 
 
 
 
310
 
311
- sentiment_btn = gr.Button("Analizza Sentiment", variant="primary")
312
-
313
- with gr.Column():
314
- # Output Label (Percentuali)
315
- sentiment_output = gr.Label(num_top_classes=2, label="Risultato Analisi")
316
-
317
- # 4. COLLEGAMENTO FUNZIONE
318
- sentiment_btn.click(
319
- fn=binary,
320
- inputs=sentiment_input,
321
- outputs=sentiment_output
322
  )
 
323
 
324
  ui_outputs = [main_sidebar, sidebar_explorer, image_input, image_input_dr]
325
 
@@ -327,39 +385,42 @@ with gr.Blocks(title="NGT AI Platform", theme=theme, css_paths="style.css") as d
327
  sidebar_explorer.change(
328
  fn=utils.global_file_loader,
329
  inputs=sidebar_explorer,
330
- outputs=[bpo_input, image_input, image_input_dr, multi_input, sentiment_input]
331
  )
332
 
333
- # 2. DEFINIZIONE DEL RESET TOTALE
334
  # Questa funzione restituisce valori "vuoti" per tutti i campi sensibili
335
  def reset_all_fields():
336
  return (
337
- None, # bpo_input (Textbox)
338
- None, # bpo_intent (Label)
339
- None, # bpo_urgency (Textbox)
340
- None, # bpo_action (Textbox)
341
- None, # bpo_ner (HTML)
342
- None, # image_input (Image Xray)
343
- None, # output_label (Label Xray)
344
- None, # image_input_dr (Image Retina)
345
- None, # output_dr_diag (Label Retina)
346
- None, # output_dr_prob (Label Retina)
347
- None, # multi_input (Textbox News)
348
- None, # multi_output (Label News)
349
- None, # sentiment_input (Textbox)
350
- None # sentiment_output (Label)
 
 
 
351
  )
352
 
353
- # Lista ordinata di TUTTI gli output da pulire
354
- # DEVE corrispondere esattamente all'ordine del return sopra!
355
  reset_outputs = [
356
  bpo_input, bpo_intent_output, bpo_urgency_output, bpo_action_output, bpo_ner_output,
 
357
  image_input, output_label,
358
  image_input_dr, output_dr_diagnosis, output_dr_prob,
359
  multi_input, multi_output,
360
  sentiment_input, sentiment_output
361
  ]
362
 
 
363
  # 3. GESTIONE CAMBIO TAB (RESET + SIDEBAR)
364
 
365
  # Per i Tab NLP: Disabilita Sidebar + Resetta TUTTO
@@ -370,6 +431,14 @@ with gr.Blocks(title="NGT AI Platform", theme=theme, css_paths="style.css") as d
370
  fn=reset_all_fields, outputs=reset_outputs
371
  )
372
 
 
 
 
 
 
 
 
 
373
  tab_news.select(
374
  fn=utils.disable_sidebar,
375
  outputs=ui_outputs
 
1
  import gradio as gr
2
  import cv2
3
+ import os
4
  import modules.utilities.utils as utils
5
  from modules.binary_classification import binary_classification as binary
6
  from modules.image_classification import image_classification as image
7
  from modules.multilabel_classification import multi_classification as multi
8
  from modules.retina import predict_diabetic_retinopathy as retina_detector
9
  from modules.bpo_dispatcher import predict_bpo_ticket
10
+ import modules.forecasting as forecast
11
 
12
  # --- CONFIGURAZIONE TEMA ---
13
  theme = gr.themes.Soft(
 
23
  PATH_ROOT = "./data/gallery"
24
  PATH_RETINA = "./data/gallery/retinopaty"
25
  PATH_XRAY = "./data/gallery/xray"
26
+ PATH_FORECAST = "./data/export"
27
+
28
+ # Crea cartella e file demo se non esistono
29
+ if not os.path.exists(PATH_FORECAST):
30
+ os.makedirs(PATH_FORECAST)
31
+
32
+ demo_csv_path = os.path.join(PATH_FORECAST, "plan_sample.csv")
33
+
34
+ # Se il file non esiste, ORA generiamo 4 settimane di dati procedurali
35
+ if not os.path.exists(demo_csv_path):
36
+ csv_content = forecast.generate_mock_export()
37
+ with open(demo_csv_path, "w") as f:
38
+ f.write(csv_content)
39
+
40
+ def forecast_logic(file):
41
+ if file is None: raise gr.Error("Carica un file CSV")
42
+ if isinstance(file, list): file = file[0]
43
+
44
+ img, text = forecast.predict_workload(file)
45
+ if img is None: raise gr.Error(text)
46
+ return img, text
47
 
48
  def binary_classification(text):
49
  if text.strip(): return binary(text)
 
128
  with gr.Column(scale=1, elem_classes="header-text-col"):
129
  gr.Markdown("""<h1>AI Platform</h1><div class='subheader'>Advanced Machine Learning Solutions</div>""")
130
 
131
+ # --- BPO INTELLIGENT DISPATCHER ---
132
  with gr.Tab("🧩 BPO Dispatcher") as tab_bpo:
133
+ gr.Markdown("""
134
+ # 🧩 Intelligent Ticket Routing & NER
135
+ Sistema proprietario per l'analisi automatica dei ticket di assistenza. Il modello identifica l'intento, l'urgenza e i dati sensibili del cliente.
136
+ """)
137
 
138
  with gr.Row(elem_classes="responsive-row"):
139
  # INPUT
 
174
  inputs=bpo_input,
175
  outputs=[bpo_intent_output, bpo_urgency_output, bpo_action_output, bpo_ner_output]
176
  )
177
+
178
+ # --- AI FORECASTER ---
179
+ with gr.Tab("🔮 AI Forecaster") as tab_forecast:
 
 
180
  gr.Markdown("""
181
+ # 🔮 AI Brain: Predictive Planning
182
+ Modulo interattivo per la pianificazione dei turni. Confronta in tempo reale il forecast AI con i dati storici effettivi.
 
 
 
 
 
 
183
  """)
184
 
185
  with gr.Row():
 
 
 
 
 
 
186
  with gr.Column(scale=1):
187
  with gr.Group():
188
+ gr.Markdown("### 1. Configurazione")
189
+ with gr.Row():
190
+ gr.Dropdown(["Customer Care"], label="Business Unit", value="Customer Care")
191
+ gr.Dropdown(["Ass. Tecnica"], label="Reparto", value="Ass. Tecnica")
192
+ gr.Dropdown(["Inbound Calls"], label="Attività", value="Inbound Calls")
193
 
194
+ gr.Markdown("### 2. Dati Storici")
195
+ forecast_file = gr.File(label="Seleziona Export (.csv)", file_types=[".csv"], height=100, interactive=False)
196
+ forecast_btn = gr.Button("🔮 Genera Grafico Interattivo", variant="primary")
197
+
198
+ with gr.Column(scale=3):
199
+ gr.Markdown("### 📊 Dashboard Interattiva")
200
+ forecast_plot = gr.Plot(label="Analisi Volumi")
201
+ forecast_stats = gr.Textbox(label="KPI Backtesting", lines=4)
202
+
203
+ forecast_btn.click(
204
+ forecast_logic,
205
+ inputs=forecast_file,
206
+ outputs=[forecast_plot, forecast_stats]
207
+ )
208
+
209
+ # --- Sentiment Analysis (BPO) ---
210
+ with gr.Tab("📢 Sentiment Analysis (BPO)") as tab_sentiment:
211
+
212
+ # 1. HEADER E GUIDA UTENTE
213
  gr.Markdown("""
214
+ # 😠/😍 Analizzatore di Sentiment (Dominio Helpdesk)
215
+
216
+ **ATTENZIONE:** Questo modello è **altamente specializzato** nel dominio dell'Assistenza Clienti (Telco/Energy).
217
 
218
+ * **Usa questo modulo per:** Ticket di guasti, lamentele amministrative, feedback su operatori, richieste di disdetta.
219
+ * ❌ **NON usare questo modulo per:** Frasi generiche ("Il cielo è blu"), recensioni di film, o linguaggio comune non tecnico.
220
+
221
+ _Il modello potrebbe interpretare frasi generiche positive come negative se non contengono parole chiave del suo vocabolario specifico._
222
  """)
223
 
224
+ # 2. DETTAGLI TECNICI (Nascosti in un Accordion per pulizia)
225
+ with gr.Accordion("ℹ️ Come funziona questo modello?", open=False):
226
+ gr.Markdown("""
227
+ Questo sistema utilizza una rete neurale leggera addestrata su un dataset proprietario di **1.200 interazioni reali** cliente-operatore.
228
+
229
+ * **Preprocessing:** Lemmatizzazione Spacy + Rimozione Stopwords (con Whitelist per le negazioni).
230
+ * **Architettura:** Dense Neural Network con Dropout e L2 Regularization.
231
+ * **Focus:** È calibrato per rilevare l'urgenza nascosta anche in frasi apparentemente calme.
232
+ """)
233
+
234
+ # 3. INTERFACCIA
235
  with gr.Row():
236
+ with gr.Column():
237
+ # Input Text
238
+ sentiment_input = gr.Textbox(
239
+ label="Inserisci il testo del ticket o della mail",
240
+ placeholder="Es: Non funziona internet e nessuno mi risponde...",
241
+ lines=3
 
242
  )
 
 
 
 
 
 
 
 
 
 
243
 
244
+ # ESEMPI CLICCABILI (Fondamentali per guidare l'utente!)
245
+ gr.Examples(
246
+ examples=[
247
+ ["L'assistenza ricevuta è stata pessima, sono deluso."],
248
+ ["Il router funziona benissimo, grazie per la velocità."],
249
+ ["Non ho ancora ricevuto la fattura di gennaio."],
250
+ ["Sono due giorni che ho la linea ferma, è inaccettabile!"],
251
+ ["L'operatore Marco è stato gentilissimo e ha risolto tutto."]
252
+ ],
253
+ inputs=sentiment_input,
254
+ label="Prova questi esempi BPO:"
255
+ )
256
+
257
+ sentiment_btn = gr.Button("Analizza Sentiment", variant="primary")
258
+
259
+ with gr.Column():
260
+ # Output Label (Percentuali)
261
+ sentiment_output = gr.Label(num_top_classes=2, label="Risultato Analisi")
262
+
263
+ # 4. COLLEGAMENTO FUNZIONE
264
+ sentiment_btn.click(
265
+ fn=binary,
266
+ inputs=sentiment_input,
267
+ outputs=sentiment_output
268
  )
269
+
270
+ # --- News Classification (AI Editor) ---
271
  with gr.Tab("📰 Smart Content Tagger") as tab_news:
272
 
273
  # 1. HEADER & CONTESTO
 
312
  multi_output = gr.Label(num_top_classes=5, label="Confidenza del Modello")
313
 
314
  analyze_btn_multi.click(multi, inputs=multi_input, outputs=multi_output)
315
+
316
+ # --- Chest X-Ray Diagnostics ---
317
+ with gr.Tab("🩻 Chest X-Ray Diagnostics") as tab_xray:
318
 
319
+ # 1. DISCLAIMER MEDICO (Fondamentale)
320
  gr.Markdown("""
321
+ # 🩻 Analisi Radiografica Toracica (Supporto Decisionale)
 
 
322
 
323
+ **DISCLAIMER:** Questo modulo è un prototipo di ricerca AI. **NON sostituisce il parere di un medico.**
324
+ Il sistema è addestrato per identificare pattern visivi associati a:
325
+ * **Polmonite** (Pneumonia)
326
+ * **Tubercolosi** (Tuberculosis)
327
 
328
+ *Utilizzare gli esempi di radiografiche frontali (Chest X-Ray) recuperabili nella sidebar laterale.*
329
  """)
330
 
 
 
 
 
 
 
 
 
 
 
 
331
  with gr.Row():
332
+ # COLONNA INPUT
333
+ with gr.Column(scale=1):
334
+ image_input = gr.Image(type="numpy", label="Seleziona Radiografia", height=400, interactive=False)
335
+ analyze_btn_img = gr.Button("🏥 Avvia Diagnosi AI", variant="primary")
336
+
337
+ # COLONNA OUTPUT
338
+ with gr.Column(scale=1):
339
+ with gr.Group():
340
+ gr.Markdown("#### 📋 Referto AI", elem_classes="h4-margin")
341
+ output_label = gr.Label(num_top_classes=4, label="Probabilità Patologia")
342
 
343
+ analyze_btn_img.click(image, inputs=image_input, outputs=output_label)
344
+
345
+ # --- Diabetic Retinopathy ---
346
+ with gr.Tab("👁️ Diabetic Retinopathy") as tab_retina:
347
+ gr.Markdown("""
348
+ # 👁️ Screening Retinopatia Diabetica
349
+ **DISCLAIMER:** Questo modulo è un prototipo di ricerca AI. **NON sostituisce il parere di un medico.** Sistema di supporto decisionale. Analizza scansioni del fondo oculare.
350
+
351
+ *Utilizzare gli esempi di retinografie digitali recuperabili nella sidebar laterale.*
352
+ """)
353
+
354
+ with gr.Row():
355
+ # COLONNA INPUT
356
+ with gr.Column(scale=1):
357
+ image_input_dr = gr.Image(
358
+ type="numpy",
359
+ label="Seleziona Scansione Retinica",
360
+ height=400,
361
+ sources=["upload", "clipboard"],
362
+ interactive=False
363
  )
364
+ analyze_btn_dr = gr.Button("🏥 Analisi Fondo Oculare", variant="primary")
365
+
366
+ # COLONNA OUTPUT
367
+ with gr.Column(scale=1):
368
+ with gr.Group():
369
+ gr.Markdown("### 📋 Esito Screening", elem_classes="h4-margin")
370
+ # Output 1: La Diagnosi (Testo)
371
+ output_dr_diagnosis = gr.Label(label="Diagnosi AI")
372
+ # Output 2: La Percentuale (Testo/Numero)
373
+ output_dr_prob = gr.Label(label="Livello di Confidenza (Rischio)")
374
 
375
+ analyze_btn_dr.click(
376
+ retina_detector,
377
+ inputs=image_input_dr,
378
+ outputs=[output_dr_diagnosis, output_dr_prob]
 
 
 
 
 
 
 
379
  )
380
+
381
 
382
  ui_outputs = [main_sidebar, sidebar_explorer, image_input, image_input_dr]
383
 
 
385
  sidebar_explorer.change(
386
  fn=utils.global_file_loader,
387
  inputs=sidebar_explorer,
388
+ outputs=[bpo_input, forecast_file, image_input, image_input_dr, multi_input, sentiment_input]
389
  )
390
 
391
+ # 2. ESET TOTALE
392
  # Questa funzione restituisce valori "vuoti" per tutti i campi sensibili
393
  def reset_all_fields():
394
  return (
395
+ None, # 1. bpo_input
396
+ None, # 2. bpo_intent
397
+ None, # 3. bpo_urgency
398
+ None, # 4. bpo_action
399
+ None, # 5. bpo_ner
400
+ None, # 6. forecast_file
401
+ None, # 7. forecast_plot
402
+ None, # 8. forecast_stats
403
+ None, # 9. image_input
404
+ None, # 10. output_label
405
+ None, # 11. image_input_dr
406
+ None, # 12. output_dr_diag
407
+ None, # 13. output_dr_prob
408
+ None, # 14. multi_input
409
+ None, # 15. multi_output
410
+ None, # 16. sentiment_input
411
+ None # 17. sentiment_output
412
  )
413
 
 
 
414
  reset_outputs = [
415
  bpo_input, bpo_intent_output, bpo_urgency_output, bpo_action_output, bpo_ner_output,
416
+ forecast_file, forecast_plot, forecast_stats,
417
  image_input, output_label,
418
  image_input_dr, output_dr_diagnosis, output_dr_prob,
419
  multi_input, multi_output,
420
  sentiment_input, sentiment_output
421
  ]
422
 
423
+
424
  # 3. GESTIONE CAMBIO TAB (RESET + SIDEBAR)
425
 
426
  # Per i Tab NLP: Disabilita Sidebar + Resetta TUTTO
 
431
  fn=reset_all_fields, outputs=reset_outputs
432
  )
433
 
434
+ tab_forecast.select(
435
+ fn=lambda: utils.enable_sidebar(PATH_FORECAST),
436
+ outputs=ui_outputs
437
+ ).then(
438
+ fn=reset_all_fields,
439
+ outputs=reset_outputs
440
+ )
441
+
442
  tab_news.select(
443
  fn=utils.disable_sidebar,
444
  outputs=ui_outputs
data/export/plan_sample.csv ADDED
@@ -0,0 +1,2689 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Timestamp,Volume
2
+ 2025-05-05 00:00:00,1
3
+ 2025-05-05 00:15:00,12
4
+ 2025-05-05 00:30:00,6
5
+ 2025-05-05 00:45:00,0
6
+ 2025-05-05 01:00:00,7
7
+ 2025-05-05 01:15:00,8
8
+ 2025-05-05 01:30:00,9
9
+ 2025-05-05 01:45:00,3
10
+ 2025-05-05 02:00:00,0
11
+ 2025-05-05 02:15:00,4
12
+ 2025-05-05 02:30:00,0
13
+ 2025-05-05 02:45:00,0
14
+ 2025-05-05 03:00:00,10
15
+ 2025-05-05 03:15:00,0
16
+ 2025-05-05 03:30:00,5
17
+ 2025-05-05 03:45:00,7
18
+ 2025-05-05 04:00:00,8
19
+ 2025-05-05 04:15:00,12
20
+ 2025-05-05 04:30:00,1
21
+ 2025-05-05 04:45:00,0
22
+ 2025-05-05 05:00:00,12
23
+ 2025-05-05 05:15:00,2
24
+ 2025-05-05 05:30:00,5
25
+ 2025-05-05 05:45:00,8
26
+ 2025-05-05 06:00:00,4
27
+ 2025-05-05 06:15:00,7
28
+ 2025-05-05 06:30:00,0
29
+ 2025-05-05 06:45:00,0
30
+ 2025-05-05 07:00:00,10
31
+ 2025-05-05 07:15:00,21
32
+ 2025-05-05 07:30:00,15
33
+ 2025-05-05 07:45:00,11
34
+ 2025-05-05 08:00:00,76
35
+ 2025-05-05 08:15:00,72
36
+ 2025-05-05 08:30:00,73
37
+ 2025-05-05 08:45:00,72
38
+ 2025-05-05 09:00:00,68
39
+ 2025-05-05 09:15:00,71
40
+ 2025-05-05 09:30:00,75
41
+ 2025-05-05 09:45:00,80
42
+ 2025-05-05 10:00:00,128
43
+ 2025-05-05 10:15:00,121
44
+ 2025-05-05 10:30:00,117
45
+ 2025-05-05 10:45:00,122
46
+ 2025-05-05 11:00:00,120
47
+ 2025-05-05 11:15:00,125
48
+ 2025-05-05 11:30:00,126
49
+ 2025-05-05 11:45:00,127
50
+ 2025-05-05 12:00:00,73
51
+ 2025-05-05 12:15:00,76
52
+ 2025-05-05 12:30:00,67
53
+ 2025-05-05 12:45:00,74
54
+ 2025-05-05 13:00:00,57
55
+ 2025-05-05 13:15:00,63
56
+ 2025-05-05 13:30:00,54
57
+ 2025-05-05 13:45:00,49
58
+ 2025-05-05 14:00:00,80
59
+ 2025-05-05 14:15:00,75
60
+ 2025-05-05 14:30:00,67
61
+ 2025-05-05 14:45:00,73
62
+ 2025-05-05 15:00:00,115
63
+ 2025-05-05 15:15:00,107
64
+ 2025-05-05 15:30:00,103
65
+ 2025-05-05 15:45:00,109
66
+ 2025-05-05 16:00:00,115
67
+ 2025-05-05 16:15:00,117
68
+ 2025-05-05 16:30:00,110
69
+ 2025-05-05 16:45:00,111
70
+ 2025-05-05 17:00:00,75
71
+ 2025-05-05 17:15:00,67
72
+ 2025-05-05 17:30:00,73
73
+ 2025-05-05 17:45:00,70
74
+ 2025-05-05 18:00:00,72
75
+ 2025-05-05 18:15:00,73
76
+ 2025-05-05 18:30:00,75
77
+ 2025-05-05 18:45:00,77
78
+ 2025-05-05 19:00:00,78
79
+ 2025-05-05 19:15:00,78
80
+ 2025-05-05 19:30:00,68
81
+ 2025-05-05 19:45:00,69
82
+ 2025-05-05 20:00:00,77
83
+ 2025-05-05 20:15:00,67
84
+ 2025-05-05 20:30:00,75
85
+ 2025-05-05 20:45:00,76
86
+ 2025-05-05 21:00:00,69
87
+ 2025-05-05 21:15:00,73
88
+ 2025-05-05 21:30:00,70
89
+ 2025-05-05 21:45:00,78
90
+ 2025-05-05 22:00:00,18
91
+ 2025-05-05 22:15:00,20
92
+ 2025-05-05 22:30:00,10
93
+ 2025-05-05 22:45:00,8
94
+ 2025-05-05 23:00:00,11
95
+ 2025-05-05 23:15:00,16
96
+ 2025-05-05 23:30:00,13
97
+ 2025-05-05 23:45:00,7
98
+ 2025-05-06 00:00:00,10
99
+ 2025-05-06 00:15:00,1
100
+ 2025-05-06 00:30:00,0
101
+ 2025-05-06 00:45:00,2
102
+ 2025-05-06 01:00:00,0
103
+ 2025-05-06 01:15:00,1
104
+ 2025-05-06 01:30:00,1
105
+ 2025-05-06 01:45:00,9
106
+ 2025-05-06 02:00:00,11
107
+ 2025-05-06 02:15:00,10
108
+ 2025-05-06 02:30:00,10
109
+ 2025-05-06 02:45:00,1
110
+ 2025-05-06 03:00:00,6
111
+ 2025-05-06 03:15:00,10
112
+ 2025-05-06 03:30:00,0
113
+ 2025-05-06 03:45:00,0
114
+ 2025-05-06 04:00:00,0
115
+ 2025-05-06 04:15:00,8
116
+ 2025-05-06 04:30:00,2
117
+ 2025-05-06 04:45:00,1
118
+ 2025-05-06 05:00:00,3
119
+ 2025-05-06 05:15:00,1
120
+ 2025-05-06 05:30:00,7
121
+ 2025-05-06 05:45:00,4
122
+ 2025-05-06 06:00:00,11
123
+ 2025-05-06 06:15:00,5
124
+ 2025-05-06 06:30:00,7
125
+ 2025-05-06 06:45:00,7
126
+ 2025-05-06 07:00:00,16
127
+ 2025-05-06 07:15:00,12
128
+ 2025-05-06 07:30:00,9
129
+ 2025-05-06 07:45:00,8
130
+ 2025-05-06 08:00:00,80
131
+ 2025-05-06 08:15:00,78
132
+ 2025-05-06 08:30:00,69
133
+ 2025-05-06 08:45:00,77
134
+ 2025-05-06 09:00:00,68
135
+ 2025-05-06 09:15:00,67
136
+ 2025-05-06 09:30:00,74
137
+ 2025-05-06 09:45:00,71
138
+ 2025-05-06 10:00:00,119
139
+ 2025-05-06 10:15:00,122
140
+ 2025-05-06 10:30:00,123
141
+ 2025-05-06 10:45:00,124
142
+ 2025-05-06 11:00:00,126
143
+ 2025-05-06 11:15:00,121
144
+ 2025-05-06 11:30:00,118
145
+ 2025-05-06 11:45:00,115
146
+ 2025-05-06 12:00:00,68
147
+ 2025-05-06 12:15:00,73
148
+ 2025-05-06 12:30:00,80
149
+ 2025-05-06 12:45:00,74
150
+ 2025-05-06 13:00:00,55
151
+ 2025-05-06 13:15:00,49
152
+ 2025-05-06 13:30:00,54
153
+ 2025-05-06 13:45:00,61
154
+ 2025-05-06 14:00:00,77
155
+ 2025-05-06 14:15:00,78
156
+ 2025-05-06 14:30:00,79
157
+ 2025-05-06 14:45:00,74
158
+ 2025-05-06 15:00:00,103
159
+ 2025-05-06 15:15:00,113
160
+ 2025-05-06 15:30:00,116
161
+ 2025-05-06 15:45:00,103
162
+ 2025-05-06 16:00:00,113
163
+ 2025-05-06 16:15:00,112
164
+ 2025-05-06 16:30:00,114
165
+ 2025-05-06 16:45:00,112
166
+ 2025-05-06 17:00:00,68
167
+ 2025-05-06 17:15:00,67
168
+ 2025-05-06 17:30:00,80
169
+ 2025-05-06 17:45:00,76
170
+ 2025-05-06 18:00:00,74
171
+ 2025-05-06 18:15:00,79
172
+ 2025-05-06 18:30:00,70
173
+ 2025-05-06 18:45:00,75
174
+ 2025-05-06 19:00:00,68
175
+ 2025-05-06 19:15:00,73
176
+ 2025-05-06 19:30:00,70
177
+ 2025-05-06 19:45:00,70
178
+ 2025-05-06 20:00:00,72
179
+ 2025-05-06 20:15:00,78
180
+ 2025-05-06 20:30:00,67
181
+ 2025-05-06 20:45:00,75
182
+ 2025-05-06 21:00:00,71
183
+ 2025-05-06 21:15:00,70
184
+ 2025-05-06 21:30:00,78
185
+ 2025-05-06 21:45:00,78
186
+ 2025-05-06 22:00:00,20
187
+ 2025-05-06 22:15:00,18
188
+ 2025-05-06 22:30:00,20
189
+ 2025-05-06 22:45:00,19
190
+ 2025-05-06 23:00:00,19
191
+ 2025-05-06 23:15:00,15
192
+ 2025-05-06 23:30:00,15
193
+ 2025-05-06 23:45:00,12
194
+ 2025-05-07 00:00:00,7
195
+ 2025-05-07 00:15:00,0
196
+ 2025-05-07 00:30:00,11
197
+ 2025-05-07 00:45:00,7
198
+ 2025-05-07 01:00:00,11
199
+ 2025-05-07 01:15:00,3
200
+ 2025-05-07 01:30:00,2
201
+ 2025-05-07 01:45:00,0
202
+ 2025-05-07 02:00:00,3
203
+ 2025-05-07 02:15:00,9
204
+ 2025-05-07 02:30:00,4
205
+ 2025-05-07 02:45:00,4
206
+ 2025-05-07 03:00:00,0
207
+ 2025-05-07 03:15:00,7
208
+ 2025-05-07 03:30:00,9
209
+ 2025-05-07 03:45:00,0
210
+ 2025-05-07 04:00:00,8
211
+ 2025-05-07 04:15:00,7
212
+ 2025-05-07 04:30:00,6
213
+ 2025-05-07 04:45:00,0
214
+ 2025-05-07 05:00:00,9
215
+ 2025-05-07 05:15:00,2
216
+ 2025-05-07 05:30:00,3
217
+ 2025-05-07 05:45:00,5
218
+ 2025-05-07 06:00:00,0
219
+ 2025-05-07 06:15:00,5
220
+ 2025-05-07 06:30:00,0
221
+ 2025-05-07 06:45:00,0
222
+ 2025-05-07 07:00:00,11
223
+ 2025-05-07 07:15:00,18
224
+ 2025-05-07 07:30:00,13
225
+ 2025-05-07 07:45:00,7
226
+ 2025-05-07 08:00:00,66
227
+ 2025-05-07 08:15:00,56
228
+ 2025-05-07 08:30:00,68
229
+ 2025-05-07 08:45:00,64
230
+ 2025-05-07 09:00:00,68
231
+ 2025-05-07 09:15:00,66
232
+ 2025-05-07 09:30:00,66
233
+ 2025-05-07 09:45:00,59
234
+ 2025-05-07 10:00:00,100
235
+ 2025-05-07 10:15:00,108
236
+ 2025-05-07 10:30:00,99
237
+ 2025-05-07 10:45:00,106
238
+ 2025-05-07 11:00:00,101
239
+ 2025-05-07 11:15:00,109
240
+ 2025-05-07 11:30:00,101
241
+ 2025-05-07 11:45:00,99
242
+ 2025-05-07 12:00:00,57
243
+ 2025-05-07 12:15:00,65
244
+ 2025-05-07 12:30:00,65
245
+ 2025-05-07 12:45:00,66
246
+ 2025-05-07 13:00:00,40
247
+ 2025-05-07 13:15:00,52
248
+ 2025-05-07 13:30:00,40
249
+ 2025-05-07 13:45:00,45
250
+ 2025-05-07 14:00:00,69
251
+ 2025-05-07 14:15:00,61
252
+ 2025-05-07 14:30:00,59
253
+ 2025-05-07 14:45:00,69
254
+ 2025-05-07 15:00:00,91
255
+ 2025-05-07 15:15:00,98
256
+ 2025-05-07 15:30:00,94
257
+ 2025-05-07 15:45:00,98
258
+ 2025-05-07 16:00:00,95
259
+ 2025-05-07 16:15:00,87
260
+ 2025-05-07 16:30:00,92
261
+ 2025-05-07 16:45:00,91
262
+ 2025-05-07 17:00:00,64
263
+ 2025-05-07 17:15:00,63
264
+ 2025-05-07 17:30:00,61
265
+ 2025-05-07 17:45:00,66
266
+ 2025-05-07 18:00:00,55
267
+ 2025-05-07 18:15:00,57
268
+ 2025-05-07 18:30:00,63
269
+ 2025-05-07 18:45:00,66
270
+ 2025-05-07 19:00:00,66
271
+ 2025-05-07 19:15:00,69
272
+ 2025-05-07 19:30:00,66
273
+ 2025-05-07 19:45:00,60
274
+ 2025-05-07 20:00:00,60
275
+ 2025-05-07 20:15:00,68
276
+ 2025-05-07 20:30:00,63
277
+ 2025-05-07 20:45:00,66
278
+ 2025-05-07 21:00:00,62
279
+ 2025-05-07 21:15:00,60
280
+ 2025-05-07 21:30:00,67
281
+ 2025-05-07 21:45:00,69
282
+ 2025-05-07 22:00:00,14
283
+ 2025-05-07 22:15:00,5
284
+ 2025-05-07 22:30:00,8
285
+ 2025-05-07 22:45:00,18
286
+ 2025-05-07 23:00:00,13
287
+ 2025-05-07 23:15:00,17
288
+ 2025-05-07 23:30:00,12
289
+ 2025-05-07 23:45:00,6
290
+ 2025-05-08 00:00:00,2
291
+ 2025-05-08 00:15:00,7
292
+ 2025-05-08 00:30:00,0
293
+ 2025-05-08 00:45:00,6
294
+ 2025-05-08 01:00:00,1
295
+ 2025-05-08 01:15:00,9
296
+ 2025-05-08 01:30:00,12
297
+ 2025-05-08 01:45:00,5
298
+ 2025-05-08 02:00:00,0
299
+ 2025-05-08 02:15:00,11
300
+ 2025-05-08 02:30:00,3
301
+ 2025-05-08 02:45:00,7
302
+ 2025-05-08 03:00:00,9
303
+ 2025-05-08 03:15:00,4
304
+ 2025-05-08 03:30:00,4
305
+ 2025-05-08 03:45:00,13
306
+ 2025-05-08 04:00:00,1
307
+ 2025-05-08 04:15:00,4
308
+ 2025-05-08 04:30:00,6
309
+ 2025-05-08 04:45:00,8
310
+ 2025-05-08 05:00:00,6
311
+ 2025-05-08 05:15:00,6
312
+ 2025-05-08 05:30:00,6
313
+ 2025-05-08 05:45:00,8
314
+ 2025-05-08 06:00:00,6
315
+ 2025-05-08 06:15:00,6
316
+ 2025-05-08 06:30:00,7
317
+ 2025-05-08 06:45:00,0
318
+ 2025-05-08 07:00:00,5
319
+ 2025-05-08 07:15:00,8
320
+ 2025-05-08 07:30:00,18
321
+ 2025-05-08 07:45:00,11
322
+ 2025-05-08 08:00:00,55
323
+ 2025-05-08 08:15:00,59
324
+ 2025-05-08 08:30:00,59
325
+ 2025-05-08 08:45:00,68
326
+ 2025-05-08 09:00:00,68
327
+ 2025-05-08 09:15:00,62
328
+ 2025-05-08 09:30:00,62
329
+ 2025-05-08 09:45:00,67
330
+ 2025-05-08 10:00:00,102
331
+ 2025-05-08 10:15:00,108
332
+ 2025-05-08 10:30:00,102
333
+ 2025-05-08 10:45:00,106
334
+ 2025-05-08 11:00:00,103
335
+ 2025-05-08 11:15:00,96
336
+ 2025-05-08 11:30:00,97
337
+ 2025-05-08 11:45:00,106
338
+ 2025-05-08 12:00:00,55
339
+ 2025-05-08 12:15:00,68
340
+ 2025-05-08 12:30:00,60
341
+ 2025-05-08 12:45:00,68
342
+ 2025-05-08 13:00:00,49
343
+ 2025-05-08 13:15:00,44
344
+ 2025-05-08 13:30:00,45
345
+ 2025-05-08 13:45:00,52
346
+ 2025-05-08 14:00:00,69
347
+ 2025-05-08 14:15:00,63
348
+ 2025-05-08 14:30:00,58
349
+ 2025-05-08 14:45:00,61
350
+ 2025-05-08 15:00:00,98
351
+ 2025-05-08 15:15:00,88
352
+ 2025-05-08 15:30:00,94
353
+ 2025-05-08 15:45:00,91
354
+ 2025-05-08 16:00:00,92
355
+ 2025-05-08 16:15:00,89
356
+ 2025-05-08 16:30:00,97
357
+ 2025-05-08 16:45:00,85
358
+ 2025-05-08 17:00:00,55
359
+ 2025-05-08 17:15:00,63
360
+ 2025-05-08 17:30:00,57
361
+ 2025-05-08 17:45:00,56
362
+ 2025-05-08 18:00:00,61
363
+ 2025-05-08 18:15:00,56
364
+ 2025-05-08 18:30:00,69
365
+ 2025-05-08 18:45:00,60
366
+ 2025-05-08 19:00:00,62
367
+ 2025-05-08 19:15:00,57
368
+ 2025-05-08 19:30:00,59
369
+ 2025-05-08 19:45:00,59
370
+ 2025-05-08 20:00:00,60
371
+ 2025-05-08 20:15:00,55
372
+ 2025-05-08 20:30:00,56
373
+ 2025-05-08 20:45:00,64
374
+ 2025-05-08 21:00:00,55
375
+ 2025-05-08 21:15:00,56
376
+ 2025-05-08 21:30:00,56
377
+ 2025-05-08 21:45:00,65
378
+ 2025-05-08 22:00:00,5
379
+ 2025-05-08 22:15:00,8
380
+ 2025-05-08 22:30:00,8
381
+ 2025-05-08 22:45:00,13
382
+ 2025-05-08 23:00:00,5
383
+ 2025-05-08 23:15:00,5
384
+ 2025-05-08 23:30:00,11
385
+ 2025-05-08 23:45:00,14
386
+ 2025-05-09 00:00:00,0
387
+ 2025-05-09 00:15:00,0
388
+ 2025-05-09 00:30:00,11
389
+ 2025-05-09 00:45:00,4
390
+ 2025-05-09 01:00:00,7
391
+ 2025-05-09 01:15:00,2
392
+ 2025-05-09 01:30:00,10
393
+ 2025-05-09 01:45:00,10
394
+ 2025-05-09 02:00:00,7
395
+ 2025-05-09 02:15:00,3
396
+ 2025-05-09 02:30:00,10
397
+ 2025-05-09 02:45:00,2
398
+ 2025-05-09 03:00:00,0
399
+ 2025-05-09 03:15:00,6
400
+ 2025-05-09 03:30:00,8
401
+ 2025-05-09 03:45:00,10
402
+ 2025-05-09 04:00:00,0
403
+ 2025-05-09 04:15:00,2
404
+ 2025-05-09 04:30:00,9
405
+ 2025-05-09 04:45:00,12
406
+ 2025-05-09 05:00:00,0
407
+ 2025-05-09 05:15:00,0
408
+ 2025-05-09 05:30:00,11
409
+ 2025-05-09 05:45:00,0
410
+ 2025-05-09 06:00:00,3
411
+ 2025-05-09 06:15:00,9
412
+ 2025-05-09 06:30:00,3
413
+ 2025-05-09 06:45:00,4
414
+ 2025-05-09 07:00:00,13
415
+ 2025-05-09 07:15:00,11
416
+ 2025-05-09 07:30:00,6
417
+ 2025-05-09 07:45:00,13
418
+ 2025-05-09 08:00:00,60
419
+ 2025-05-09 08:15:00,61
420
+ 2025-05-09 08:30:00,58
421
+ 2025-05-09 08:45:00,57
422
+ 2025-05-09 09:00:00,55
423
+ 2025-05-09 09:15:00,60
424
+ 2025-05-09 09:30:00,67
425
+ 2025-05-09 09:45:00,67
426
+ 2025-05-09 10:00:00,105
427
+ 2025-05-09 10:15:00,106
428
+ 2025-05-09 10:30:00,102
429
+ 2025-05-09 10:45:00,108
430
+ 2025-05-09 11:00:00,95
431
+ 2025-05-09 11:15:00,105
432
+ 2025-05-09 11:30:00,96
433
+ 2025-05-09 11:45:00,107
434
+ 2025-05-09 12:00:00,58
435
+ 2025-05-09 12:15:00,58
436
+ 2025-05-09 12:30:00,69
437
+ 2025-05-09 12:45:00,61
438
+ 2025-05-09 13:00:00,47
439
+ 2025-05-09 13:15:00,41
440
+ 2025-05-09 13:30:00,44
441
+ 2025-05-09 13:45:00,44
442
+ 2025-05-09 14:00:00,63
443
+ 2025-05-09 14:15:00,65
444
+ 2025-05-09 14:30:00,61
445
+ 2025-05-09 14:45:00,66
446
+ 2025-05-09 15:00:00,88
447
+ 2025-05-09 15:15:00,87
448
+ 2025-05-09 15:30:00,95
449
+ 2025-05-09 15:45:00,98
450
+ 2025-05-09 16:00:00,90
451
+ 2025-05-09 16:15:00,86
452
+ 2025-05-09 16:30:00,88
453
+ 2025-05-09 16:45:00,87
454
+ 2025-05-09 17:00:00,59
455
+ 2025-05-09 17:15:00,65
456
+ 2025-05-09 17:30:00,60
457
+ 2025-05-09 17:45:00,57
458
+ 2025-05-09 18:00:00,64
459
+ 2025-05-09 18:15:00,69
460
+ 2025-05-09 18:30:00,66
461
+ 2025-05-09 18:45:00,61
462
+ 2025-05-09 19:00:00,64
463
+ 2025-05-09 19:15:00,57
464
+ 2025-05-09 19:30:00,58
465
+ 2025-05-09 19:45:00,67
466
+ 2025-05-09 20:00:00,62
467
+ 2025-05-09 20:15:00,58
468
+ 2025-05-09 20:30:00,61
469
+ 2025-05-09 20:45:00,64
470
+ 2025-05-09 21:00:00,56
471
+ 2025-05-09 21:15:00,67
472
+ 2025-05-09 21:30:00,67
473
+ 2025-05-09 21:45:00,67
474
+ 2025-05-09 22:00:00,16
475
+ 2025-05-09 22:15:00,19
476
+ 2025-05-09 22:30:00,8
477
+ 2025-05-09 22:45:00,12
478
+ 2025-05-09 23:00:00,13
479
+ 2025-05-09 23:15:00,14
480
+ 2025-05-09 23:30:00,9
481
+ 2025-05-09 23:45:00,8
482
+ 2025-05-10 00:00:00,0
483
+ 2025-05-10 00:15:00,9
484
+ 2025-05-10 00:30:00,1
485
+ 2025-05-10 00:45:00,0
486
+ 2025-05-10 01:00:00,0
487
+ 2025-05-10 01:15:00,0
488
+ 2025-05-10 01:30:00,4
489
+ 2025-05-10 01:45:00,13
490
+ 2025-05-10 02:00:00,8
491
+ 2025-05-10 02:15:00,4
492
+ 2025-05-10 02:30:00,0
493
+ 2025-05-10 02:45:00,2
494
+ 2025-05-10 03:00:00,5
495
+ 2025-05-10 03:15:00,0
496
+ 2025-05-10 03:30:00,4
497
+ 2025-05-10 03:45:00,4
498
+ 2025-05-10 04:00:00,4
499
+ 2025-05-10 04:15:00,0
500
+ 2025-05-10 04:30:00,0
501
+ 2025-05-10 04:45:00,3
502
+ 2025-05-10 05:00:00,4
503
+ 2025-05-10 05:15:00,10
504
+ 2025-05-10 05:30:00,0
505
+ 2025-05-10 05:45:00,0
506
+ 2025-05-10 06:00:00,4
507
+ 2025-05-10 06:15:00,0
508
+ 2025-05-10 06:30:00,0
509
+ 2025-05-10 06:45:00,8
510
+ 2025-05-10 07:00:00,10
511
+ 2025-05-10 07:15:00,1
512
+ 2025-05-10 07:30:00,0
513
+ 2025-05-10 07:45:00,1
514
+ 2025-05-10 08:00:00,9
515
+ 2025-05-10 08:15:00,8
516
+ 2025-05-10 08:30:00,18
517
+ 2025-05-10 08:45:00,9
518
+ 2025-05-10 09:00:00,16
519
+ 2025-05-10 09:15:00,20
520
+ 2025-05-10 09:30:00,19
521
+ 2025-05-10 09:45:00,7
522
+ 2025-05-10 10:00:00,29
523
+ 2025-05-10 10:15:00,16
524
+ 2025-05-10 10:30:00,24
525
+ 2025-05-10 10:45:00,22
526
+ 2025-05-10 11:00:00,18
527
+ 2025-05-10 11:15:00,21
528
+ 2025-05-10 11:30:00,16
529
+ 2025-05-10 11:45:00,21
530
+ 2025-05-10 12:00:00,7
531
+ 2025-05-10 12:15:00,15
532
+ 2025-05-10 12:30:00,9
533
+ 2025-05-10 12:45:00,10
534
+ 2025-05-10 13:00:00,6
535
+ 2025-05-10 13:15:00,4
536
+ 2025-05-10 13:30:00,18
537
+ 2025-05-10 13:45:00,15
538
+ 2025-05-10 14:00:00,15
539
+ 2025-05-10 14:15:00,20
540
+ 2025-05-10 14:30:00,20
541
+ 2025-05-10 14:45:00,13
542
+ 2025-05-10 15:00:00,19
543
+ 2025-05-10 15:15:00,25
544
+ 2025-05-10 15:30:00,22
545
+ 2025-05-10 15:45:00,13
546
+ 2025-05-10 16:00:00,20
547
+ 2025-05-10 16:15:00,20
548
+ 2025-05-10 16:30:00,17
549
+ 2025-05-10 16:45:00,25
550
+ 2025-05-10 17:00:00,17
551
+ 2025-05-10 17:15:00,8
552
+ 2025-05-10 17:30:00,20
553
+ 2025-05-10 17:45:00,17
554
+ 2025-05-10 18:00:00,9
555
+ 2025-05-10 18:15:00,19
556
+ 2025-05-10 18:30:00,9
557
+ 2025-05-10 18:45:00,21
558
+ 2025-05-10 19:00:00,17
559
+ 2025-05-10 19:15:00,12
560
+ 2025-05-10 19:30:00,11
561
+ 2025-05-10 19:45:00,12
562
+ 2025-05-10 20:00:00,21
563
+ 2025-05-10 20:15:00,18
564
+ 2025-05-10 20:30:00,9
565
+ 2025-05-10 20:45:00,13
566
+ 2025-05-10 21:00:00,21
567
+ 2025-05-10 21:15:00,11
568
+ 2025-05-10 21:30:00,19
569
+ 2025-05-10 21:45:00,7
570
+ 2025-05-10 22:00:00,10
571
+ 2025-05-10 22:15:00,9
572
+ 2025-05-10 22:30:00,8
573
+ 2025-05-10 22:45:00,9
574
+ 2025-05-10 23:00:00,10
575
+ 2025-05-10 23:15:00,9
576
+ 2025-05-10 23:30:00,0
577
+ 2025-05-10 23:45:00,1
578
+ 2025-05-11 00:00:00,0
579
+ 2025-05-11 00:15:00,8
580
+ 2025-05-11 00:30:00,0
581
+ 2025-05-11 00:45:00,0
582
+ 2025-05-11 01:00:00,13
583
+ 2025-05-11 01:15:00,9
584
+ 2025-05-11 01:30:00,6
585
+ 2025-05-11 01:45:00,7
586
+ 2025-05-11 02:00:00,0
587
+ 2025-05-11 02:15:00,0
588
+ 2025-05-11 02:30:00,5
589
+ 2025-05-11 02:45:00,0
590
+ 2025-05-11 03:00:00,2
591
+ 2025-05-11 03:15:00,0
592
+ 2025-05-11 03:30:00,3
593
+ 2025-05-11 03:45:00,8
594
+ 2025-05-11 04:00:00,5
595
+ 2025-05-11 04:15:00,12
596
+ 2025-05-11 04:30:00,6
597
+ 2025-05-11 04:45:00,0
598
+ 2025-05-11 05:00:00,0
599
+ 2025-05-11 05:15:00,6
600
+ 2025-05-11 05:30:00,10
601
+ 2025-05-11 05:45:00,12
602
+ 2025-05-11 06:00:00,0
603
+ 2025-05-11 06:15:00,6
604
+ 2025-05-11 06:30:00,1
605
+ 2025-05-11 06:45:00,3
606
+ 2025-05-11 07:00:00,11
607
+ 2025-05-11 07:15:00,0
608
+ 2025-05-11 07:30:00,8
609
+ 2025-05-11 07:45:00,3
610
+ 2025-05-11 08:00:00,7
611
+ 2025-05-11 08:15:00,7
612
+ 2025-05-11 08:30:00,17
613
+ 2025-05-11 08:45:00,18
614
+ 2025-05-11 09:00:00,16
615
+ 2025-05-11 09:15:00,8
616
+ 2025-05-11 09:30:00,12
617
+ 2025-05-11 09:45:00,14
618
+ 2025-05-11 10:00:00,18
619
+ 2025-05-11 10:15:00,18
620
+ 2025-05-11 10:30:00,15
621
+ 2025-05-11 10:45:00,23
622
+ 2025-05-11 11:00:00,26
623
+ 2025-05-11 11:15:00,20
624
+ 2025-05-11 11:30:00,28
625
+ 2025-05-11 11:45:00,15
626
+ 2025-05-11 12:00:00,17
627
+ 2025-05-11 12:15:00,17
628
+ 2025-05-11 12:30:00,15
629
+ 2025-05-11 12:45:00,15
630
+ 2025-05-11 13:00:00,11
631
+ 2025-05-11 13:15:00,7
632
+ 2025-05-11 13:30:00,17
633
+ 2025-05-11 13:45:00,9
634
+ 2025-05-11 14:00:00,9
635
+ 2025-05-11 14:15:00,9
636
+ 2025-05-11 14:30:00,18
637
+ 2025-05-11 14:45:00,9
638
+ 2025-05-11 15:00:00,16
639
+ 2025-05-11 15:15:00,13
640
+ 2025-05-11 15:30:00,25
641
+ 2025-05-11 15:45:00,14
642
+ 2025-05-11 16:00:00,15
643
+ 2025-05-11 16:15:00,24
644
+ 2025-05-11 16:30:00,17
645
+ 2025-05-11 16:45:00,21
646
+ 2025-05-11 17:00:00,19
647
+ 2025-05-11 17:15:00,18
648
+ 2025-05-11 17:30:00,13
649
+ 2025-05-11 17:45:00,16
650
+ 2025-05-11 18:00:00,16
651
+ 2025-05-11 18:15:00,9
652
+ 2025-05-11 18:30:00,7
653
+ 2025-05-11 18:45:00,17
654
+ 2025-05-11 19:00:00,9
655
+ 2025-05-11 19:15:00,8
656
+ 2025-05-11 19:30:00,13
657
+ 2025-05-11 19:45:00,10
658
+ 2025-05-11 20:00:00,18
659
+ 2025-05-11 20:15:00,21
660
+ 2025-05-11 20:30:00,18
661
+ 2025-05-11 20:45:00,9
662
+ 2025-05-11 21:00:00,15
663
+ 2025-05-11 21:15:00,14
664
+ 2025-05-11 21:30:00,13
665
+ 2025-05-11 21:45:00,19
666
+ 2025-05-11 22:00:00,9
667
+ 2025-05-11 22:15:00,0
668
+ 2025-05-11 22:30:00,1
669
+ 2025-05-11 22:45:00,6
670
+ 2025-05-11 23:00:00,0
671
+ 2025-05-11 23:15:00,4
672
+ 2025-05-11 23:30:00,9
673
+ 2025-05-11 23:45:00,3
674
+ 2025-05-12 00:00:00,10
675
+ 2025-05-12 00:15:00,3
676
+ 2025-05-12 00:30:00,3
677
+ 2025-05-12 00:45:00,8
678
+ 2025-05-12 01:00:00,0
679
+ 2025-05-12 01:15:00,7
680
+ 2025-05-12 01:30:00,0
681
+ 2025-05-12 01:45:00,5
682
+ 2025-05-12 02:00:00,2
683
+ 2025-05-12 02:15:00,5
684
+ 2025-05-12 02:30:00,7
685
+ 2025-05-12 02:45:00,9
686
+ 2025-05-12 03:00:00,7
687
+ 2025-05-12 03:15:00,1
688
+ 2025-05-12 03:30:00,5
689
+ 2025-05-12 03:45:00,13
690
+ 2025-05-12 04:00:00,6
691
+ 2025-05-12 04:15:00,0
692
+ 2025-05-12 04:30:00,5
693
+ 2025-05-12 04:45:00,0
694
+ 2025-05-12 05:00:00,0
695
+ 2025-05-12 05:15:00,0
696
+ 2025-05-12 05:30:00,4
697
+ 2025-05-12 05:45:00,0
698
+ 2025-05-12 06:00:00,4
699
+ 2025-05-12 06:15:00,6
700
+ 2025-05-12 06:30:00,7
701
+ 2025-05-12 06:45:00,4
702
+ 2025-05-12 07:00:00,18
703
+ 2025-05-12 07:15:00,19
704
+ 2025-05-12 07:30:00,21
705
+ 2025-05-12 07:45:00,14
706
+ 2025-05-12 08:00:00,72
707
+ 2025-05-12 08:15:00,80
708
+ 2025-05-12 08:30:00,75
709
+ 2025-05-12 08:45:00,79
710
+ 2025-05-12 09:00:00,77
711
+ 2025-05-12 09:15:00,79
712
+ 2025-05-12 09:30:00,72
713
+ 2025-05-12 09:45:00,71
714
+ 2025-05-12 10:00:00,118
715
+ 2025-05-12 10:15:00,118
716
+ 2025-05-12 10:30:00,116
717
+ 2025-05-12 10:45:00,118
718
+ 2025-05-12 11:00:00,120
719
+ 2025-05-12 11:15:00,122
720
+ 2025-05-12 11:30:00,119
721
+ 2025-05-12 11:45:00,118
722
+ 2025-05-12 12:00:00,75
723
+ 2025-05-12 12:15:00,73
724
+ 2025-05-12 12:30:00,77
725
+ 2025-05-12 12:45:00,81
726
+ 2025-05-12 13:00:00,54
727
+ 2025-05-12 13:15:00,54
728
+ 2025-05-12 13:30:00,51
729
+ 2025-05-12 13:45:00,55
730
+ 2025-05-12 14:00:00,69
731
+ 2025-05-12 14:15:00,80
732
+ 2025-05-12 14:30:00,69
733
+ 2025-05-12 14:45:00,73
734
+ 2025-05-12 15:00:00,114
735
+ 2025-05-12 15:15:00,109
736
+ 2025-05-12 15:30:00,112
737
+ 2025-05-12 15:45:00,111
738
+ 2025-05-12 16:00:00,111
739
+ 2025-05-12 16:15:00,108
740
+ 2025-05-12 16:30:00,115
741
+ 2025-05-12 16:45:00,113
742
+ 2025-05-12 17:00:00,77
743
+ 2025-05-12 17:15:00,69
744
+ 2025-05-12 17:30:00,68
745
+ 2025-05-12 17:45:00,77
746
+ 2025-05-12 18:00:00,80
747
+ 2025-05-12 18:15:00,67
748
+ 2025-05-12 18:30:00,68
749
+ 2025-05-12 18:45:00,69
750
+ 2025-05-12 19:00:00,67
751
+ 2025-05-12 19:15:00,73
752
+ 2025-05-12 19:30:00,75
753
+ 2025-05-12 19:45:00,74
754
+ 2025-05-12 20:00:00,70
755
+ 2025-05-12 20:15:00,74
756
+ 2025-05-12 20:30:00,77
757
+ 2025-05-12 20:45:00,71
758
+ 2025-05-12 21:00:00,80
759
+ 2025-05-12 21:15:00,74
760
+ 2025-05-12 21:30:00,79
761
+ 2025-05-12 21:45:00,68
762
+ 2025-05-12 22:00:00,14
763
+ 2025-05-12 22:15:00,12
764
+ 2025-05-12 22:30:00,17
765
+ 2025-05-12 22:45:00,18
766
+ 2025-05-12 23:00:00,18
767
+ 2025-05-12 23:15:00,11
768
+ 2025-05-12 23:30:00,14
769
+ 2025-05-12 23:45:00,16
770
+ 2025-05-13 00:00:00,9
771
+ 2025-05-13 00:15:00,6
772
+ 2025-05-13 00:30:00,8
773
+ 2025-05-13 00:45:00,0
774
+ 2025-05-13 01:00:00,1
775
+ 2025-05-13 01:15:00,9
776
+ 2025-05-13 01:30:00,5
777
+ 2025-05-13 01:45:00,10
778
+ 2025-05-13 02:00:00,0
779
+ 2025-05-13 02:15:00,5
780
+ 2025-05-13 02:30:00,9
781
+ 2025-05-13 02:45:00,10
782
+ 2025-05-13 03:00:00,0
783
+ 2025-05-13 03:15:00,0
784
+ 2025-05-13 03:30:00,0
785
+ 2025-05-13 03:45:00,8
786
+ 2025-05-13 04:00:00,0
787
+ 2025-05-13 04:15:00,13
788
+ 2025-05-13 04:30:00,4
789
+ 2025-05-13 04:45:00,9
790
+ 2025-05-13 05:00:00,0
791
+ 2025-05-13 05:15:00,10
792
+ 2025-05-13 05:30:00,0
793
+ 2025-05-13 05:45:00,3
794
+ 2025-05-13 06:00:00,0
795
+ 2025-05-13 06:15:00,11
796
+ 2025-05-13 06:30:00,9
797
+ 2025-05-13 06:45:00,0
798
+ 2025-05-13 07:00:00,20
799
+ 2025-05-13 07:15:00,19
800
+ 2025-05-13 07:30:00,7
801
+ 2025-05-13 07:45:00,20
802
+ 2025-05-13 08:00:00,74
803
+ 2025-05-13 08:15:00,72
804
+ 2025-05-13 08:30:00,81
805
+ 2025-05-13 08:45:00,71
806
+ 2025-05-13 09:00:00,72
807
+ 2025-05-13 09:15:00,74
808
+ 2025-05-13 09:30:00,68
809
+ 2025-05-13 09:45:00,77
810
+ 2025-05-13 10:00:00,115
811
+ 2025-05-13 10:15:00,125
812
+ 2025-05-13 10:30:00,118
813
+ 2025-05-13 10:45:00,124
814
+ 2025-05-13 11:00:00,119
815
+ 2025-05-13 11:15:00,119
816
+ 2025-05-13 11:30:00,123
817
+ 2025-05-13 11:45:00,124
818
+ 2025-05-13 12:00:00,77
819
+ 2025-05-13 12:15:00,69
820
+ 2025-05-13 12:30:00,75
821
+ 2025-05-13 12:45:00,72
822
+ 2025-05-13 13:00:00,58
823
+ 2025-05-13 13:15:00,55
824
+ 2025-05-13 13:30:00,52
825
+ 2025-05-13 13:45:00,53
826
+ 2025-05-13 14:00:00,69
827
+ 2025-05-13 14:15:00,75
828
+ 2025-05-13 14:30:00,68
829
+ 2025-05-13 14:45:00,80
830
+ 2025-05-13 15:00:00,103
831
+ 2025-05-13 15:15:00,117
832
+ 2025-05-13 15:30:00,109
833
+ 2025-05-13 15:45:00,107
834
+ 2025-05-13 16:00:00,112
835
+ 2025-05-13 16:15:00,105
836
+ 2025-05-13 16:30:00,117
837
+ 2025-05-13 16:45:00,108
838
+ 2025-05-13 17:00:00,81
839
+ 2025-05-13 17:15:00,72
840
+ 2025-05-13 17:30:00,77
841
+ 2025-05-13 17:45:00,80
842
+ 2025-05-13 18:00:00,75
843
+ 2025-05-13 18:15:00,69
844
+ 2025-05-13 18:30:00,78
845
+ 2025-05-13 18:45:00,81
846
+ 2025-05-13 19:00:00,80
847
+ 2025-05-13 19:15:00,71
848
+ 2025-05-13 19:30:00,73
849
+ 2025-05-13 19:45:00,77
850
+ 2025-05-13 20:00:00,76
851
+ 2025-05-13 20:15:00,76
852
+ 2025-05-13 20:30:00,68
853
+ 2025-05-13 20:45:00,74
854
+ 2025-05-13 21:00:00,81
855
+ 2025-05-13 21:15:00,69
856
+ 2025-05-13 21:30:00,67
857
+ 2025-05-13 21:45:00,68
858
+ 2025-05-13 22:00:00,13
859
+ 2025-05-13 22:15:00,9
860
+ 2025-05-13 22:30:00,10
861
+ 2025-05-13 22:45:00,12
862
+ 2025-05-13 23:00:00,7
863
+ 2025-05-13 23:15:00,17
864
+ 2025-05-13 23:30:00,16
865
+ 2025-05-13 23:45:00,17
866
+ 2025-05-14 00:00:00,2
867
+ 2025-05-14 00:15:00,8
868
+ 2025-05-14 00:30:00,0
869
+ 2025-05-14 00:45:00,0
870
+ 2025-05-14 01:00:00,4
871
+ 2025-05-14 01:15:00,10
872
+ 2025-05-14 01:30:00,5
873
+ 2025-05-14 01:45:00,9
874
+ 2025-05-14 02:00:00,2
875
+ 2025-05-14 02:15:00,3
876
+ 2025-05-14 02:30:00,1
877
+ 2025-05-14 02:45:00,5
878
+ 2025-05-14 03:00:00,7
879
+ 2025-05-14 03:15:00,9
880
+ 2025-05-14 03:30:00,13
881
+ 2025-05-14 03:45:00,6
882
+ 2025-05-14 04:00:00,6
883
+ 2025-05-14 04:15:00,0
884
+ 2025-05-14 04:30:00,2
885
+ 2025-05-14 04:45:00,7
886
+ 2025-05-14 05:00:00,11
887
+ 2025-05-14 05:15:00,0
888
+ 2025-05-14 05:30:00,9
889
+ 2025-05-14 05:45:00,12
890
+ 2025-05-14 06:00:00,12
891
+ 2025-05-14 06:15:00,1
892
+ 2025-05-14 06:30:00,0
893
+ 2025-05-14 06:45:00,9
894
+ 2025-05-14 07:00:00,19
895
+ 2025-05-14 07:15:00,7
896
+ 2025-05-14 07:30:00,18
897
+ 2025-05-14 07:45:00,14
898
+ 2025-05-14 08:00:00,64
899
+ 2025-05-14 08:15:00,67
900
+ 2025-05-14 08:30:00,67
901
+ 2025-05-14 08:45:00,68
902
+ 2025-05-14 09:00:00,56
903
+ 2025-05-14 09:15:00,59
904
+ 2025-05-14 09:30:00,66
905
+ 2025-05-14 09:45:00,65
906
+ 2025-05-14 10:00:00,103
907
+ 2025-05-14 10:15:00,100
908
+ 2025-05-14 10:30:00,101
909
+ 2025-05-14 10:45:00,101
910
+ 2025-05-14 11:00:00,100
911
+ 2025-05-14 11:15:00,103
912
+ 2025-05-14 11:30:00,99
913
+ 2025-05-14 11:45:00,106
914
+ 2025-05-14 12:00:00,57
915
+ 2025-05-14 12:15:00,60
916
+ 2025-05-14 12:30:00,63
917
+ 2025-05-14 12:45:00,67
918
+ 2025-05-14 13:00:00,52
919
+ 2025-05-14 13:15:00,40
920
+ 2025-05-14 13:30:00,41
921
+ 2025-05-14 13:45:00,51
922
+ 2025-05-14 14:00:00,60
923
+ 2025-05-14 14:15:00,65
924
+ 2025-05-14 14:30:00,58
925
+ 2025-05-14 14:45:00,61
926
+ 2025-05-14 15:00:00,91
927
+ 2025-05-14 15:15:00,90
928
+ 2025-05-14 15:30:00,95
929
+ 2025-05-14 15:45:00,87
930
+ 2025-05-14 16:00:00,93
931
+ 2025-05-14 16:15:00,90
932
+ 2025-05-14 16:30:00,93
933
+ 2025-05-14 16:45:00,94
934
+ 2025-05-14 17:00:00,66
935
+ 2025-05-14 17:15:00,69
936
+ 2025-05-14 17:30:00,63
937
+ 2025-05-14 17:45:00,57
938
+ 2025-05-14 18:00:00,64
939
+ 2025-05-14 18:15:00,57
940
+ 2025-05-14 18:30:00,61
941
+ 2025-05-14 18:45:00,57
942
+ 2025-05-14 19:00:00,67
943
+ 2025-05-14 19:15:00,69
944
+ 2025-05-14 19:30:00,66
945
+ 2025-05-14 19:45:00,57
946
+ 2025-05-14 20:00:00,57
947
+ 2025-05-14 20:15:00,68
948
+ 2025-05-14 20:30:00,61
949
+ 2025-05-14 20:45:00,55
950
+ 2025-05-14 21:00:00,66
951
+ 2025-05-14 21:15:00,68
952
+ 2025-05-14 21:30:00,63
953
+ 2025-05-14 21:45:00,64
954
+ 2025-05-14 22:00:00,8
955
+ 2025-05-14 22:15:00,17
956
+ 2025-05-14 22:30:00,12
957
+ 2025-05-14 22:45:00,18
958
+ 2025-05-14 23:00:00,8
959
+ 2025-05-14 23:15:00,15
960
+ 2025-05-14 23:30:00,7
961
+ 2025-05-14 23:45:00,5
962
+ 2025-05-15 00:00:00,3
963
+ 2025-05-15 00:15:00,12
964
+ 2025-05-15 00:30:00,8
965
+ 2025-05-15 00:45:00,8
966
+ 2025-05-15 01:00:00,0
967
+ 2025-05-15 01:15:00,7
968
+ 2025-05-15 01:30:00,3
969
+ 2025-05-15 01:45:00,5
970
+ 2025-05-15 02:00:00,1
971
+ 2025-05-15 02:15:00,5
972
+ 2025-05-15 02:30:00,3
973
+ 2025-05-15 02:45:00,8
974
+ 2025-05-15 03:00:00,8
975
+ 2025-05-15 03:15:00,9
976
+ 2025-05-15 03:30:00,2
977
+ 2025-05-15 03:45:00,4
978
+ 2025-05-15 04:00:00,4
979
+ 2025-05-15 04:15:00,3
980
+ 2025-05-15 04:30:00,8
981
+ 2025-05-15 04:45:00,2
982
+ 2025-05-15 05:00:00,1
983
+ 2025-05-15 05:15:00,0
984
+ 2025-05-15 05:30:00,6
985
+ 2025-05-15 05:45:00,0
986
+ 2025-05-15 06:00:00,10
987
+ 2025-05-15 06:15:00,13
988
+ 2025-05-15 06:30:00,0
989
+ 2025-05-15 06:45:00,10
990
+ 2025-05-15 07:00:00,18
991
+ 2025-05-15 07:15:00,9
992
+ 2025-05-15 07:30:00,10
993
+ 2025-05-15 07:45:00,5
994
+ 2025-05-15 08:00:00,60
995
+ 2025-05-15 08:15:00,61
996
+ 2025-05-15 08:30:00,55
997
+ 2025-05-15 08:45:00,61
998
+ 2025-05-15 09:00:00,56
999
+ 2025-05-15 09:15:00,69
1000
+ 2025-05-15 09:30:00,62
1001
+ 2025-05-15 09:45:00,69
1002
+ 2025-05-15 10:00:00,99
1003
+ 2025-05-15 10:15:00,98
1004
+ 2025-05-15 10:30:00,99
1005
+ 2025-05-15 10:45:00,105
1006
+ 2025-05-15 11:00:00,103
1007
+ 2025-05-15 11:15:00,104
1008
+ 2025-05-15 11:30:00,101
1009
+ 2025-05-15 11:45:00,108
1010
+ 2025-05-15 12:00:00,60
1011
+ 2025-05-15 12:15:00,57
1012
+ 2025-05-15 12:30:00,63
1013
+ 2025-05-15 12:45:00,55
1014
+ 2025-05-15 13:00:00,53
1015
+ 2025-05-15 13:15:00,43
1016
+ 2025-05-15 13:30:00,40
1017
+ 2025-05-15 13:45:00,40
1018
+ 2025-05-15 14:00:00,61
1019
+ 2025-05-15 14:15:00,67
1020
+ 2025-05-15 14:30:00,68
1021
+ 2025-05-15 14:45:00,57
1022
+ 2025-05-15 15:00:00,85
1023
+ 2025-05-15 15:15:00,87
1024
+ 2025-05-15 15:30:00,92
1025
+ 2025-05-15 15:45:00,86
1026
+ 2025-05-15 16:00:00,99
1027
+ 2025-05-15 16:15:00,91
1028
+ 2025-05-15 16:30:00,99
1029
+ 2025-05-15 16:45:00,85
1030
+ 2025-05-15 17:00:00,58
1031
+ 2025-05-15 17:15:00,62
1032
+ 2025-05-15 17:30:00,63
1033
+ 2025-05-15 17:45:00,64
1034
+ 2025-05-15 18:00:00,68
1035
+ 2025-05-15 18:15:00,61
1036
+ 2025-05-15 18:30:00,64
1037
+ 2025-05-15 18:45:00,63
1038
+ 2025-05-15 19:00:00,63
1039
+ 2025-05-15 19:15:00,64
1040
+ 2025-05-15 19:30:00,55
1041
+ 2025-05-15 19:45:00,69
1042
+ 2025-05-15 20:00:00,62
1043
+ 2025-05-15 20:15:00,58
1044
+ 2025-05-15 20:30:00,61
1045
+ 2025-05-15 20:45:00,59
1046
+ 2025-05-15 21:00:00,62
1047
+ 2025-05-15 21:15:00,69
1048
+ 2025-05-15 21:30:00,59
1049
+ 2025-05-15 21:45:00,56
1050
+ 2025-05-15 22:00:00,5
1051
+ 2025-05-15 22:15:00,7
1052
+ 2025-05-15 22:30:00,19
1053
+ 2025-05-15 22:45:00,11
1054
+ 2025-05-15 23:00:00,8
1055
+ 2025-05-15 23:15:00,19
1056
+ 2025-05-15 23:30:00,5
1057
+ 2025-05-15 23:45:00,18
1058
+ 2025-05-16 00:00:00,7
1059
+ 2025-05-16 00:15:00,1
1060
+ 2025-05-16 00:30:00,7
1061
+ 2025-05-16 00:45:00,10
1062
+ 2025-05-16 01:00:00,8
1063
+ 2025-05-16 01:15:00,11
1064
+ 2025-05-16 01:30:00,4
1065
+ 2025-05-16 01:45:00,0
1066
+ 2025-05-16 02:00:00,2
1067
+ 2025-05-16 02:15:00,7
1068
+ 2025-05-16 02:30:00,1
1069
+ 2025-05-16 02:45:00,0
1070
+ 2025-05-16 03:00:00,5
1071
+ 2025-05-16 03:15:00,5
1072
+ 2025-05-16 03:30:00,0
1073
+ 2025-05-16 03:45:00,0
1074
+ 2025-05-16 04:00:00,2
1075
+ 2025-05-16 04:15:00,1
1076
+ 2025-05-16 04:30:00,0
1077
+ 2025-05-16 04:45:00,4
1078
+ 2025-05-16 05:00:00,4
1079
+ 2025-05-16 05:15:00,0
1080
+ 2025-05-16 05:30:00,11
1081
+ 2025-05-16 05:45:00,0
1082
+ 2025-05-16 06:00:00,8
1083
+ 2025-05-16 06:15:00,0
1084
+ 2025-05-16 06:30:00,1
1085
+ 2025-05-16 06:45:00,9
1086
+ 2025-05-16 07:00:00,15
1087
+ 2025-05-16 07:15:00,6
1088
+ 2025-05-16 07:30:00,13
1089
+ 2025-05-16 07:45:00,13
1090
+ 2025-05-16 08:00:00,69
1091
+ 2025-05-16 08:15:00,56
1092
+ 2025-05-16 08:30:00,56
1093
+ 2025-05-16 08:45:00,58
1094
+ 2025-05-16 09:00:00,66
1095
+ 2025-05-16 09:15:00,56
1096
+ 2025-05-16 09:30:00,57
1097
+ 2025-05-16 09:45:00,60
1098
+ 2025-05-16 10:00:00,106
1099
+ 2025-05-16 10:15:00,100
1100
+ 2025-05-16 10:30:00,105
1101
+ 2025-05-16 10:45:00,107
1102
+ 2025-05-16 11:00:00,108
1103
+ 2025-05-16 11:15:00,96
1104
+ 2025-05-16 11:30:00,109
1105
+ 2025-05-16 11:45:00,98
1106
+ 2025-05-16 12:00:00,58
1107
+ 2025-05-16 12:15:00,67
1108
+ 2025-05-16 12:30:00,58
1109
+ 2025-05-16 12:45:00,58
1110
+ 2025-05-16 13:00:00,49
1111
+ 2025-05-16 13:15:00,52
1112
+ 2025-05-16 13:30:00,43
1113
+ 2025-05-16 13:45:00,43
1114
+ 2025-05-16 14:00:00,60
1115
+ 2025-05-16 14:15:00,68
1116
+ 2025-05-16 14:30:00,62
1117
+ 2025-05-16 14:45:00,61
1118
+ 2025-05-16 15:00:00,89
1119
+ 2025-05-16 15:15:00,98
1120
+ 2025-05-16 15:30:00,85
1121
+ 2025-05-16 15:45:00,90
1122
+ 2025-05-16 16:00:00,86
1123
+ 2025-05-16 16:15:00,92
1124
+ 2025-05-16 16:30:00,85
1125
+ 2025-05-16 16:45:00,87
1126
+ 2025-05-16 17:00:00,56
1127
+ 2025-05-16 17:15:00,69
1128
+ 2025-05-16 17:30:00,62
1129
+ 2025-05-16 17:45:00,64
1130
+ 2025-05-16 18:00:00,67
1131
+ 2025-05-16 18:15:00,69
1132
+ 2025-05-16 18:30:00,64
1133
+ 2025-05-16 18:45:00,63
1134
+ 2025-05-16 19:00:00,55
1135
+ 2025-05-16 19:15:00,59
1136
+ 2025-05-16 19:30:00,55
1137
+ 2025-05-16 19:45:00,56
1138
+ 2025-05-16 20:00:00,67
1139
+ 2025-05-16 20:15:00,64
1140
+ 2025-05-16 20:30:00,65
1141
+ 2025-05-16 20:45:00,56
1142
+ 2025-05-16 21:00:00,65
1143
+ 2025-05-16 21:15:00,68
1144
+ 2025-05-16 21:30:00,69
1145
+ 2025-05-16 21:45:00,56
1146
+ 2025-05-16 22:00:00,19
1147
+ 2025-05-16 22:15:00,17
1148
+ 2025-05-16 22:30:00,11
1149
+ 2025-05-16 22:45:00,11
1150
+ 2025-05-16 23:00:00,19
1151
+ 2025-05-16 23:15:00,18
1152
+ 2025-05-16 23:30:00,7
1153
+ 2025-05-16 23:45:00,5
1154
+ 2025-05-17 00:00:00,3
1155
+ 2025-05-17 00:15:00,3
1156
+ 2025-05-17 00:30:00,0
1157
+ 2025-05-17 00:45:00,2
1158
+ 2025-05-17 01:00:00,3
1159
+ 2025-05-17 01:15:00,0
1160
+ 2025-05-17 01:30:00,13
1161
+ 2025-05-17 01:45:00,0
1162
+ 2025-05-17 02:00:00,4
1163
+ 2025-05-17 02:15:00,8
1164
+ 2025-05-17 02:30:00,6
1165
+ 2025-05-17 02:45:00,10
1166
+ 2025-05-17 03:00:00,8
1167
+ 2025-05-17 03:15:00,4
1168
+ 2025-05-17 03:30:00,0
1169
+ 2025-05-17 03:45:00,5
1170
+ 2025-05-17 04:00:00,0
1171
+ 2025-05-17 04:15:00,5
1172
+ 2025-05-17 04:30:00,9
1173
+ 2025-05-17 04:45:00,0
1174
+ 2025-05-17 05:00:00,6
1175
+ 2025-05-17 05:15:00,10
1176
+ 2025-05-17 05:30:00,6
1177
+ 2025-05-17 05:45:00,4
1178
+ 2025-05-17 06:00:00,8
1179
+ 2025-05-17 06:15:00,3
1180
+ 2025-05-17 06:30:00,0
1181
+ 2025-05-17 06:45:00,0
1182
+ 2025-05-17 07:00:00,5
1183
+ 2025-05-17 07:15:00,11
1184
+ 2025-05-17 07:30:00,0
1185
+ 2025-05-17 07:45:00,0
1186
+ 2025-05-17 08:00:00,10
1187
+ 2025-05-17 08:15:00,11
1188
+ 2025-05-17 08:30:00,19
1189
+ 2025-05-17 08:45:00,18
1190
+ 2025-05-17 09:00:00,8
1191
+ 2025-05-17 09:15:00,12
1192
+ 2025-05-17 09:30:00,20
1193
+ 2025-05-17 09:45:00,15
1194
+ 2025-05-17 10:00:00,20
1195
+ 2025-05-17 10:15:00,16
1196
+ 2025-05-17 10:30:00,15
1197
+ 2025-05-17 10:45:00,28
1198
+ 2025-05-17 11:00:00,25
1199
+ 2025-05-17 11:15:00,28
1200
+ 2025-05-17 11:30:00,17
1201
+ 2025-05-17 11:45:00,22
1202
+ 2025-05-17 12:00:00,15
1203
+ 2025-05-17 12:15:00,18
1204
+ 2025-05-17 12:30:00,19
1205
+ 2025-05-17 12:45:00,10
1206
+ 2025-05-17 13:00:00,14
1207
+ 2025-05-17 13:15:00,7
1208
+ 2025-05-17 13:30:00,13
1209
+ 2025-05-17 13:45:00,10
1210
+ 2025-05-17 14:00:00,16
1211
+ 2025-05-17 14:15:00,7
1212
+ 2025-05-17 14:30:00,20
1213
+ 2025-05-17 14:45:00,19
1214
+ 2025-05-17 15:00:00,14
1215
+ 2025-05-17 15:15:00,27
1216
+ 2025-05-17 15:30:00,14
1217
+ 2025-05-17 15:45:00,25
1218
+ 2025-05-17 16:00:00,27
1219
+ 2025-05-17 16:15:00,16
1220
+ 2025-05-17 16:30:00,27
1221
+ 2025-05-17 16:45:00,18
1222
+ 2025-05-17 17:00:00,15
1223
+ 2025-05-17 17:15:00,7
1224
+ 2025-05-17 17:30:00,13
1225
+ 2025-05-17 17:45:00,11
1226
+ 2025-05-17 18:00:00,13
1227
+ 2025-05-17 18:15:00,12
1228
+ 2025-05-17 18:30:00,12
1229
+ 2025-05-17 18:45:00,18
1230
+ 2025-05-17 19:00:00,13
1231
+ 2025-05-17 19:15:00,14
1232
+ 2025-05-17 19:30:00,13
1233
+ 2025-05-17 19:45:00,12
1234
+ 2025-05-17 20:00:00,16
1235
+ 2025-05-17 20:15:00,21
1236
+ 2025-05-17 20:30:00,21
1237
+ 2025-05-17 20:45:00,19
1238
+ 2025-05-17 21:00:00,10
1239
+ 2025-05-17 21:15:00,18
1240
+ 2025-05-17 21:30:00,18
1241
+ 2025-05-17 21:45:00,17
1242
+ 2025-05-17 22:00:00,0
1243
+ 2025-05-17 22:15:00,0
1244
+ 2025-05-17 22:30:00,2
1245
+ 2025-05-17 22:45:00,8
1246
+ 2025-05-17 23:00:00,8
1247
+ 2025-05-17 23:15:00,9
1248
+ 2025-05-17 23:30:00,10
1249
+ 2025-05-17 23:45:00,0
1250
+ 2025-05-18 00:00:00,0
1251
+ 2025-05-18 00:15:00,0
1252
+ 2025-05-18 00:30:00,0
1253
+ 2025-05-18 00:45:00,3
1254
+ 2025-05-18 01:00:00,0
1255
+ 2025-05-18 01:15:00,5
1256
+ 2025-05-18 01:30:00,13
1257
+ 2025-05-18 01:45:00,10
1258
+ 2025-05-18 02:00:00,6
1259
+ 2025-05-18 02:15:00,7
1260
+ 2025-05-18 02:30:00,7
1261
+ 2025-05-18 02:45:00,0
1262
+ 2025-05-18 03:00:00,0
1263
+ 2025-05-18 03:15:00,5
1264
+ 2025-05-18 03:30:00,9
1265
+ 2025-05-18 03:45:00,1
1266
+ 2025-05-18 04:00:00,9
1267
+ 2025-05-18 04:15:00,10
1268
+ 2025-05-18 04:30:00,1
1269
+ 2025-05-18 04:45:00,5
1270
+ 2025-05-18 05:00:00,11
1271
+ 2025-05-18 05:15:00,9
1272
+ 2025-05-18 05:30:00,0
1273
+ 2025-05-18 05:45:00,5
1274
+ 2025-05-18 06:00:00,9
1275
+ 2025-05-18 06:15:00,12
1276
+ 2025-05-18 06:30:00,5
1277
+ 2025-05-18 06:45:00,12
1278
+ 2025-05-18 07:00:00,5
1279
+ 2025-05-18 07:15:00,4
1280
+ 2025-05-18 07:30:00,0
1281
+ 2025-05-18 07:45:00,6
1282
+ 2025-05-18 08:00:00,17
1283
+ 2025-05-18 08:15:00,17
1284
+ 2025-05-18 08:30:00,9
1285
+ 2025-05-18 08:45:00,13
1286
+ 2025-05-18 09:00:00,7
1287
+ 2025-05-18 09:15:00,16
1288
+ 2025-05-18 09:30:00,7
1289
+ 2025-05-18 09:45:00,17
1290
+ 2025-05-18 10:00:00,16
1291
+ 2025-05-18 10:15:00,23
1292
+ 2025-05-18 10:30:00,22
1293
+ 2025-05-18 10:45:00,16
1294
+ 2025-05-18 11:00:00,25
1295
+ 2025-05-18 11:15:00,28
1296
+ 2025-05-18 11:30:00,15
1297
+ 2025-05-18 11:45:00,15
1298
+ 2025-05-18 12:00:00,10
1299
+ 2025-05-18 12:15:00,14
1300
+ 2025-05-18 12:30:00,7
1301
+ 2025-05-18 12:45:00,12
1302
+ 2025-05-18 13:00:00,6
1303
+ 2025-05-18 13:15:00,4
1304
+ 2025-05-18 13:30:00,10
1305
+ 2025-05-18 13:45:00,13
1306
+ 2025-05-18 14:00:00,11
1307
+ 2025-05-18 14:15:00,10
1308
+ 2025-05-18 14:30:00,12
1309
+ 2025-05-18 14:45:00,20
1310
+ 2025-05-18 15:00:00,19
1311
+ 2025-05-18 15:15:00,18
1312
+ 2025-05-18 15:30:00,23
1313
+ 2025-05-18 15:45:00,16
1314
+ 2025-05-18 16:00:00,17
1315
+ 2025-05-18 16:15:00,14
1316
+ 2025-05-18 16:30:00,21
1317
+ 2025-05-18 16:45:00,17
1318
+ 2025-05-18 17:00:00,13
1319
+ 2025-05-18 17:15:00,21
1320
+ 2025-05-18 17:30:00,20
1321
+ 2025-05-18 17:45:00,11
1322
+ 2025-05-18 18:00:00,18
1323
+ 2025-05-18 18:15:00,18
1324
+ 2025-05-18 18:30:00,13
1325
+ 2025-05-18 18:45:00,8
1326
+ 2025-05-18 19:00:00,11
1327
+ 2025-05-18 19:15:00,8
1328
+ 2025-05-18 19:30:00,13
1329
+ 2025-05-18 19:45:00,14
1330
+ 2025-05-18 20:00:00,9
1331
+ 2025-05-18 20:15:00,21
1332
+ 2025-05-18 20:30:00,12
1333
+ 2025-05-18 20:45:00,8
1334
+ 2025-05-18 21:00:00,13
1335
+ 2025-05-18 21:15:00,18
1336
+ 2025-05-18 21:30:00,16
1337
+ 2025-05-18 21:45:00,21
1338
+ 2025-05-18 22:00:00,0
1339
+ 2025-05-18 22:15:00,9
1340
+ 2025-05-18 22:30:00,10
1341
+ 2025-05-18 22:45:00,0
1342
+ 2025-05-18 23:00:00,0
1343
+ 2025-05-18 23:15:00,8
1344
+ 2025-05-18 23:30:00,1
1345
+ 2025-05-18 23:45:00,5
1346
+ 2025-05-19 00:00:00,4
1347
+ 2025-05-19 00:15:00,9
1348
+ 2025-05-19 00:30:00,9
1349
+ 2025-05-19 00:45:00,2
1350
+ 2025-05-19 01:00:00,0
1351
+ 2025-05-19 01:15:00,7
1352
+ 2025-05-19 01:30:00,10
1353
+ 2025-05-19 01:45:00,5
1354
+ 2025-05-19 02:00:00,5
1355
+ 2025-05-19 02:15:00,4
1356
+ 2025-05-19 02:30:00,0
1357
+ 2025-05-19 02:45:00,10
1358
+ 2025-05-19 03:00:00,11
1359
+ 2025-05-19 03:15:00,5
1360
+ 2025-05-19 03:30:00,2
1361
+ 2025-05-19 03:45:00,2
1362
+ 2025-05-19 04:00:00,0
1363
+ 2025-05-19 04:15:00,4
1364
+ 2025-05-19 04:30:00,3
1365
+ 2025-05-19 04:45:00,6
1366
+ 2025-05-19 05:00:00,10
1367
+ 2025-05-19 05:15:00,0
1368
+ 2025-05-19 05:30:00,0
1369
+ 2025-05-19 05:45:00,6
1370
+ 2025-05-19 06:00:00,1
1371
+ 2025-05-19 06:15:00,4
1372
+ 2025-05-19 06:30:00,5
1373
+ 2025-05-19 06:45:00,7
1374
+ 2025-05-19 07:00:00,11
1375
+ 2025-05-19 07:15:00,19
1376
+ 2025-05-19 07:30:00,13
1377
+ 2025-05-19 07:45:00,11
1378
+ 2025-05-19 08:00:00,74
1379
+ 2025-05-19 08:15:00,69
1380
+ 2025-05-19 08:30:00,79
1381
+ 2025-05-19 08:45:00,76
1382
+ 2025-05-19 09:00:00,69
1383
+ 2025-05-19 09:15:00,81
1384
+ 2025-05-19 09:30:00,69
1385
+ 2025-05-19 09:45:00,74
1386
+ 2025-05-19 10:00:00,123
1387
+ 2025-05-19 10:15:00,116
1388
+ 2025-05-19 10:30:00,123
1389
+ 2025-05-19 10:45:00,128
1390
+ 2025-05-19 11:00:00,115
1391
+ 2025-05-19 11:15:00,124
1392
+ 2025-05-19 11:30:00,119
1393
+ 2025-05-19 11:45:00,118
1394
+ 2025-05-19 12:00:00,76
1395
+ 2025-05-19 12:15:00,76
1396
+ 2025-05-19 12:30:00,74
1397
+ 2025-05-19 12:45:00,77
1398
+ 2025-05-19 13:00:00,49
1399
+ 2025-05-19 13:15:00,57
1400
+ 2025-05-19 13:30:00,57
1401
+ 2025-05-19 13:45:00,61
1402
+ 2025-05-19 14:00:00,71
1403
+ 2025-05-19 14:15:00,80
1404
+ 2025-05-19 14:30:00,69
1405
+ 2025-05-19 14:45:00,75
1406
+ 2025-05-19 15:00:00,107
1407
+ 2025-05-19 15:15:00,108
1408
+ 2025-05-19 15:30:00,114
1409
+ 2025-05-19 15:45:00,116
1410
+ 2025-05-19 16:00:00,103
1411
+ 2025-05-19 16:15:00,113
1412
+ 2025-05-19 16:30:00,109
1413
+ 2025-05-19 16:45:00,109
1414
+ 2025-05-19 17:00:00,76
1415
+ 2025-05-19 17:15:00,77
1416
+ 2025-05-19 17:30:00,73
1417
+ 2025-05-19 17:45:00,76
1418
+ 2025-05-19 18:00:00,73
1419
+ 2025-05-19 18:15:00,72
1420
+ 2025-05-19 18:30:00,72
1421
+ 2025-05-19 18:45:00,78
1422
+ 2025-05-19 19:00:00,69
1423
+ 2025-05-19 19:15:00,68
1424
+ 2025-05-19 19:30:00,77
1425
+ 2025-05-19 19:45:00,75
1426
+ 2025-05-19 20:00:00,70
1427
+ 2025-05-19 20:15:00,73
1428
+ 2025-05-19 20:30:00,77
1429
+ 2025-05-19 20:45:00,72
1430
+ 2025-05-19 21:00:00,72
1431
+ 2025-05-19 21:15:00,79
1432
+ 2025-05-19 21:30:00,74
1433
+ 2025-05-19 21:45:00,73
1434
+ 2025-05-19 22:00:00,19
1435
+ 2025-05-19 22:15:00,17
1436
+ 2025-05-19 22:30:00,19
1437
+ 2025-05-19 22:45:00,10
1438
+ 2025-05-19 23:00:00,12
1439
+ 2025-05-19 23:15:00,12
1440
+ 2025-05-19 23:30:00,9
1441
+ 2025-05-19 23:45:00,9
1442
+ 2025-05-20 00:00:00,7
1443
+ 2025-05-20 00:15:00,7
1444
+ 2025-05-20 00:30:00,4
1445
+ 2025-05-20 00:45:00,8
1446
+ 2025-05-20 01:00:00,1
1447
+ 2025-05-20 01:15:00,3
1448
+ 2025-05-20 01:30:00,6
1449
+ 2025-05-20 01:45:00,0
1450
+ 2025-05-20 02:00:00,4
1451
+ 2025-05-20 02:15:00,3
1452
+ 2025-05-20 02:30:00,2
1453
+ 2025-05-20 02:45:00,0
1454
+ 2025-05-20 03:00:00,8
1455
+ 2025-05-20 03:15:00,1
1456
+ 2025-05-20 03:30:00,10
1457
+ 2025-05-20 03:45:00,6
1458
+ 2025-05-20 04:00:00,6
1459
+ 2025-05-20 04:15:00,1
1460
+ 2025-05-20 04:30:00,2
1461
+ 2025-05-20 04:45:00,7
1462
+ 2025-05-20 05:00:00,11
1463
+ 2025-05-20 05:15:00,4
1464
+ 2025-05-20 05:30:00,11
1465
+ 2025-05-20 05:45:00,0
1466
+ 2025-05-20 06:00:00,0
1467
+ 2025-05-20 06:15:00,4
1468
+ 2025-05-20 06:30:00,8
1469
+ 2025-05-20 06:45:00,0
1470
+ 2025-05-20 07:00:00,7
1471
+ 2025-05-20 07:15:00,8
1472
+ 2025-05-20 07:30:00,12
1473
+ 2025-05-20 07:45:00,12
1474
+ 2025-05-20 08:00:00,81
1475
+ 2025-05-20 08:15:00,73
1476
+ 2025-05-20 08:30:00,78
1477
+ 2025-05-20 08:45:00,67
1478
+ 2025-05-20 09:00:00,70
1479
+ 2025-05-20 09:15:00,78
1480
+ 2025-05-20 09:30:00,73
1481
+ 2025-05-20 09:45:00,68
1482
+ 2025-05-20 10:00:00,125
1483
+ 2025-05-20 10:15:00,120
1484
+ 2025-05-20 10:30:00,119
1485
+ 2025-05-20 10:45:00,122
1486
+ 2025-05-20 11:00:00,115
1487
+ 2025-05-20 11:15:00,126
1488
+ 2025-05-20 11:30:00,115
1489
+ 2025-05-20 11:45:00,124
1490
+ 2025-05-20 12:00:00,79
1491
+ 2025-05-20 12:15:00,79
1492
+ 2025-05-20 12:30:00,81
1493
+ 2025-05-20 12:45:00,77
1494
+ 2025-05-20 13:00:00,61
1495
+ 2025-05-20 13:15:00,63
1496
+ 2025-05-20 13:30:00,62
1497
+ 2025-05-20 13:45:00,49
1498
+ 2025-05-20 14:00:00,76
1499
+ 2025-05-20 14:15:00,79
1500
+ 2025-05-20 14:30:00,68
1501
+ 2025-05-20 14:45:00,74
1502
+ 2025-05-20 15:00:00,116
1503
+ 2025-05-20 15:15:00,111
1504
+ 2025-05-20 15:30:00,105
1505
+ 2025-05-20 15:45:00,104
1506
+ 2025-05-20 16:00:00,115
1507
+ 2025-05-20 16:15:00,117
1508
+ 2025-05-20 16:30:00,117
1509
+ 2025-05-20 16:45:00,112
1510
+ 2025-05-20 17:00:00,80
1511
+ 2025-05-20 17:15:00,68
1512
+ 2025-05-20 17:30:00,72
1513
+ 2025-05-20 17:45:00,74
1514
+ 2025-05-20 18:00:00,80
1515
+ 2025-05-20 18:15:00,76
1516
+ 2025-05-20 18:30:00,79
1517
+ 2025-05-20 18:45:00,70
1518
+ 2025-05-20 19:00:00,75
1519
+ 2025-05-20 19:15:00,80
1520
+ 2025-05-20 19:30:00,76
1521
+ 2025-05-20 19:45:00,73
1522
+ 2025-05-20 20:00:00,69
1523
+ 2025-05-20 20:15:00,70
1524
+ 2025-05-20 20:30:00,81
1525
+ 2025-05-20 20:45:00,72
1526
+ 2025-05-20 21:00:00,71
1527
+ 2025-05-20 21:15:00,75
1528
+ 2025-05-20 21:30:00,76
1529
+ 2025-05-20 21:45:00,70
1530
+ 2025-05-20 22:00:00,9
1531
+ 2025-05-20 22:15:00,14
1532
+ 2025-05-20 22:30:00,17
1533
+ 2025-05-20 22:45:00,18
1534
+ 2025-05-20 23:00:00,11
1535
+ 2025-05-20 23:15:00,15
1536
+ 2025-05-20 23:30:00,15
1537
+ 2025-05-20 23:45:00,14
1538
+ 2025-05-21 00:00:00,2
1539
+ 2025-05-21 00:15:00,7
1540
+ 2025-05-21 00:30:00,0
1541
+ 2025-05-21 00:45:00,8
1542
+ 2025-05-21 01:00:00,0
1543
+ 2025-05-21 01:15:00,0
1544
+ 2025-05-21 01:30:00,4
1545
+ 2025-05-21 01:45:00,9
1546
+ 2025-05-21 02:00:00,9
1547
+ 2025-05-21 02:15:00,2
1548
+ 2025-05-21 02:30:00,10
1549
+ 2025-05-21 02:45:00,0
1550
+ 2025-05-21 03:00:00,8
1551
+ 2025-05-21 03:15:00,0
1552
+ 2025-05-21 03:30:00,3
1553
+ 2025-05-21 03:45:00,0
1554
+ 2025-05-21 04:00:00,0
1555
+ 2025-05-21 04:15:00,4
1556
+ 2025-05-21 04:30:00,9
1557
+ 2025-05-21 04:45:00,0
1558
+ 2025-05-21 05:00:00,9
1559
+ 2025-05-21 05:15:00,6
1560
+ 2025-05-21 05:30:00,6
1561
+ 2025-05-21 05:45:00,10
1562
+ 2025-05-21 06:00:00,8
1563
+ 2025-05-21 06:15:00,1
1564
+ 2025-05-21 06:30:00,0
1565
+ 2025-05-21 06:45:00,3
1566
+ 2025-05-21 07:00:00,11
1567
+ 2025-05-21 07:15:00,13
1568
+ 2025-05-21 07:30:00,7
1569
+ 2025-05-21 07:45:00,15
1570
+ 2025-05-21 08:00:00,56
1571
+ 2025-05-21 08:15:00,69
1572
+ 2025-05-21 08:30:00,59
1573
+ 2025-05-21 08:45:00,63
1574
+ 2025-05-21 09:00:00,55
1575
+ 2025-05-21 09:15:00,60
1576
+ 2025-05-21 09:30:00,58
1577
+ 2025-05-21 09:45:00,65
1578
+ 2025-05-21 10:00:00,95
1579
+ 2025-05-21 10:15:00,109
1580
+ 2025-05-21 10:30:00,102
1581
+ 2025-05-21 10:45:00,102
1582
+ 2025-05-21 11:00:00,106
1583
+ 2025-05-21 11:15:00,104
1584
+ 2025-05-21 11:30:00,104
1585
+ 2025-05-21 11:45:00,98
1586
+ 2025-05-21 12:00:00,55
1587
+ 2025-05-21 12:15:00,66
1588
+ 2025-05-21 12:30:00,67
1589
+ 2025-05-21 12:45:00,67
1590
+ 2025-05-21 13:00:00,40
1591
+ 2025-05-21 13:15:00,47
1592
+ 2025-05-21 13:30:00,54
1593
+ 2025-05-21 13:45:00,52
1594
+ 2025-05-21 14:00:00,68
1595
+ 2025-05-21 14:15:00,61
1596
+ 2025-05-21 14:30:00,68
1597
+ 2025-05-21 14:45:00,63
1598
+ 2025-05-21 15:00:00,86
1599
+ 2025-05-21 15:15:00,96
1600
+ 2025-05-21 15:30:00,98
1601
+ 2025-05-21 15:45:00,87
1602
+ 2025-05-21 16:00:00,95
1603
+ 2025-05-21 16:15:00,96
1604
+ 2025-05-21 16:30:00,88
1605
+ 2025-05-21 16:45:00,87
1606
+ 2025-05-21 17:00:00,55
1607
+ 2025-05-21 17:15:00,62
1608
+ 2025-05-21 17:30:00,63
1609
+ 2025-05-21 17:45:00,57
1610
+ 2025-05-21 18:00:00,58
1611
+ 2025-05-21 18:15:00,61
1612
+ 2025-05-21 18:30:00,60
1613
+ 2025-05-21 18:45:00,68
1614
+ 2025-05-21 19:00:00,60
1615
+ 2025-05-21 19:15:00,55
1616
+ 2025-05-21 19:30:00,66
1617
+ 2025-05-21 19:45:00,67
1618
+ 2025-05-21 20:00:00,65
1619
+ 2025-05-21 20:15:00,57
1620
+ 2025-05-21 20:30:00,65
1621
+ 2025-05-21 20:45:00,59
1622
+ 2025-05-21 21:00:00,66
1623
+ 2025-05-21 21:15:00,63
1624
+ 2025-05-21 21:30:00,57
1625
+ 2025-05-21 21:45:00,68
1626
+ 2025-05-21 22:00:00,19
1627
+ 2025-05-21 22:15:00,10
1628
+ 2025-05-21 22:30:00,18
1629
+ 2025-05-21 22:45:00,16
1630
+ 2025-05-21 23:00:00,7
1631
+ 2025-05-21 23:15:00,16
1632
+ 2025-05-21 23:30:00,5
1633
+ 2025-05-21 23:45:00,5
1634
+ 2025-05-22 00:00:00,8
1635
+ 2025-05-22 00:15:00,4
1636
+ 2025-05-22 00:30:00,11
1637
+ 2025-05-22 00:45:00,0
1638
+ 2025-05-22 01:00:00,12
1639
+ 2025-05-22 01:15:00,2
1640
+ 2025-05-22 01:30:00,12
1641
+ 2025-05-22 01:45:00,1
1642
+ 2025-05-22 02:00:00,2
1643
+ 2025-05-22 02:15:00,5
1644
+ 2025-05-22 02:30:00,3
1645
+ 2025-05-22 02:45:00,3
1646
+ 2025-05-22 03:00:00,3
1647
+ 2025-05-22 03:15:00,10
1648
+ 2025-05-22 03:30:00,4
1649
+ 2025-05-22 03:45:00,6
1650
+ 2025-05-22 04:00:00,4
1651
+ 2025-05-22 04:15:00,7
1652
+ 2025-05-22 04:30:00,8
1653
+ 2025-05-22 04:45:00,6
1654
+ 2025-05-22 05:00:00,10
1655
+ 2025-05-22 05:15:00,0
1656
+ 2025-05-22 05:30:00,13
1657
+ 2025-05-22 05:45:00,10
1658
+ 2025-05-22 06:00:00,3
1659
+ 2025-05-22 06:15:00,2
1660
+ 2025-05-22 06:30:00,11
1661
+ 2025-05-22 06:45:00,0
1662
+ 2025-05-22 07:00:00,14
1663
+ 2025-05-22 07:15:00,19
1664
+ 2025-05-22 07:30:00,8
1665
+ 2025-05-22 07:45:00,14
1666
+ 2025-05-22 08:00:00,68
1667
+ 2025-05-22 08:15:00,57
1668
+ 2025-05-22 08:30:00,68
1669
+ 2025-05-22 08:45:00,58
1670
+ 2025-05-22 09:00:00,61
1671
+ 2025-05-22 09:15:00,57
1672
+ 2025-05-22 09:30:00,59
1673
+ 2025-05-22 09:45:00,63
1674
+ 2025-05-22 10:00:00,100
1675
+ 2025-05-22 10:15:00,96
1676
+ 2025-05-22 10:30:00,103
1677
+ 2025-05-22 10:45:00,102
1678
+ 2025-05-22 11:00:00,95
1679
+ 2025-05-22 11:15:00,96
1680
+ 2025-05-22 11:30:00,106
1681
+ 2025-05-22 11:45:00,96
1682
+ 2025-05-22 12:00:00,69
1683
+ 2025-05-22 12:15:00,62
1684
+ 2025-05-22 12:30:00,63
1685
+ 2025-05-22 12:45:00,58
1686
+ 2025-05-22 13:00:00,42
1687
+ 2025-05-22 13:15:00,51
1688
+ 2025-05-22 13:30:00,43
1689
+ 2025-05-22 13:45:00,45
1690
+ 2025-05-22 14:00:00,69
1691
+ 2025-05-22 14:15:00,61
1692
+ 2025-05-22 14:30:00,69
1693
+ 2025-05-22 14:45:00,69
1694
+ 2025-05-22 15:00:00,86
1695
+ 2025-05-22 15:15:00,93
1696
+ 2025-05-22 15:30:00,88
1697
+ 2025-05-22 15:45:00,98
1698
+ 2025-05-22 16:00:00,86
1699
+ 2025-05-22 16:15:00,91
1700
+ 2025-05-22 16:30:00,92
1701
+ 2025-05-22 16:45:00,96
1702
+ 2025-05-22 17:00:00,56
1703
+ 2025-05-22 17:15:00,57
1704
+ 2025-05-22 17:30:00,61
1705
+ 2025-05-22 17:45:00,68
1706
+ 2025-05-22 18:00:00,55
1707
+ 2025-05-22 18:15:00,69
1708
+ 2025-05-22 18:30:00,65
1709
+ 2025-05-22 18:45:00,64
1710
+ 2025-05-22 19:00:00,60
1711
+ 2025-05-22 19:15:00,61
1712
+ 2025-05-22 19:30:00,63
1713
+ 2025-05-22 19:45:00,64
1714
+ 2025-05-22 20:00:00,60
1715
+ 2025-05-22 20:15:00,67
1716
+ 2025-05-22 20:30:00,59
1717
+ 2025-05-22 20:45:00,59
1718
+ 2025-05-22 21:00:00,56
1719
+ 2025-05-22 21:15:00,63
1720
+ 2025-05-22 21:30:00,58
1721
+ 2025-05-22 21:45:00,59
1722
+ 2025-05-22 22:00:00,5
1723
+ 2025-05-22 22:15:00,10
1724
+ 2025-05-22 22:30:00,13
1725
+ 2025-05-22 22:45:00,13
1726
+ 2025-05-22 23:00:00,11
1727
+ 2025-05-22 23:15:00,5
1728
+ 2025-05-22 23:30:00,15
1729
+ 2025-05-22 23:45:00,11
1730
+ 2025-05-23 00:00:00,3
1731
+ 2025-05-23 00:15:00,7
1732
+ 2025-05-23 00:30:00,7
1733
+ 2025-05-23 00:45:00,9
1734
+ 2025-05-23 01:00:00,4
1735
+ 2025-05-23 01:15:00,0
1736
+ 2025-05-23 01:30:00,6
1737
+ 2025-05-23 01:45:00,10
1738
+ 2025-05-23 02:00:00,2
1739
+ 2025-05-23 02:15:00,1
1740
+ 2025-05-23 02:30:00,0
1741
+ 2025-05-23 02:45:00,7
1742
+ 2025-05-23 03:00:00,3
1743
+ 2025-05-23 03:15:00,8
1744
+ 2025-05-23 03:30:00,0
1745
+ 2025-05-23 03:45:00,6
1746
+ 2025-05-23 04:00:00,1
1747
+ 2025-05-23 04:15:00,7
1748
+ 2025-05-23 04:30:00,0
1749
+ 2025-05-23 04:45:00,3
1750
+ 2025-05-23 05:00:00,3
1751
+ 2025-05-23 05:15:00,10
1752
+ 2025-05-23 05:30:00,4
1753
+ 2025-05-23 05:45:00,0
1754
+ 2025-05-23 06:00:00,9
1755
+ 2025-05-23 06:15:00,6
1756
+ 2025-05-23 06:30:00,0
1757
+ 2025-05-23 06:45:00,10
1758
+ 2025-05-23 07:00:00,6
1759
+ 2025-05-23 07:15:00,6
1760
+ 2025-05-23 07:30:00,15
1761
+ 2025-05-23 07:45:00,10
1762
+ 2025-05-23 08:00:00,62
1763
+ 2025-05-23 08:15:00,56
1764
+ 2025-05-23 08:30:00,57
1765
+ 2025-05-23 08:45:00,58
1766
+ 2025-05-23 09:00:00,67
1767
+ 2025-05-23 09:15:00,58
1768
+ 2025-05-23 09:30:00,67
1769
+ 2025-05-23 09:45:00,57
1770
+ 2025-05-23 10:00:00,106
1771
+ 2025-05-23 10:15:00,109
1772
+ 2025-05-23 10:30:00,104
1773
+ 2025-05-23 10:45:00,96
1774
+ 2025-05-23 11:00:00,106
1775
+ 2025-05-23 11:15:00,109
1776
+ 2025-05-23 11:30:00,95
1777
+ 2025-05-23 11:45:00,100
1778
+ 2025-05-23 12:00:00,66
1779
+ 2025-05-23 12:15:00,60
1780
+ 2025-05-23 12:30:00,66
1781
+ 2025-05-23 12:45:00,58
1782
+ 2025-05-23 13:00:00,44
1783
+ 2025-05-23 13:15:00,46
1784
+ 2025-05-23 13:30:00,42
1785
+ 2025-05-23 13:45:00,42
1786
+ 2025-05-23 14:00:00,61
1787
+ 2025-05-23 14:15:00,58
1788
+ 2025-05-23 14:30:00,63
1789
+ 2025-05-23 14:45:00,60
1790
+ 2025-05-23 15:00:00,88
1791
+ 2025-05-23 15:15:00,96
1792
+ 2025-05-23 15:30:00,95
1793
+ 2025-05-23 15:45:00,85
1794
+ 2025-05-23 16:00:00,91
1795
+ 2025-05-23 16:15:00,94
1796
+ 2025-05-23 16:30:00,91
1797
+ 2025-05-23 16:45:00,86
1798
+ 2025-05-23 17:00:00,60
1799
+ 2025-05-23 17:15:00,61
1800
+ 2025-05-23 17:30:00,61
1801
+ 2025-05-23 17:45:00,68
1802
+ 2025-05-23 18:00:00,64
1803
+ 2025-05-23 18:15:00,61
1804
+ 2025-05-23 18:30:00,60
1805
+ 2025-05-23 18:45:00,56
1806
+ 2025-05-23 19:00:00,60
1807
+ 2025-05-23 19:15:00,55
1808
+ 2025-05-23 19:30:00,62
1809
+ 2025-05-23 19:45:00,64
1810
+ 2025-05-23 20:00:00,64
1811
+ 2025-05-23 20:15:00,68
1812
+ 2025-05-23 20:30:00,66
1813
+ 2025-05-23 20:45:00,60
1814
+ 2025-05-23 21:00:00,69
1815
+ 2025-05-23 21:15:00,56
1816
+ 2025-05-23 21:30:00,59
1817
+ 2025-05-23 21:45:00,55
1818
+ 2025-05-23 22:00:00,18
1819
+ 2025-05-23 22:15:00,15
1820
+ 2025-05-23 22:30:00,15
1821
+ 2025-05-23 22:45:00,12
1822
+ 2025-05-23 23:00:00,5
1823
+ 2025-05-23 23:15:00,9
1824
+ 2025-05-23 23:30:00,19
1825
+ 2025-05-23 23:45:00,11
1826
+ 2025-05-24 00:00:00,0
1827
+ 2025-05-24 00:15:00,6
1828
+ 2025-05-24 00:30:00,4
1829
+ 2025-05-24 00:45:00,6
1830
+ 2025-05-24 01:00:00,7
1831
+ 2025-05-24 01:15:00,0
1832
+ 2025-05-24 01:30:00,0
1833
+ 2025-05-24 01:45:00,0
1834
+ 2025-05-24 02:00:00,7
1835
+ 2025-05-24 02:15:00,4
1836
+ 2025-05-24 02:30:00,12
1837
+ 2025-05-24 02:45:00,5
1838
+ 2025-05-24 03:00:00,5
1839
+ 2025-05-24 03:15:00,0
1840
+ 2025-05-24 03:30:00,8
1841
+ 2025-05-24 03:45:00,10
1842
+ 2025-05-24 04:00:00,4
1843
+ 2025-05-24 04:15:00,9
1844
+ 2025-05-24 04:30:00,0
1845
+ 2025-05-24 04:45:00,7
1846
+ 2025-05-24 05:00:00,2
1847
+ 2025-05-24 05:15:00,0
1848
+ 2025-05-24 05:30:00,9
1849
+ 2025-05-24 05:45:00,0
1850
+ 2025-05-24 06:00:00,7
1851
+ 2025-05-24 06:15:00,2
1852
+ 2025-05-24 06:30:00,11
1853
+ 2025-05-24 06:45:00,0
1854
+ 2025-05-24 07:00:00,0
1855
+ 2025-05-24 07:15:00,0
1856
+ 2025-05-24 07:30:00,9
1857
+ 2025-05-24 07:45:00,0
1858
+ 2025-05-24 08:00:00,10
1859
+ 2025-05-24 08:15:00,7
1860
+ 2025-05-24 08:30:00,15
1861
+ 2025-05-24 08:45:00,12
1862
+ 2025-05-24 09:00:00,20
1863
+ 2025-05-24 09:15:00,18
1864
+ 2025-05-24 09:30:00,14
1865
+ 2025-05-24 09:45:00,18
1866
+ 2025-05-24 10:00:00,16
1867
+ 2025-05-24 10:15:00,16
1868
+ 2025-05-24 10:30:00,20
1869
+ 2025-05-24 10:45:00,28
1870
+ 2025-05-24 11:00:00,23
1871
+ 2025-05-24 11:15:00,18
1872
+ 2025-05-24 11:30:00,17
1873
+ 2025-05-24 11:45:00,21
1874
+ 2025-05-24 12:00:00,8
1875
+ 2025-05-24 12:15:00,17
1876
+ 2025-05-24 12:30:00,19
1877
+ 2025-05-24 12:45:00,14
1878
+ 2025-05-24 13:00:00,8
1879
+ 2025-05-24 13:15:00,10
1880
+ 2025-05-24 13:30:00,8
1881
+ 2025-05-24 13:45:00,5
1882
+ 2025-05-24 14:00:00,19
1883
+ 2025-05-24 14:15:00,14
1884
+ 2025-05-24 14:30:00,18
1885
+ 2025-05-24 14:45:00,18
1886
+ 2025-05-24 15:00:00,13
1887
+ 2025-05-24 15:15:00,24
1888
+ 2025-05-24 15:30:00,16
1889
+ 2025-05-24 15:45:00,23
1890
+ 2025-05-24 16:00:00,20
1891
+ 2025-05-24 16:15:00,20
1892
+ 2025-05-24 16:30:00,25
1893
+ 2025-05-24 16:45:00,26
1894
+ 2025-05-24 17:00:00,15
1895
+ 2025-05-24 17:15:00,16
1896
+ 2025-05-24 17:30:00,21
1897
+ 2025-05-24 17:45:00,13
1898
+ 2025-05-24 18:00:00,19
1899
+ 2025-05-24 18:15:00,19
1900
+ 2025-05-24 18:30:00,11
1901
+ 2025-05-24 18:45:00,19
1902
+ 2025-05-24 19:00:00,10
1903
+ 2025-05-24 19:15:00,18
1904
+ 2025-05-24 19:30:00,10
1905
+ 2025-05-24 19:45:00,20
1906
+ 2025-05-24 20:00:00,10
1907
+ 2025-05-24 20:15:00,12
1908
+ 2025-05-24 20:30:00,16
1909
+ 2025-05-24 20:45:00,18
1910
+ 2025-05-24 21:00:00,8
1911
+ 2025-05-24 21:15:00,13
1912
+ 2025-05-24 21:30:00,15
1913
+ 2025-05-24 21:45:00,12
1914
+ 2025-05-24 22:00:00,2
1915
+ 2025-05-24 22:15:00,2
1916
+ 2025-05-24 22:30:00,1
1917
+ 2025-05-24 22:45:00,11
1918
+ 2025-05-24 23:00:00,0
1919
+ 2025-05-24 23:15:00,0
1920
+ 2025-05-24 23:30:00,6
1921
+ 2025-05-24 23:45:00,2
1922
+ 2025-05-25 00:00:00,3
1923
+ 2025-05-25 00:15:00,11
1924
+ 2025-05-25 00:30:00,1
1925
+ 2025-05-25 00:45:00,0
1926
+ 2025-05-25 01:00:00,0
1927
+ 2025-05-25 01:15:00,6
1928
+ 2025-05-25 01:30:00,10
1929
+ 2025-05-25 01:45:00,0
1930
+ 2025-05-25 02:00:00,1
1931
+ 2025-05-25 02:15:00,6
1932
+ 2025-05-25 02:30:00,0
1933
+ 2025-05-25 02:45:00,3
1934
+ 2025-05-25 03:00:00,6
1935
+ 2025-05-25 03:15:00,7
1936
+ 2025-05-25 03:30:00,0
1937
+ 2025-05-25 03:45:00,0
1938
+ 2025-05-25 04:00:00,0
1939
+ 2025-05-25 04:15:00,0
1940
+ 2025-05-25 04:30:00,2
1941
+ 2025-05-25 04:45:00,2
1942
+ 2025-05-25 05:00:00,0
1943
+ 2025-05-25 05:15:00,3
1944
+ 2025-05-25 05:30:00,8
1945
+ 2025-05-25 05:45:00,0
1946
+ 2025-05-25 06:00:00,1
1947
+ 2025-05-25 06:15:00,0
1948
+ 2025-05-25 06:30:00,0
1949
+ 2025-05-25 06:45:00,0
1950
+ 2025-05-25 07:00:00,0
1951
+ 2025-05-25 07:15:00,0
1952
+ 2025-05-25 07:30:00,6
1953
+ 2025-05-25 07:45:00,6
1954
+ 2025-05-25 08:00:00,16
1955
+ 2025-05-25 08:15:00,19
1956
+ 2025-05-25 08:30:00,10
1957
+ 2025-05-25 08:45:00,7
1958
+ 2025-05-25 09:00:00,7
1959
+ 2025-05-25 09:15:00,9
1960
+ 2025-05-25 09:30:00,8
1961
+ 2025-05-25 09:45:00,8
1962
+ 2025-05-25 10:00:00,27
1963
+ 2025-05-25 10:15:00,18
1964
+ 2025-05-25 10:30:00,23
1965
+ 2025-05-25 10:45:00,26
1966
+ 2025-05-25 11:00:00,28
1967
+ 2025-05-25 11:15:00,24
1968
+ 2025-05-25 11:30:00,20
1969
+ 2025-05-25 11:45:00,27
1970
+ 2025-05-25 12:00:00,9
1971
+ 2025-05-25 12:15:00,8
1972
+ 2025-05-25 12:30:00,15
1973
+ 2025-05-25 12:45:00,19
1974
+ 2025-05-25 13:00:00,5
1975
+ 2025-05-25 13:15:00,17
1976
+ 2025-05-25 13:30:00,16
1977
+ 2025-05-25 13:45:00,12
1978
+ 2025-05-25 14:00:00,16
1979
+ 2025-05-25 14:15:00,8
1980
+ 2025-05-25 14:30:00,20
1981
+ 2025-05-25 14:45:00,15
1982
+ 2025-05-25 15:00:00,21
1983
+ 2025-05-25 15:15:00,22
1984
+ 2025-05-25 15:30:00,19
1985
+ 2025-05-25 15:45:00,26
1986
+ 2025-05-25 16:00:00,22
1987
+ 2025-05-25 16:15:00,24
1988
+ 2025-05-25 16:30:00,26
1989
+ 2025-05-25 16:45:00,21
1990
+ 2025-05-25 17:00:00,11
1991
+ 2025-05-25 17:15:00,17
1992
+ 2025-05-25 17:30:00,18
1993
+ 2025-05-25 17:45:00,8
1994
+ 2025-05-25 18:00:00,15
1995
+ 2025-05-25 18:15:00,18
1996
+ 2025-05-25 18:30:00,16
1997
+ 2025-05-25 18:45:00,19
1998
+ 2025-05-25 19:00:00,12
1999
+ 2025-05-25 19:15:00,8
2000
+ 2025-05-25 19:30:00,7
2001
+ 2025-05-25 19:45:00,12
2002
+ 2025-05-25 20:00:00,17
2003
+ 2025-05-25 20:15:00,10
2004
+ 2025-05-25 20:30:00,16
2005
+ 2025-05-25 20:45:00,16
2006
+ 2025-05-25 21:00:00,9
2007
+ 2025-05-25 21:15:00,7
2008
+ 2025-05-25 21:30:00,10
2009
+ 2025-05-25 21:45:00,19
2010
+ 2025-05-25 22:00:00,1
2011
+ 2025-05-25 22:15:00,5
2012
+ 2025-05-25 22:30:00,1
2013
+ 2025-05-25 22:45:00,0
2014
+ 2025-05-25 23:00:00,3
2015
+ 2025-05-25 23:15:00,5
2016
+ 2025-05-25 23:30:00,4
2017
+ 2025-05-25 23:45:00,5
2018
+ 2025-05-26 00:00:00,9
2019
+ 2025-05-26 00:15:00,0
2020
+ 2025-05-26 00:30:00,4
2021
+ 2025-05-26 00:45:00,0
2022
+ 2025-05-26 01:00:00,0
2023
+ 2025-05-26 01:15:00,8
2024
+ 2025-05-26 01:30:00,5
2025
+ 2025-05-26 01:45:00,2
2026
+ 2025-05-26 02:00:00,1
2027
+ 2025-05-26 02:15:00,6
2028
+ 2025-05-26 02:30:00,4
2029
+ 2025-05-26 02:45:00,2
2030
+ 2025-05-26 03:00:00,6
2031
+ 2025-05-26 03:15:00,1
2032
+ 2025-05-26 03:30:00,6
2033
+ 2025-05-26 03:45:00,0
2034
+ 2025-05-26 04:00:00,10
2035
+ 2025-05-26 04:15:00,13
2036
+ 2025-05-26 04:30:00,1
2037
+ 2025-05-26 04:45:00,4
2038
+ 2025-05-26 05:00:00,5
2039
+ 2025-05-26 05:15:00,2
2040
+ 2025-05-26 05:30:00,0
2041
+ 2025-05-26 05:45:00,9
2042
+ 2025-05-26 06:00:00,9
2043
+ 2025-05-26 06:15:00,2
2044
+ 2025-05-26 06:30:00,12
2045
+ 2025-05-26 06:45:00,11
2046
+ 2025-05-26 07:00:00,11
2047
+ 2025-05-26 07:15:00,17
2048
+ 2025-05-26 07:30:00,9
2049
+ 2025-05-26 07:45:00,15
2050
+ 2025-05-26 08:00:00,68
2051
+ 2025-05-26 08:15:00,74
2052
+ 2025-05-26 08:30:00,75
2053
+ 2025-05-26 08:45:00,74
2054
+ 2025-05-26 09:00:00,67
2055
+ 2025-05-26 09:15:00,68
2056
+ 2025-05-26 09:30:00,69
2057
+ 2025-05-26 09:45:00,78
2058
+ 2025-05-26 10:00:00,129
2059
+ 2025-05-26 10:15:00,128
2060
+ 2025-05-26 10:30:00,128
2061
+ 2025-05-26 10:45:00,123
2062
+ 2025-05-26 11:00:00,117
2063
+ 2025-05-26 11:15:00,116
2064
+ 2025-05-26 11:30:00,125
2065
+ 2025-05-26 11:45:00,121
2066
+ 2025-05-26 12:00:00,77
2067
+ 2025-05-26 12:15:00,71
2068
+ 2025-05-26 12:30:00,74
2069
+ 2025-05-26 12:45:00,73
2070
+ 2025-05-26 13:00:00,59
2071
+ 2025-05-26 13:15:00,63
2072
+ 2025-05-26 13:30:00,55
2073
+ 2025-05-26 13:45:00,49
2074
+ 2025-05-26 14:00:00,75
2075
+ 2025-05-26 14:15:00,72
2076
+ 2025-05-26 14:30:00,69
2077
+ 2025-05-26 14:45:00,67
2078
+ 2025-05-26 15:00:00,113
2079
+ 2025-05-26 15:15:00,108
2080
+ 2025-05-26 15:30:00,113
2081
+ 2025-05-26 15:45:00,117
2082
+ 2025-05-26 16:00:00,110
2083
+ 2025-05-26 16:15:00,117
2084
+ 2025-05-26 16:30:00,105
2085
+ 2025-05-26 16:45:00,114
2086
+ 2025-05-26 17:00:00,81
2087
+ 2025-05-26 17:15:00,79
2088
+ 2025-05-26 17:30:00,80
2089
+ 2025-05-26 17:45:00,81
2090
+ 2025-05-26 18:00:00,77
2091
+ 2025-05-26 18:15:00,78
2092
+ 2025-05-26 18:30:00,67
2093
+ 2025-05-26 18:45:00,74
2094
+ 2025-05-26 19:00:00,72
2095
+ 2025-05-26 19:15:00,72
2096
+ 2025-05-26 19:30:00,79
2097
+ 2025-05-26 19:45:00,68
2098
+ 2025-05-26 20:00:00,80
2099
+ 2025-05-26 20:15:00,72
2100
+ 2025-05-26 20:30:00,76
2101
+ 2025-05-26 20:45:00,75
2102
+ 2025-05-26 21:00:00,79
2103
+ 2025-05-26 21:15:00,73
2104
+ 2025-05-26 21:30:00,75
2105
+ 2025-05-26 21:45:00,73
2106
+ 2025-05-26 22:00:00,10
2107
+ 2025-05-26 22:15:00,19
2108
+ 2025-05-26 22:30:00,18
2109
+ 2025-05-26 22:45:00,21
2110
+ 2025-05-26 23:00:00,13
2111
+ 2025-05-26 23:15:00,8
2112
+ 2025-05-26 23:30:00,9
2113
+ 2025-05-26 23:45:00,8
2114
+ 2025-05-27 00:00:00,3
2115
+ 2025-05-27 00:15:00,0
2116
+ 2025-05-27 00:30:00,0
2117
+ 2025-05-27 00:45:00,3
2118
+ 2025-05-27 01:00:00,5
2119
+ 2025-05-27 01:15:00,10
2120
+ 2025-05-27 01:30:00,12
2121
+ 2025-05-27 01:45:00,5
2122
+ 2025-05-27 02:00:00,10
2123
+ 2025-05-27 02:15:00,2
2124
+ 2025-05-27 02:30:00,5
2125
+ 2025-05-27 02:45:00,7
2126
+ 2025-05-27 03:00:00,7
2127
+ 2025-05-27 03:15:00,6
2128
+ 2025-05-27 03:30:00,0
2129
+ 2025-05-27 03:45:00,0
2130
+ 2025-05-27 04:00:00,0
2131
+ 2025-05-27 04:15:00,4
2132
+ 2025-05-27 04:30:00,9
2133
+ 2025-05-27 04:45:00,6
2134
+ 2025-05-27 05:00:00,7
2135
+ 2025-05-27 05:15:00,4
2136
+ 2025-05-27 05:30:00,4
2137
+ 2025-05-27 05:45:00,8
2138
+ 2025-05-27 06:00:00,8
2139
+ 2025-05-27 06:15:00,9
2140
+ 2025-05-27 06:30:00,3
2141
+ 2025-05-27 06:45:00,1
2142
+ 2025-05-27 07:00:00,8
2143
+ 2025-05-27 07:15:00,17
2144
+ 2025-05-27 07:30:00,19
2145
+ 2025-05-27 07:45:00,9
2146
+ 2025-05-27 08:00:00,80
2147
+ 2025-05-27 08:15:00,78
2148
+ 2025-05-27 08:30:00,68
2149
+ 2025-05-27 08:45:00,72
2150
+ 2025-05-27 09:00:00,70
2151
+ 2025-05-27 09:15:00,70
2152
+ 2025-05-27 09:30:00,76
2153
+ 2025-05-27 09:45:00,68
2154
+ 2025-05-27 10:00:00,120
2155
+ 2025-05-27 10:15:00,127
2156
+ 2025-05-27 10:30:00,121
2157
+ 2025-05-27 10:45:00,121
2158
+ 2025-05-27 11:00:00,121
2159
+ 2025-05-27 11:15:00,125
2160
+ 2025-05-27 11:30:00,123
2161
+ 2025-05-27 11:45:00,121
2162
+ 2025-05-27 12:00:00,75
2163
+ 2025-05-27 12:15:00,76
2164
+ 2025-05-27 12:30:00,69
2165
+ 2025-05-27 12:45:00,76
2166
+ 2025-05-27 13:00:00,63
2167
+ 2025-05-27 13:15:00,49
2168
+ 2025-05-27 13:30:00,57
2169
+ 2025-05-27 13:45:00,61
2170
+ 2025-05-27 14:00:00,73
2171
+ 2025-05-27 14:15:00,77
2172
+ 2025-05-27 14:30:00,73
2173
+ 2025-05-27 14:45:00,72
2174
+ 2025-05-27 15:00:00,110
2175
+ 2025-05-27 15:15:00,115
2176
+ 2025-05-27 15:30:00,110
2177
+ 2025-05-27 15:45:00,106
2178
+ 2025-05-27 16:00:00,114
2179
+ 2025-05-27 16:15:00,108
2180
+ 2025-05-27 16:30:00,112
2181
+ 2025-05-27 16:45:00,105
2182
+ 2025-05-27 17:00:00,77
2183
+ 2025-05-27 17:15:00,68
2184
+ 2025-05-27 17:30:00,67
2185
+ 2025-05-27 17:45:00,72
2186
+ 2025-05-27 18:00:00,72
2187
+ 2025-05-27 18:15:00,70
2188
+ 2025-05-27 18:30:00,72
2189
+ 2025-05-27 18:45:00,74
2190
+ 2025-05-27 19:00:00,77
2191
+ 2025-05-27 19:15:00,67
2192
+ 2025-05-27 19:30:00,69
2193
+ 2025-05-27 19:45:00,73
2194
+ 2025-05-27 20:00:00,67
2195
+ 2025-05-27 20:15:00,74
2196
+ 2025-05-27 20:30:00,72
2197
+ 2025-05-27 20:45:00,73
2198
+ 2025-05-27 21:00:00,78
2199
+ 2025-05-27 21:15:00,74
2200
+ 2025-05-27 21:30:00,76
2201
+ 2025-05-27 21:45:00,80
2202
+ 2025-05-27 22:00:00,21
2203
+ 2025-05-27 22:15:00,12
2204
+ 2025-05-27 22:30:00,10
2205
+ 2025-05-27 22:45:00,21
2206
+ 2025-05-27 23:00:00,13
2207
+ 2025-05-27 23:15:00,7
2208
+ 2025-05-27 23:30:00,18
2209
+ 2025-05-27 23:45:00,15
2210
+ 2025-05-28 00:00:00,5
2211
+ 2025-05-28 00:15:00,11
2212
+ 2025-05-28 00:30:00,5
2213
+ 2025-05-28 00:45:00,10
2214
+ 2025-05-28 01:00:00,6
2215
+ 2025-05-28 01:15:00,7
2216
+ 2025-05-28 01:30:00,6
2217
+ 2025-05-28 01:45:00,0
2218
+ 2025-05-28 02:00:00,10
2219
+ 2025-05-28 02:15:00,2
2220
+ 2025-05-28 02:30:00,9
2221
+ 2025-05-28 02:45:00,9
2222
+ 2025-05-28 03:00:00,3
2223
+ 2025-05-28 03:15:00,10
2224
+ 2025-05-28 03:30:00,9
2225
+ 2025-05-28 03:45:00,0
2226
+ 2025-05-28 04:00:00,0
2227
+ 2025-05-28 04:15:00,4
2228
+ 2025-05-28 04:30:00,4
2229
+ 2025-05-28 04:45:00,7
2230
+ 2025-05-28 05:00:00,4
2231
+ 2025-05-28 05:15:00,9
2232
+ 2025-05-28 05:30:00,6
2233
+ 2025-05-28 05:45:00,0
2234
+ 2025-05-28 06:00:00,0
2235
+ 2025-05-28 06:15:00,0
2236
+ 2025-05-28 06:30:00,0
2237
+ 2025-05-28 06:45:00,2
2238
+ 2025-05-28 07:00:00,17
2239
+ 2025-05-28 07:15:00,12
2240
+ 2025-05-28 07:30:00,11
2241
+ 2025-05-28 07:45:00,9
2242
+ 2025-05-28 08:00:00,65
2243
+ 2025-05-28 08:15:00,58
2244
+ 2025-05-28 08:30:00,62
2245
+ 2025-05-28 08:45:00,57
2246
+ 2025-05-28 09:00:00,60
2247
+ 2025-05-28 09:15:00,59
2248
+ 2025-05-28 09:30:00,63
2249
+ 2025-05-28 09:45:00,61
2250
+ 2025-05-28 10:00:00,105
2251
+ 2025-05-28 10:15:00,107
2252
+ 2025-05-28 10:30:00,104
2253
+ 2025-05-28 10:45:00,100
2254
+ 2025-05-28 11:00:00,99
2255
+ 2025-05-28 11:15:00,107
2256
+ 2025-05-28 11:30:00,104
2257
+ 2025-05-28 11:45:00,96
2258
+ 2025-05-28 12:00:00,61
2259
+ 2025-05-28 12:15:00,65
2260
+ 2025-05-28 12:30:00,62
2261
+ 2025-05-28 12:45:00,57
2262
+ 2025-05-28 13:00:00,51
2263
+ 2025-05-28 13:15:00,54
2264
+ 2025-05-28 13:30:00,48
2265
+ 2025-05-28 13:45:00,40
2266
+ 2025-05-28 14:00:00,65
2267
+ 2025-05-28 14:15:00,63
2268
+ 2025-05-28 14:30:00,61
2269
+ 2025-05-28 14:45:00,63
2270
+ 2025-05-28 15:00:00,93
2271
+ 2025-05-28 15:15:00,85
2272
+ 2025-05-28 15:30:00,88
2273
+ 2025-05-28 15:45:00,90
2274
+ 2025-05-28 16:00:00,95
2275
+ 2025-05-28 16:15:00,99
2276
+ 2025-05-28 16:30:00,85
2277
+ 2025-05-28 16:45:00,90
2278
+ 2025-05-28 17:00:00,68
2279
+ 2025-05-28 17:15:00,62
2280
+ 2025-05-28 17:30:00,67
2281
+ 2025-05-28 17:45:00,62
2282
+ 2025-05-28 18:00:00,55
2283
+ 2025-05-28 18:15:00,67
2284
+ 2025-05-28 18:30:00,55
2285
+ 2025-05-28 18:45:00,61
2286
+ 2025-05-28 19:00:00,69
2287
+ 2025-05-28 19:15:00,58
2288
+ 2025-05-28 19:30:00,55
2289
+ 2025-05-28 19:45:00,63
2290
+ 2025-05-28 20:00:00,69
2291
+ 2025-05-28 20:15:00,65
2292
+ 2025-05-28 20:30:00,62
2293
+ 2025-05-28 20:45:00,57
2294
+ 2025-05-28 21:00:00,65
2295
+ 2025-05-28 21:15:00,59
2296
+ 2025-05-28 21:30:00,56
2297
+ 2025-05-28 21:45:00,66
2298
+ 2025-05-28 22:00:00,12
2299
+ 2025-05-28 22:15:00,16
2300
+ 2025-05-28 22:30:00,6
2301
+ 2025-05-28 22:45:00,17
2302
+ 2025-05-28 23:00:00,5
2303
+ 2025-05-28 23:15:00,12
2304
+ 2025-05-28 23:30:00,17
2305
+ 2025-05-28 23:45:00,11
2306
+ 2025-05-29 00:00:00,2
2307
+ 2025-05-29 00:15:00,0
2308
+ 2025-05-29 00:30:00,0
2309
+ 2025-05-29 00:45:00,0
2310
+ 2025-05-29 01:00:00,0
2311
+ 2025-05-29 01:15:00,6
2312
+ 2025-05-29 01:30:00,9
2313
+ 2025-05-29 01:45:00,7
2314
+ 2025-05-29 02:00:00,4
2315
+ 2025-05-29 02:15:00,7
2316
+ 2025-05-29 02:30:00,8
2317
+ 2025-05-29 02:45:00,0
2318
+ 2025-05-29 03:00:00,12
2319
+ 2025-05-29 03:15:00,0
2320
+ 2025-05-29 03:30:00,5
2321
+ 2025-05-29 03:45:00,0
2322
+ 2025-05-29 04:00:00,8
2323
+ 2025-05-29 04:15:00,2
2324
+ 2025-05-29 04:30:00,10
2325
+ 2025-05-29 04:45:00,0
2326
+ 2025-05-29 05:00:00,7
2327
+ 2025-05-29 05:15:00,1
2328
+ 2025-05-29 05:30:00,9
2329
+ 2025-05-29 05:45:00,0
2330
+ 2025-05-29 06:00:00,1
2331
+ 2025-05-29 06:15:00,12
2332
+ 2025-05-29 06:30:00,3
2333
+ 2025-05-29 06:45:00,4
2334
+ 2025-05-29 07:00:00,19
2335
+ 2025-05-29 07:15:00,12
2336
+ 2025-05-29 07:30:00,15
2337
+ 2025-05-29 07:45:00,6
2338
+ 2025-05-29 08:00:00,66
2339
+ 2025-05-29 08:15:00,66
2340
+ 2025-05-29 08:30:00,61
2341
+ 2025-05-29 08:45:00,63
2342
+ 2025-05-29 09:00:00,64
2343
+ 2025-05-29 09:15:00,57
2344
+ 2025-05-29 09:30:00,62
2345
+ 2025-05-29 09:45:00,60
2346
+ 2025-05-29 10:00:00,99
2347
+ 2025-05-29 10:15:00,101
2348
+ 2025-05-29 10:30:00,101
2349
+ 2025-05-29 10:45:00,104
2350
+ 2025-05-29 11:00:00,106
2351
+ 2025-05-29 11:15:00,101
2352
+ 2025-05-29 11:30:00,108
2353
+ 2025-05-29 11:45:00,108
2354
+ 2025-05-29 12:00:00,67
2355
+ 2025-05-29 12:15:00,66
2356
+ 2025-05-29 12:30:00,61
2357
+ 2025-05-29 12:45:00,57
2358
+ 2025-05-29 13:00:00,54
2359
+ 2025-05-29 13:15:00,54
2360
+ 2025-05-29 13:30:00,40
2361
+ 2025-05-29 13:45:00,43
2362
+ 2025-05-29 14:00:00,58
2363
+ 2025-05-29 14:15:00,58
2364
+ 2025-05-29 14:30:00,69
2365
+ 2025-05-29 14:45:00,69
2366
+ 2025-05-29 15:00:00,96
2367
+ 2025-05-29 15:15:00,85
2368
+ 2025-05-29 15:30:00,94
2369
+ 2025-05-29 15:45:00,85
2370
+ 2025-05-29 16:00:00,98
2371
+ 2025-05-29 16:15:00,97
2372
+ 2025-05-29 16:30:00,91
2373
+ 2025-05-29 16:45:00,97
2374
+ 2025-05-29 17:00:00,55
2375
+ 2025-05-29 17:15:00,59
2376
+ 2025-05-29 17:30:00,63
2377
+ 2025-05-29 17:45:00,68
2378
+ 2025-05-29 18:00:00,56
2379
+ 2025-05-29 18:15:00,60
2380
+ 2025-05-29 18:30:00,69
2381
+ 2025-05-29 18:45:00,59
2382
+ 2025-05-29 19:00:00,62
2383
+ 2025-05-29 19:15:00,63
2384
+ 2025-05-29 19:30:00,61
2385
+ 2025-05-29 19:45:00,64
2386
+ 2025-05-29 20:00:00,59
2387
+ 2025-05-29 20:15:00,63
2388
+ 2025-05-29 20:30:00,63
2389
+ 2025-05-29 20:45:00,61
2390
+ 2025-05-29 21:00:00,60
2391
+ 2025-05-29 21:15:00,61
2392
+ 2025-05-29 21:30:00,69
2393
+ 2025-05-29 21:45:00,69
2394
+ 2025-05-29 22:00:00,6
2395
+ 2025-05-29 22:15:00,16
2396
+ 2025-05-29 22:30:00,5
2397
+ 2025-05-29 22:45:00,18
2398
+ 2025-05-29 23:00:00,13
2399
+ 2025-05-29 23:15:00,15
2400
+ 2025-05-29 23:30:00,9
2401
+ 2025-05-29 23:45:00,8
2402
+ 2025-05-30 00:00:00,10
2403
+ 2025-05-30 00:15:00,1
2404
+ 2025-05-30 00:30:00,0
2405
+ 2025-05-30 00:45:00,5
2406
+ 2025-05-30 01:00:00,10
2407
+ 2025-05-30 01:15:00,10
2408
+ 2025-05-30 01:30:00,0
2409
+ 2025-05-30 01:45:00,3
2410
+ 2025-05-30 02:00:00,2
2411
+ 2025-05-30 02:15:00,0
2412
+ 2025-05-30 02:30:00,6
2413
+ 2025-05-30 02:45:00,6
2414
+ 2025-05-30 03:00:00,12
2415
+ 2025-05-30 03:15:00,0
2416
+ 2025-05-30 03:30:00,6
2417
+ 2025-05-30 03:45:00,0
2418
+ 2025-05-30 04:00:00,2
2419
+ 2025-05-30 04:15:00,1
2420
+ 2025-05-30 04:30:00,9
2421
+ 2025-05-30 04:45:00,2
2422
+ 2025-05-30 05:00:00,5
2423
+ 2025-05-30 05:15:00,2
2424
+ 2025-05-30 05:30:00,12
2425
+ 2025-05-30 05:45:00,7
2426
+ 2025-05-30 06:00:00,5
2427
+ 2025-05-30 06:15:00,0
2428
+ 2025-05-30 06:30:00,1
2429
+ 2025-05-30 06:45:00,10
2430
+ 2025-05-30 07:00:00,11
2431
+ 2025-05-30 07:15:00,12
2432
+ 2025-05-30 07:30:00,10
2433
+ 2025-05-30 07:45:00,19
2434
+ 2025-05-30 08:00:00,55
2435
+ 2025-05-30 08:15:00,59
2436
+ 2025-05-30 08:30:00,64
2437
+ 2025-05-30 08:45:00,56
2438
+ 2025-05-30 09:00:00,65
2439
+ 2025-05-30 09:15:00,55
2440
+ 2025-05-30 09:30:00,61
2441
+ 2025-05-30 09:45:00,68
2442
+ 2025-05-30 10:00:00,95
2443
+ 2025-05-30 10:15:00,95
2444
+ 2025-05-30 10:30:00,102
2445
+ 2025-05-30 10:45:00,98
2446
+ 2025-05-30 11:00:00,101
2447
+ 2025-05-30 11:15:00,97
2448
+ 2025-05-30 11:30:00,109
2449
+ 2025-05-30 11:45:00,95
2450
+ 2025-05-30 12:00:00,67
2451
+ 2025-05-30 12:15:00,66
2452
+ 2025-05-30 12:30:00,64
2453
+ 2025-05-30 12:45:00,55
2454
+ 2025-05-30 13:00:00,41
2455
+ 2025-05-30 13:15:00,48
2456
+ 2025-05-30 13:30:00,53
2457
+ 2025-05-30 13:45:00,41
2458
+ 2025-05-30 14:00:00,65
2459
+ 2025-05-30 14:15:00,66
2460
+ 2025-05-30 14:30:00,56
2461
+ 2025-05-30 14:45:00,55
2462
+ 2025-05-30 15:00:00,97
2463
+ 2025-05-30 15:15:00,96
2464
+ 2025-05-30 15:30:00,91
2465
+ 2025-05-30 15:45:00,88
2466
+ 2025-05-30 16:00:00,95
2467
+ 2025-05-30 16:15:00,98
2468
+ 2025-05-30 16:30:00,97
2469
+ 2025-05-30 16:45:00,97
2470
+ 2025-05-30 17:00:00,66
2471
+ 2025-05-30 17:15:00,63
2472
+ 2025-05-30 17:30:00,64
2473
+ 2025-05-30 17:45:00,69
2474
+ 2025-05-30 18:00:00,58
2475
+ 2025-05-30 18:15:00,66
2476
+ 2025-05-30 18:30:00,69
2477
+ 2025-05-30 18:45:00,59
2478
+ 2025-05-30 19:00:00,56
2479
+ 2025-05-30 19:15:00,59
2480
+ 2025-05-30 19:30:00,68
2481
+ 2025-05-30 19:45:00,64
2482
+ 2025-05-30 20:00:00,57
2483
+ 2025-05-30 20:15:00,60
2484
+ 2025-05-30 20:30:00,61
2485
+ 2025-05-30 20:45:00,56
2486
+ 2025-05-30 21:00:00,55
2487
+ 2025-05-30 21:15:00,57
2488
+ 2025-05-30 21:30:00,63
2489
+ 2025-05-30 21:45:00,60
2490
+ 2025-05-30 22:00:00,5
2491
+ 2025-05-30 22:15:00,18
2492
+ 2025-05-30 22:30:00,11
2493
+ 2025-05-30 22:45:00,18
2494
+ 2025-05-30 23:00:00,9
2495
+ 2025-05-30 23:15:00,9
2496
+ 2025-05-30 23:30:00,6
2497
+ 2025-05-30 23:45:00,8
2498
+ 2025-05-31 00:00:00,11
2499
+ 2025-05-31 00:15:00,3
2500
+ 2025-05-31 00:30:00,5
2501
+ 2025-05-31 00:45:00,2
2502
+ 2025-05-31 01:00:00,9
2503
+ 2025-05-31 01:15:00,4
2504
+ 2025-05-31 01:30:00,0
2505
+ 2025-05-31 01:45:00,1
2506
+ 2025-05-31 02:00:00,7
2507
+ 2025-05-31 02:15:00,0
2508
+ 2025-05-31 02:30:00,0
2509
+ 2025-05-31 02:45:00,0
2510
+ 2025-05-31 03:00:00,9
2511
+ 2025-05-31 03:15:00,11
2512
+ 2025-05-31 03:30:00,3
2513
+ 2025-05-31 03:45:00,1
2514
+ 2025-05-31 04:00:00,7
2515
+ 2025-05-31 04:15:00,0
2516
+ 2025-05-31 04:30:00,6
2517
+ 2025-05-31 04:45:00,4
2518
+ 2025-05-31 05:00:00,0
2519
+ 2025-05-31 05:15:00,3
2520
+ 2025-05-31 05:30:00,8
2521
+ 2025-05-31 05:45:00,3
2522
+ 2025-05-31 06:00:00,7
2523
+ 2025-05-31 06:15:00,9
2524
+ 2025-05-31 06:30:00,9
2525
+ 2025-05-31 06:45:00,0
2526
+ 2025-05-31 07:00:00,2
2527
+ 2025-05-31 07:15:00,7
2528
+ 2025-05-31 07:30:00,8
2529
+ 2025-05-31 07:45:00,11
2530
+ 2025-05-31 08:00:00,20
2531
+ 2025-05-31 08:15:00,21
2532
+ 2025-05-31 08:30:00,16
2533
+ 2025-05-31 08:45:00,11
2534
+ 2025-05-31 09:00:00,20
2535
+ 2025-05-31 09:15:00,21
2536
+ 2025-05-31 09:30:00,11
2537
+ 2025-05-31 09:45:00,19
2538
+ 2025-05-31 10:00:00,26
2539
+ 2025-05-31 10:15:00,29
2540
+ 2025-05-31 10:30:00,20
2541
+ 2025-05-31 10:45:00,22
2542
+ 2025-05-31 11:00:00,27
2543
+ 2025-05-31 11:15:00,15
2544
+ 2025-05-31 11:30:00,21
2545
+ 2025-05-31 11:45:00,25
2546
+ 2025-05-31 12:00:00,14
2547
+ 2025-05-31 12:15:00,15
2548
+ 2025-05-31 12:30:00,14
2549
+ 2025-05-31 12:45:00,7
2550
+ 2025-05-31 13:00:00,11
2551
+ 2025-05-31 13:15:00,10
2552
+ 2025-05-31 13:30:00,6
2553
+ 2025-05-31 13:45:00,17
2554
+ 2025-05-31 14:00:00,13
2555
+ 2025-05-31 14:15:00,14
2556
+ 2025-05-31 14:30:00,10
2557
+ 2025-05-31 14:45:00,13
2558
+ 2025-05-31 15:00:00,17
2559
+ 2025-05-31 15:15:00,23
2560
+ 2025-05-31 15:30:00,13
2561
+ 2025-05-31 15:45:00,14
2562
+ 2025-05-31 16:00:00,24
2563
+ 2025-05-31 16:15:00,23
2564
+ 2025-05-31 16:30:00,13
2565
+ 2025-05-31 16:45:00,27
2566
+ 2025-05-31 17:00:00,14
2567
+ 2025-05-31 17:15:00,11
2568
+ 2025-05-31 17:30:00,13
2569
+ 2025-05-31 17:45:00,18
2570
+ 2025-05-31 18:00:00,16
2571
+ 2025-05-31 18:15:00,14
2572
+ 2025-05-31 18:30:00,17
2573
+ 2025-05-31 18:45:00,20
2574
+ 2025-05-31 19:00:00,7
2575
+ 2025-05-31 19:15:00,7
2576
+ 2025-05-31 19:30:00,20
2577
+ 2025-05-31 19:45:00,17
2578
+ 2025-05-31 20:00:00,9
2579
+ 2025-05-31 20:15:00,16
2580
+ 2025-05-31 20:30:00,7
2581
+ 2025-05-31 20:45:00,16
2582
+ 2025-05-31 21:00:00,21
2583
+ 2025-05-31 21:15:00,21
2584
+ 2025-05-31 21:30:00,20
2585
+ 2025-05-31 21:45:00,12
2586
+ 2025-05-31 22:00:00,0
2587
+ 2025-05-31 22:15:00,9
2588
+ 2025-05-31 22:30:00,0
2589
+ 2025-05-31 22:45:00,2
2590
+ 2025-05-31 23:00:00,6
2591
+ 2025-05-31 23:15:00,5
2592
+ 2025-05-31 23:30:00,0
2593
+ 2025-05-31 23:45:00,0
2594
+ 2025-06-01 00:00:00,0
2595
+ 2025-06-01 00:15:00,10
2596
+ 2025-06-01 00:30:00,8
2597
+ 2025-06-01 00:45:00,0
2598
+ 2025-06-01 01:00:00,0
2599
+ 2025-06-01 01:15:00,10
2600
+ 2025-06-01 01:30:00,9
2601
+ 2025-06-01 01:45:00,3
2602
+ 2025-06-01 02:00:00,0
2603
+ 2025-06-01 02:15:00,4
2604
+ 2025-06-01 02:30:00,0
2605
+ 2025-06-01 02:45:00,1
2606
+ 2025-06-01 03:00:00,2
2607
+ 2025-06-01 03:15:00,2
2608
+ 2025-06-01 03:30:00,1
2609
+ 2025-06-01 03:45:00,2
2610
+ 2025-06-01 04:00:00,0
2611
+ 2025-06-01 04:15:00,6
2612
+ 2025-06-01 04:30:00,5
2613
+ 2025-06-01 04:45:00,7
2614
+ 2025-06-01 05:00:00,2
2615
+ 2025-06-01 05:15:00,0
2616
+ 2025-06-01 05:30:00,6
2617
+ 2025-06-01 05:45:00,0
2618
+ 2025-06-01 06:00:00,0
2619
+ 2025-06-01 06:15:00,3
2620
+ 2025-06-01 06:30:00,0
2621
+ 2025-06-01 06:45:00,6
2622
+ 2025-06-01 07:00:00,7
2623
+ 2025-06-01 07:15:00,1
2624
+ 2025-06-01 07:30:00,0
2625
+ 2025-06-01 07:45:00,9
2626
+ 2025-06-01 08:00:00,10
2627
+ 2025-06-01 08:15:00,10
2628
+ 2025-06-01 08:30:00,16
2629
+ 2025-06-01 08:45:00,20
2630
+ 2025-06-01 09:00:00,16
2631
+ 2025-06-01 09:15:00,10
2632
+ 2025-06-01 09:30:00,19
2633
+ 2025-06-01 09:45:00,9
2634
+ 2025-06-01 10:00:00,28
2635
+ 2025-06-01 10:15:00,15
2636
+ 2025-06-01 10:30:00,29
2637
+ 2025-06-01 10:45:00,24
2638
+ 2025-06-01 11:00:00,26
2639
+ 2025-06-01 11:15:00,20
2640
+ 2025-06-01 11:30:00,18
2641
+ 2025-06-01 11:45:00,20
2642
+ 2025-06-01 12:00:00,21
2643
+ 2025-06-01 12:15:00,11
2644
+ 2025-06-01 12:30:00,16
2645
+ 2025-06-01 12:45:00,13
2646
+ 2025-06-01 13:00:00,15
2647
+ 2025-06-01 13:15:00,14
2648
+ 2025-06-01 13:30:00,10
2649
+ 2025-06-01 13:45:00,18
2650
+ 2025-06-01 14:00:00,7
2651
+ 2025-06-01 14:15:00,9
2652
+ 2025-06-01 14:30:00,8
2653
+ 2025-06-01 14:45:00,11
2654
+ 2025-06-01 15:00:00,19
2655
+ 2025-06-01 15:15:00,18
2656
+ 2025-06-01 15:30:00,16
2657
+ 2025-06-01 15:45:00,27
2658
+ 2025-06-01 16:00:00,15
2659
+ 2025-06-01 16:15:00,18
2660
+ 2025-06-01 16:30:00,18
2661
+ 2025-06-01 16:45:00,13
2662
+ 2025-06-01 17:00:00,13
2663
+ 2025-06-01 17:15:00,16
2664
+ 2025-06-01 17:30:00,12
2665
+ 2025-06-01 17:45:00,16
2666
+ 2025-06-01 18:00:00,17
2667
+ 2025-06-01 18:15:00,15
2668
+ 2025-06-01 18:30:00,8
2669
+ 2025-06-01 18:45:00,19
2670
+ 2025-06-01 19:00:00,21
2671
+ 2025-06-01 19:15:00,8
2672
+ 2025-06-01 19:30:00,15
2673
+ 2025-06-01 19:45:00,9
2674
+ 2025-06-01 20:00:00,21
2675
+ 2025-06-01 20:15:00,18
2676
+ 2025-06-01 20:30:00,9
2677
+ 2025-06-01 20:45:00,11
2678
+ 2025-06-01 21:00:00,11
2679
+ 2025-06-01 21:15:00,19
2680
+ 2025-06-01 21:30:00,9
2681
+ 2025-06-01 21:45:00,13
2682
+ 2025-06-01 22:00:00,9
2683
+ 2025-06-01 22:15:00,10
2684
+ 2025-06-01 22:30:00,8
2685
+ 2025-06-01 22:45:00,7
2686
+ 2025-06-01 23:00:00,9
2687
+ 2025-06-01 23:15:00,4
2688
+ 2025-06-01 23:30:00,8
2689
+ 2025-06-01 23:45:00,0
data/model/sentiment_cnn/fingerprint.pb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:aa4ad552d8c1ff604fda007c2a4a12d12ed46c113ff73395b34b320ed50b9fcb
3
+ size 55
data/model/sentiment_cnn/saved_model.pb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:60358a6cd9a42ef17ff4cdfa615a9709335022ebe4ed7b4a817f910a62bf9a3f
3
+ size 484792
data/model/sentiment_cnn/variables/variables.data-00000-of-00001 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b995847e92171c7131791458150a1b95adb3f10efb5ebbf39c88cf040cd0af37
3
+ size 33695987
data/model/sentiment_cnn/variables/variables.index ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3655b1a982b52ca38198bca84f425b2fb7ece8aa65a0a3a9a810ec163f1daa30
3
+ size 2880
modules/binary_classification.py CHANGED
@@ -1,105 +1,62 @@
1
- import spacy
2
- import re
3
- import keras.models as models
4
- from nltk.corpus import stopwords
5
- import nltk
6
- import modules.utilities.utils as utils
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
- BASE_PATH = './data/'
9
- VOCAB = BASE_PATH + 'binary-classification-vocab.txt'
10
- MODEL = BASE_PATH + 'model/binary-classification.h5'
11
- WEIGHTS = BASE_PATH + 'weights/'
12
- TOKEN = BASE_PATH + 'tokenizer/binary-classification-tokenizer.json'
13
-
14
- def init():
15
- nltk.download('stopwords')
16
- global nlp
17
- nlp = spacy.load("it_core_news_lg")
18
-
19
- def load_vocab():
20
- vocab=utils.load_doc(VOCAB)
21
- vocab=vocab.split()
22
- vocab = set(vocab)
23
- return vocab
24
-
25
- def lemma_text(text):
26
- doc = nlp(text)
27
- lemmatized_tokens = [token.lemma_ for token in doc]
28
- lemmatized_text = ' '.join(lemmatized_tokens)
29
- return lemmatized_text
30
-
31
- def splitWords(l):
32
- for words in l:
33
- yield from words.split()
34
-
35
- def clean_doc(doc):
36
- # 1. Pulizia Standard
37
- doc = lemma_text(doc)
38
- tokens = doc.split()
39
- # Rimuovi punteggiatura
40
- tokens = [re.sub(r'[^\w\s]', ' ', w) for w in tokens]
41
- # Flattening della lista se splitWords ha creato sottoliste
42
- tokens = list(splitWords(tokens))
43
- # Solo alfabetici
44
- tokens = [word for word in tokens if word.isalpha()]
45
- # 2. STOPWORDS INTELLIGENTI
46
- stop_words = set(stopwords.words('italian'))
47
- # Parole da SALVARE (Whitelist)
48
- whitelist = {'non', 'né', 'ne', 'mai', 'nessuno', 'niente', 'nulla', 'contro', 'senza'}
49
- final_stop_words = stop_words - whitelist
50
- # Filtra
51
- tokens = [w for w in tokens if not w in final_stop_words]
52
- # Accetta parole anche di 2 lettere (es. "ne", "no")
53
- tokens = [word for word in tokens if len(word) > 1]
54
- return tokens
55
-
56
- def predict_sentiment(review, vocab, tokenizer, model):
57
- # clean
58
- tokens = clean_doc(review)
59
- # filter by vocab
60
- tokens = [w for w in tokens if w in vocab]
61
- # convert to line
62
- line = ' '.join(tokens)
63
- # encode
64
- encoded = tokenizer.texts_to_matrix([line], mode='tfidf')
65
- # predict sentiment
66
- yhat = model.predict(encoded, verbose=0)
67
- # retrieve predicted percentage and label
68
- percent_pos = yhat[0,0]
69
- if round(percent_pos) == 0:
70
- return (1-percent_pos), 'NEGATIVE'
71
- return percent_pos, 'POSITIVE'
72
-
73
- def predict(model_path, weights_path, tokenizer_path, text, debug) :
74
- tokenizer = utils.load_tokenizer(tokenizer_path)
75
- vocab = load_vocab()
76
- doc = lemma_text(text)
77
- model = models.load_model(model_path, compile=False)
78
- if(weights_path != '') :
79
- model.load_weights(weights_path, skip_mismatch=True, by_name=True)
80
- percent, sentiment = predict_sentiment(doc, vocab, tokenizer, model)
81
- if(debug):
82
- print('Review: [%s]\nSentiment: %s (%.3f%%)' % (doc, sentiment, percent*100))
83
- return doc, sentiment, percent
84
-
85
- def binary_classification(text):
86
- init()
87
- weights = ''
88
- try:
89
- if(text == "") : raise Exception
90
- except :
91
- return {"error": "Sentence is required"}, 415
92
- doc, sentiment, percent = predict(MODEL, weights, TOKEN, text, False)
93
- positive = 0
94
- negative = 0
95
- if(sentiment == 'POSITIVE'):
96
- positive = percent.astype(float) * 100
97
- negative = 100 - positive
98
- else:
99
- negative = percent.astype(float) * 100
100
- positive = 100 - negative
101
- labels = {
102
- 'positive' : "%.2f" % float(positive/100),
103
- 'negative' : "%.2f" % float(negative/100)
104
- }
105
- return labels
 
1
+ from __future__ import annotations
2
+ from typing import Optional
3
+ import tensorflow as tf
4
+ import os
5
+
6
+
7
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
8
+ MODEL_DIR_DEFAULT = os.path.join(BASE_DIR, 'data', 'model', 'sentiment_cnn')
9
+
10
+ # Cache di processo (il modello viene caricato una volta sola)
11
+ _INFER: Optional[tf.types.experimental.ConcreteFunction] = None
12
+ _MODEL_DIR_LOADED: Optional[str] = None
13
+
14
+ def _load_infer(model_dir: str) -> tf.types.experimental.ConcreteFunction:
15
+ """
16
+ Load SavedModel once and return serving function.
17
+ TF 2.12 compatible, expects signature 'serving_default'.
18
+ """
19
+ sm = tf.saved_model.load(model_dir)
20
+ return sm.signatures["serving_default"]
21
+
22
+ def _get_infer(model_dir: str) -> tf.types.experimental.ConcreteFunction:
23
+ global _INFER, _MODEL_DIR_LOADED
24
+ model_dir = str(model_dir)
25
+ if _INFER is None or _MODEL_DIR_LOADED != model_dir:
26
+ _INFER = _load_infer(model_dir)
27
+ _MODEL_DIR_LOADED = model_dir
28
+ return _INFER
29
+
30
+
31
+ def _predict_prob_positive(text: str, model_dir: str) -> float:
32
+ infer = _get_infer(model_dir)
33
+ x = tf.constant([text], dtype=tf.string)
34
+ out = infer(text=x)
35
+ # Output key stabilized by our exporter
36
+ y = out["prob"]
37
+ return float(y.numpy()[0][0])
38
+
39
+
40
+ def binary_classification(text: str):
41
+ """
42
+ IDENTICAL behavior to legacy:
43
+ - if text is empty -> ({"error": "Sentence is required"}, 415)
44
+ - else -> {"positive": "0.xx", "negative": "0.yy"} (strings, 2 decimals)
45
+ """
46
+ try:
47
+ if text == "":
48
+ raise Exception
49
+ except:
50
+ return {"error": "Sentence is required"}, 415
51
+
52
+ prob_pos = _predict_prob_positive(text, MODEL_DIR_DEFAULT)
53
+
54
+ positive = prob_pos
55
+ negative = 1.0 - positive
56
+
57
+ labels = {
58
+ "positive": f"{positive:.2f}",
59
+ "negative": f"{negative:.2f}",
60
+ }
61
+ return labels
62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/forecasting.py ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ from sklearn.ensemble import RandomForestRegressor
4
+ from sklearn.metrics import mean_absolute_error
5
+ import plotly.graph_objects as go
6
+ import io
7
+
8
+ def generate_mock_export():
9
+ """
10
+ Genera un CSV con 4 settimane di dati (28 giorni) per simulare una pianificazione.
11
+ Include pattern orari (picchi 10:00/16:00), settimanali (Lunedì alto) e festivi.
12
+ """
13
+ # Generiamo dati partendo da un Lunedì recente
14
+ start_date = pd.Timestamp("2025-05-05")
15
+ periods = 28 * 24 * 4
16
+ dates = pd.date_range(start=start_date, periods=periods, freq='15min')
17
+ df = pd.DataFrame({'Timestamp': dates})
18
+ df['Hour'] = df['Timestamp'].dt.hour
19
+ df['DayOfWeek'] = df['Timestamp'].dt.dayofweek
20
+ base_volume = 10
21
+ df['Volume'] = base_volume
22
+ mask_work = (df['Hour'] >= 8) & (df['Hour'] <= 21)
23
+ df.loc[mask_work, 'Volume'] += 50
24
+ mask_peak1 = (df['Hour'] >= 10) & (df['Hour'] <= 11)
25
+ mask_peak2 = (df['Hour'] >= 15) & (df['Hour'] <= 16)
26
+ df.loc[mask_peak1, 'Volume'] += 40
27
+ df.loc[mask_peak2, 'Volume'] += 30
28
+ df.loc[df['Hour'] == 13, 'Volume'] -= 15
29
+ df.loc[df['DayOfWeek'] <= 1, 'Volume'] *= 1.2
30
+ df.loc[df['DayOfWeek'] >= 5, 'Volume'] *= 0.2
31
+ df.loc[df['Hour'] < 7, 'Volume'] = np.random.randint(0, 5, size=sum(df['Hour'] < 7))
32
+ noise = np.random.randint(-5, 10, size=len(df))
33
+ df['Volume'] += noise
34
+ df['Volume'] = df['Volume'].clip(lower=0).astype(int)
35
+
36
+ csv_buffer = io.StringIO()
37
+ df[['Timestamp', 'Volume']].to_csv(csv_buffer, index=False)
38
+ csv_buffer.seek(0)
39
+ return csv_buffer.getvalue()
40
+
41
+ def predict_workload(file_obj):
42
+ """
43
+ Logica Backtesting con Output PLOTLY (Interattivo).
44
+ """
45
+ if file_obj is None: return None, "⚠️ Seleziona un file CSV dalla sidebar laterale."
46
+
47
+ try:
48
+ # Caricamento file cvs
49
+ if hasattr(file_obj, 'name'):
50
+ df = pd.read_csv(file_obj.name)
51
+ else:
52
+ df = pd.read_csv(file_obj)
53
+
54
+ df['Timestamp'] = pd.to_datetime(df['Timestamp'])
55
+ df = df.sort_values('Timestamp')
56
+
57
+ # --- LOGICA SPLIT settimana n da settimane n-1 ---
58
+ last_timestamp = df['Timestamp'].max()
59
+ days_to_subtract = last_timestamp.dayofweek
60
+ split_date = (last_timestamp - pd.Timedelta(days=days_to_subtract)).normalize()
61
+
62
+ train_df = df[df['Timestamp'] < split_date].copy()
63
+ test_df = df[df['Timestamp'] >= split_date].copy()
64
+
65
+ if len(train_df) == 0 or len(test_df) == 0:
66
+ return None, "⚠️ Dati insufficienti per il backtesting."
67
+
68
+ # --- TRAINING ---
69
+ for d in [train_df, test_df]:
70
+ d['Hour'] = d['Timestamp'].dt.hour
71
+ d['Minute'] = d['Timestamp'].dt.minute
72
+ d['DayOfWeek'] = d['Timestamp'].dt.dayofweek
73
+
74
+ X_train = train_df[['Hour', 'Minute', 'DayOfWeek']]
75
+ y_train = train_df['Volume']
76
+
77
+ model = RandomForestRegressor(n_estimators=100, random_state=42)
78
+ model.fit(X_train, y_train)
79
+
80
+ # --- PREDICTION ---
81
+ X_test = test_df[['Hour', 'Minute', 'DayOfWeek']]
82
+ test_df['Predicted_Volume'] = model.predict(X_test).astype(int)
83
+
84
+ # --- METRICS ---
85
+ total_actual = test_df['Volume'].sum()
86
+ total_pred = test_df['Predicted_Volume'].sum()
87
+ mae = mean_absolute_error(test_df['Volume'], test_df['Predicted_Volume'])
88
+ diff_perc = ((total_pred - total_actual) / total_actual) * 100
89
+
90
+ # ==========================================
91
+ # CREAZIONE GRAFICO INTERATTIVO (PLOTLY)
92
+ # ==========================================
93
+
94
+ # Creiamo un oggetto Figure
95
+ fig = go.Figure()
96
+
97
+ # 1. Serie: Dati Reali
98
+ fig.add_trace(go.Scatter(
99
+ x=test_df['Timestamp'],
100
+ y=test_df['Volume'],
101
+ mode='lines',
102
+ name='Reale (Consuntivo)',
103
+ line=dict(color='#3b82f6', width=2),
104
+ fill='tozeroy', # Riempie l'area sotto
105
+ fillcolor='rgba(59, 130, 246, 0.2)' # Blu trasparente
106
+ ))
107
+
108
+ # 2. Serie: Forecast AI (Previsione)
109
+ fig.add_trace(go.Scatter(
110
+ x=test_df['Timestamp'],
111
+ y=test_df['Predicted_Volume'],
112
+ mode='lines+markers', # Linea con pallini sui punti
113
+ name='Forecast AI (Pianificato)',
114
+ line=dict(color='#f97316', width=3, dash='solid'),
115
+ marker=dict(size=4)
116
+ ))
117
+
118
+ # 3. Layout e Stile
119
+ fig.update_layout(
120
+ title=f"<b>Analisi Comparativa:</b> Reale vs AI (Settimana corrente)",
121
+ xaxis_title="Fascia Oraria (15min)",
122
+ yaxis_title="Volume Chiamate",
123
+ template="plotly_white", # Sfondo bianco pulito
124
+ hovermode="x unified", # mostra entrambi i valori al passaggio del mouse
125
+ legend=dict(
126
+ orientation="h", # Legenda orizzontale in alto
127
+ yanchor="bottom",
128
+ y=1.02,
129
+ xanchor="right",
130
+ x=1
131
+ ),
132
+ height=500, # Altezza fissa
133
+ margin=dict(l=20, r=20, t=60, b=20)
134
+ )
135
+
136
+ # 4. Aggiunta Range Slider (Barra sotto per scorrere i giorni)
137
+ fig.update_xaxes(
138
+ rangeslider_visible=True,
139
+ rangeselector=dict(
140
+ buttons=list([
141
+ dict(count=1, label="1gg", step="day", stepmode="backward"),
142
+ dict(count=3, label="3gg", step="day", stepmode="backward"),
143
+ dict(step="all", label="Settimana")
144
+ ])
145
+ )
146
+ )
147
+
148
+ # Statistiche testuali
149
+ msg = (
150
+ f"✅ **Analisi Interattiva Completata**\n"
151
+ f"📊 **Risultati Backtesting:**\n"
152
+ f"• Volume Reale: {total_actual}\n"
153
+ f"• Volume Previsto AI: {total_pred} ({diff_perc:+.1f}%)\n"
154
+ f"• Scostamento Medio (MAE): {mae:.1f} chiamate/slot\n\n"
155
+ f"💡 *Usa lo slider in basso per zoomare su un giorno specifico.*"
156
+ )
157
+
158
+ # Gradio gr.Plot accetta l'oggetto fig direttamente
159
+ return fig, msg
160
+
161
+ except Exception as e:
162
+ # In caso di errore restituiamo un grafico vuoto e il messaggio
163
+ return go.Figure(), f"Errore Tecnico: {str(e)}"
modules/utilities/utils.py CHANGED
@@ -30,18 +30,19 @@ def global_file_loader(file_data):
30
  # 1. NORMALIZZAZIONE INPUT (Il Fix Cruciale)
31
  if isinstance(file_data, list):
32
  if not file_data:
33
- return [gr.update() for _ in range(5)]
34
  file_path = file_data[0]
35
  else:
36
  # Se è None o stringa vuota
37
  if not file_data:
38
- return [gr.update() for _ in range(5)]
39
  file_path = file_data # È già la stringa del percorso
40
 
41
  ext = os.path.splitext(file_path)[1].lower()
42
 
43
  # Valori di default (non cambiare nulla)
44
  bpo_update = gr.update()
 
45
  img_xray_update = gr.update()
46
  img_retina_update = gr.update()
47
  news_update = gr.update()
@@ -55,18 +56,32 @@ def global_file_loader(file_data):
55
  img_retina_update = gr.Image(value=file_path)
56
 
57
  # LOGICA PER TESTI
58
- elif ext in ['.txt', '.csv', '.log', '.md', '.json']:
59
  with open(file_path, "r", encoding="utf-8") as f:
60
  content = f.read()
 
 
 
 
61
 
62
- bpo_update = gr.Textbox(value=content)
63
- news_update = gr.Textbox(value=content)
64
- sentiment_update = gr.Textbox(value=content)
 
 
 
 
 
 
 
 
 
 
65
 
66
  except Exception as e:
67
  print(f"Errore lettura file: {e}")
68
 
69
- return bpo_update, img_xray_update, img_retina_update, news_update, sentiment_update
70
 
71
  def enable_sidebar(new_root):
72
  """Mostra la sidebar e aggiorna il path (Per Computer Vision)"""
 
30
  # 1. NORMALIZZAZIONE INPUT (Il Fix Cruciale)
31
  if isinstance(file_data, list):
32
  if not file_data:
33
+ return [gr.update() for _ in range(6)]
34
  file_path = file_data[0]
35
  else:
36
  # Se è None o stringa vuota
37
  if not file_data:
38
+ return [gr.update() for _ in range(6)]
39
  file_path = file_data # È già la stringa del percorso
40
 
41
  ext = os.path.splitext(file_path)[1].lower()
42
 
43
  # Valori di default (non cambiare nulla)
44
  bpo_update = gr.update()
45
+ forecast_update = gr.update()
46
  img_xray_update = gr.update()
47
  img_retina_update = gr.update()
48
  news_update = gr.update()
 
56
  img_retina_update = gr.Image(value=file_path)
57
 
58
  # LOGICA PER TESTI
59
+ elif ext in ['.txt', '.log', '.md', '.json']:
60
  with open(file_path, "r", encoding="utf-8") as f:
61
  content = f.read()
62
+
63
+ elif ext in ['.csv']:
64
+ # 1. Aggiorniamo il modulo Forecast (passando il PATH)
65
+ forecast_update = gr.update(value=file_path)
66
 
67
+ # 2. FIX ERRORE: Leggiamo il contenuto testuale per gli altri tab (opzionale)
68
+ # Se non leggi il file qui, 'content' non esiste e dava errore.
69
+ try:
70
+ with open(file_path, "r", encoding="utf-8") as f:
71
+ content = f.read()
72
+
73
+ # Ora 'content' esiste e possiamo usarlo
74
+ bpo_update = gr.Textbox(value=content)
75
+ news_update = gr.Textbox(value=content)
76
+ sentiment_update = gr.Textbox(value=content)
77
+ except:
78
+ # Se il CSV è illeggibile come testo, pazienza, non crashiamo
79
+ pass
80
 
81
  except Exception as e:
82
  print(f"Errore lettura file: {e}")
83
 
84
+ return bpo_update, forecast_update, img_xray_update, img_retina_update, news_update, sentiment_update
85
 
86
  def enable_sidebar(new_root):
87
  """Mostra la sidebar e aggiorna il path (Per Computer Vision)"""
requirements.txt CHANGED
@@ -25,6 +25,7 @@ pandas>=2.0.0
25
  spacy==3.8.2
26
  nltk>=3.8.1
27
  scikit-learn>=1.3.0
 
28
 
29
  # --- IMAGE PROCESSING ---
30
  opencv-python-headless
 
25
  spacy==3.8.2
26
  nltk>=3.8.1
27
  scikit-learn>=1.3.0
28
+ plotly>=5.0.0
29
 
30
  # --- IMAGE PROCESSING ---
31
  opencv-python-headless