El script usa un fichero de texto con las variables en columnas separadas por tabuladores. Cambia las rutas acorde a tus necesidades. Partimos de D:\bbb\_gausiana-distribucion.txt, un fichero de texto con tantas variables en columnas separadas por tabuladores como deseemos. El script, si no existe, D:\bbb\_resultados_distribucion y dentro de esa carpeta localiza tantos ficheros como columnas tiene D:\bbb\_gausiana-distribucion.txt
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import os
# Crear la función gaussiana para el ajuste: Y=Amplitude*exp(-0.5*((X-Mean)/SD)^2)
def gaussian(x, amplitude, mean, sd):
return amplitude * np.exp(-0.5 * ((x - mean) / sd) ** 2)
# Ruta del archivo de entrada y del directorio de salida
input_file = r'D:\bbb\_gausiana-distribucion.txt'
output_dir = r'D:\bbb\_resultados_distribucion'
# Crear el directorio de salida si no existe
os.makedirs(output_dir, exist_ok=True)
# Cargar el archivo de datos
data = pd.read_csv(input_file, sep='\t', header=None) # Cambia sep y header según corresponda
# Inicializar una lista para guardar los resultados de Mean±SD
mean_sd_summary = []
# Inicializar una lista para guardar los datos X e Y en formato de columnas
xy_data_summary = []
# Procesar cada columna
for col in data.columns:
variable = data[col].dropna() # Eliminar NaN si los hay
# Calcular el histograma de frecuencias (sin normalizar)
counts, bins = np.histogram(variable, bins=30) # Sin 'density=True' para frecuencia absoluta
bin_centers = (bins[:-1] + bins[1:]) / 2 # Calcular centros de bins
# Ajuste de la curva gaussiana
try:
popt, _ = curve_fit(gaussian, bin_centers, counts, p0=[1, np.mean(variable), np.std(variable)])
amplitude, mean, sd = popt
# Guardar los valores Mean±SD para cada columna
mean_sd_summary.append(f"Columna {col + 1}: Mean = {mean:.2f} ± {sd:.2f}")
# Guardar los valores X, Y de frecuencia y Y de ajuste en una lista
for x, y_hist, y_gauss in zip(bin_centers, counts, gaussian(bin_centers, *popt)):
xy_data_summary.append([x, y_hist, y_gauss])
# Guardar los datos x, y del histograma y del ajuste en un archivo CSV
output_data = pd.DataFrame(xy_data_summary, columns=['X_bin_centers', 'Y_histogram', 'Y_gaussian_fit'])
output_file = os.path.join(output_dir, f'columna_{col + 1}_frecuencia_ajuste.csv')
output_data.to_csv(output_file, sep='\t', index=False)
# Graficar el histograma y el ajuste
plt.figure()
plt.hist(variable, bins=30, alpha=0.6, color='skyblue', label='Datos')
plt.plot(bin_centers, gaussian(bin_centers, *popt), color='orange',
label=f'Ajuste Gaussiano\nAmplitude={amplitude:.2f}, Mean={mean:.2f}, SD={sd:.2f}')
plt.xlabel('Valor')
plt.ylabel('Frecuencia Absoluta') # Cambiar el título del eje Y
plt.title(f'Distribución de Frecuencias - Columna {col + 1}')
plt.legend()
plt.show()
except RuntimeError:
print(f"No se pudo ajustar la curva gaussiana para la columna {col + 1}.")
# Mostrar los valores de Mean±SD al final
print("\nResumen de Mean±SD para cada columna:")
for summary in mean_sd_summary:
print(summary)
# Mostrar los valores X e Y para cada columna en columnas separadas por tabuladores
print("\nValores de X (bin_centers), Y (frecuencia) y Y (ajuste gaussiano) para cada columna:")
for col in data.columns:
output_file = os.path.join(output_dir, f'columna_{col + 1}_frecuencia_ajuste.csv')
print(f"\nColumna {col + 1}:")
print(f"Archivo generado: {output_file}")
Resumen de Mean±SD para cada columna:
Columna 1: Mean = -58.33 ± 6.32
Columna 2: Mean = -63.79 ± 7.14
Columna 3: Mean = -50.60 ± 7.83
Columna 4: Mean = -32.18 ± 5.37
Columna 5: Mean = -15.40 ± 5.42
Columna 6: Mean = -7.57 ± 5.19
Columna 7: Mean = -9.81 ± 5.25
Columna 8: Mean = -2.16 ± 3.55
Valores de X (bin_centers), Y (frecuencia) y Y (ajuste gaussiano) para cada columna:
Columna 1:
Archivo generado: D:\bbb\_resultados_distribucion\columna_1_frecuencia_ajuste.csv
Columna 2:
Archivo generado: D:\bbb\_resultados_distribucion\columna_2_frecuencia_ajuste.csv
Columna 3:
Archivo generado: D:\bbb\_resultados_distribucion\columna_3_frecuencia_ajuste.csv
Columna 4:
Archivo generado: D:\bbb\_resultados_distribucion\columna_4_frecuencia_ajuste.csv
Columna 5:
Archivo generado: D:\bbb\_resultados_distribucion\columna_5_frecuencia_ajuste.csv
Columna 6:
Archivo generado: D:\bbb\_resultados_distribucion\columna_6_frecuencia_ajuste.csv
Columna 7:
Archivo generado: D:\bbb\_resultados_distribucion\columna_7_frecuencia_ajuste.csv
Columna 8:
Archivo generado: D:\bbb\_resultados_distribucion\columna_8_frecuencia_ajuste.csv
Amplitud es la altura del centro de la distribución en unidades Y.
Media es el valor X en el centro de la distribución.
SD es una medida de la anchura a mitad de altura de la distribución, en las mismas unidades que X.