Ajustar datos lognormales bineados en Python

Tengo un rango de datos de distribución de tamaño de partícula ordenados por porcentaje de fracción de volumen, como así :;

size % 6.68 0.05 9.92 1.15 etc. 

Necesito ajustar estos datos a una distribución lognormal, que stats.lognorm.fit hacer usando la función stats.lognorm.fit de python, pero esto parece esperar la entrada como una matriz de variables en lugar de datos agrupados, a juzgar por lo que he leído .

.extend usar un bucle for para recorrer en iteración los datos y .extend cada entrada de tamaño a una matriz de marcador de posición el número necesario de veces para crear una matriz con una lista de variables que corresponda a los datos agrupados.

Sin embargo, esto parece realmente feo e ineficiente, y el tipo de cosas que probablemente hay una forma fácil de hacer. ¿Hay alguna forma de ingresar datos agrupados en la función stats.lognorm.fit ?

Supongo que una posible solución es ajustar manualmente un pdf a sus datos de bin, asumiendo que los valores de x son el punto medio de cada intervalo, y los valores de y son la frecuencia de bin correspondiente. Y luego ajuste una curva basada en los valores de x e y usando scipy.optimize.curve_fit . Creo que la precisión de los resultados dependerá de la cantidad de contenedores que tenga. A continuación se muestra un ejemplo:

 import matplotlib.pyplot as plt from scipy.optimize import curve_fit import numpy as np def pdf(x, mu, sigma): """pdf of lognormal distribution""" return (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2)) / (x * sigma * np.sqrt(2 * np.pi))) mu, sigma = 3., 1. # actual parameter value data = np.random.lognormal(mu, sigma, size=1000) # data generation h = plt.hist(data, bins=30, normed = True) y = h[0] # frequencies for each bin, this is y value to fit xs = h[1] # boundaries for each bin delta = xs[1] - xs[0] # width of bins x = xs[:-1] + delta / # midpoints of bins, this is x value to fit popt, pcov = curve_fit(pdf, x, y, p0=[1, 1]) # data fitting, popt contains the fitted parameters print(popt) # [ 3.13048122 1.01360758] fitting results fig, ax = plt.subplots() ax.hist(data, bins=30, normed=True, align='mid', label='Histogram') xr = np.linspace(min(xs), max(xs), 10000) yr = pdf(xr, mu, sigma) yf = pdf(xr, *popt) ax.plot(xr, yr, label="Actual") ax.plot(xr, yf, linestyle = 'dashed', label="Fitted") ax.legend() 

introduzca la descripción de la imagen aquí