# -*- coding: utf-8 -*-
"""
Created on Wed Mar  4 01:13:57 2026

@author: scige
"""

import json
import pandas as pd

# Caricamento dei dati dal CSV appena creato
df = pd.read_csv('Esercitazione_030.dati_gaussiana.csv')

# Conversione del DataFrame in un formato adatto al trasporto JSON
# 'records' crea una lista di dizionari {colonna: valore}
dati_per_trasporto = df.to_dict(orient='records')

# Serializzazione in stringa JSON
json_output = json.dumps({
    "descrizione": "Gaussiana con picco 25 e piede 10",
    "punti": dati_per_trasporto
}, indent=4)

# Esempio di stampa dei primi caratteri del JSON
print(json_output[:250] + "...")
#%%
import json
import pandas as pd

# Caricamento dei dati dal nuovo CSV
df_json = pd.read_csv('Esercitazione_030.dati_gaussiana_rumore.csv')

# Conversione del DataFrame in un formato adatto al trasporto JSON ('records')
dati_con_rumore_per_json = df_json.to_dict(orient='records')

# Serializzazione in stringa JSON
json_output_rumore = json.dumps({
    "descrizione": "Gaussiana (mu=12, picco=25) con aggiunta di rumore gaussiano (mu=0, picco=5)",
    "parametri_originali": {"mu": 12, "picco": 25},
    "parametri_rumore": {"mu": 0, "picco_max": 5},
    "punti": dati_con_rumore_per_json
}, indent=4)

# Esempio di stampa dei primi caratteri del JSON
print(json_output_rumore[:300] + "...")

#%%

if False:
    """!pip install scipy pandas matplotlib"""
    import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import json
import os


try:
    print(nRandom)
    nRandom+=1
except NameError:
    nRandom=5
finally:
    pass
    
# 1. Caricamento dati e campionamento random
df = pd.read_csv('Esercitazione_030.dati_gaussiana_rumore.csv')

# Campionamento di 5 punti casuali (Uniforme)
df_sample = df.sample(n=nRandom, random_state=42).sort_values(by='x')
x_sample, y_sample = df_sample['x'].values, df_sample['y_con_rumore'].values

# 2. Definizione del modello e Fit
def modello_gaussiana(x, A, mu, sigma):
    return A * np.exp(-(x - mu)**2 / (2 * sigma**2))

try:
    # Esecuzione del fit con stima iniziale [Ampiezza=25, Media=12, Sigma=2.5]
    popt, _ = curve_fit(modello_gaussiana, x_sample, y_sample, p0=[25, 12, 2.5])
    A_fit, mu_fit, sigma_fit = popt
    fit_success = True
except Exception as e:
    print(f"Errore nel fit: {e}")
    fit_success = False

# 3. Generazione e Salvataggio Immagine
plt.figure(figsize=(10, 6))
x_plot = np.linspace(0, 24, 200)

# Plot dei dati
plt.plot(df['x'], df['y'], 'g--', label='Teorica Originale', alpha=0.3)
plt.scatter(x_sample, y_sample, color='red', s=100, label='Campioni Random', zorder=5)

if fit_success:
    plt.plot(x_plot, modello_gaussiana(x_plot, *popt), 'r-', label=f'Fit: A={A_fit:.2f}')

plt.title('Risultato del Fit su 5 Punti Casuali')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True, linestyle=':', alpha=0.6)

# Salvataggio fisico del file
nome_immagine = "risultato_fit_gaussiana.png"
plt.savefig(nome_immagine, dpi=150)
plt.show()
plt.close() # Chiude la figura per liberare memoria

# 4. Esportazione JSON dei risultati
risultati_finali = {
    "configurazione": {
        "punti_campionati": 5,
        "metodo_campionamento": "random_uniform"
    },
    "risultati_fit": {
        "successo": fit_success,
        "parametri": {
            "ampiezza": round(A_fit, 4) if fit_success else None,
            "media": round(mu_fit, 4) if fit_success else None,
            "sigma": round(sigma_fit, 4) if fit_success else None
        }
    },
    "file_generati": {
        "grafico_path": os.path.abspath(nome_immagine),
        "csv_dati_originali": "dati_gaussiana_rumore.csv"
    }
}

# Salvataggio del report JSON
with open('report_fit.json', 'w') as f:
    json.dump(risultati_finali, f, indent=4)

print(f"Processo completato.\n- Immagine salvata come: {nome_immagine}\n- Report JSON creato: report_fit.json")