Есть ли библиотека, которая поможет мне легко подогнать данные? Я нашел слесаря, и я предоставлю код, но он показывает некоторые ошибки

#python-3.x #matplotlib #scipy #histogram #curve-fitting

Вопрос:

Итак, вот мой код:

 import pandas as pd import scipy.stats as st import matplotlib.pyplot as plt from matplotlib.ticker import AutoMinorLocator from fitter import Fitter, get_common_distributions  df = pd.read_csv("project3.csv") bins = [282.33, 594.33, 906.33, 1281.33, 15030.33, 1842.33, 2154.33, 2466.33, 2778.33, 3090.33, 3402.33]  #declaring facecolor = '#EAEAEA' color_bars = '#3475D0' txt_color1 = '#252525' txt_color2 = '#004C74' fig, ax = plt.subplots(1, figsize=(16, 6), facecolor=facecolor) ax.set_facecolor(facecolor) n, bins, patches = plt.hist(df.City1, color=color_bars, bins=10) #grid minor_locator = AutoMinorLocator(2) plt.gca().xaxis.set_minor_locator(minor_locator) plt.grid(which='minor', color=facecolor, lw = 0.5) xticks = [(bins[idx 1]   value)/2 for idx, value in enumerate(bins[:-1])] xticks_labels = [ "{:.0f}-{:.0f}".format(value, bins[idx 1]) for idx, value in enumerate(bins[:-1])] plt.xticks(xticks, labels=xticks_labels, c=txt_color1, fontsize=13) #beautify ax.tick_params(axis='x', which='both',length=0) plt.yticks([]) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) for idx, value in enumerate(n):  if value gt; 0:  plt.text(xticks[idx], value 5, int(value), ha='center', fontsize=16, c=txt_color1) plt.title('Histogram of rainfall in City1n', loc = 'right', fontsize = 20, c=txt_color1) plt.xlabel('nCentimeters of rainfall', c=txt_color2, fontsize=14) plt.ylabel('Frequency of occurrence', c=txt_color2, fontsize=14) plt.tight_layout() #plt.savefig('City1_Raw.png', facecolor=facecolor) plt.show() city1 = df['City1'].values f = Fitter(city1, distributions=get_common_distributions()) f.fit() fig = f.plot_pdf(names=None, Nbest=4, lw=1, method='sumsquare_error') plt.show() print(f.get_best(method = 'sumsquare_error'))  

Проблема в сюжетах, которые он показывает. Первая гистограмма, которую он генерирует, это

введите описание изображения здесь

Затем я получаю другой график с наиболее подходящими распределениями, который

введите описание изображения здесь

Затем оператор вывода

 {'chi2': {'df': 10.692966790090342, 'loc': 16.690849400411103, 'scale': 118.71595997157786}}  Process finished with exit code 0  

У меня есть пара вопросов. Почему chi2, наиболее подходящее распределение, не отображается на графике? Как мне построить эти распределения поверх гистограмм, а не отдельно? Функция hist() в библиотеке fitter может это сделать, но там я не могу управлять ячейками, и поэтому в итоге я получаю около 100 ячеек с некоторыми плоскими данными.

Как мне решить эту проблему? Мне нужно построить кривую наилучшего соответствия на гистограмме, которая выглядит как изображение 1. Могу ли я использовать любой другой модуль/пакет для выполнения работы аналогичным образом? При этом используется подгонка по методу наименьших квадратов, но я тоже в порядке с наименьшей вероятностью или логарифмической вероятностью.

Комментарии:

1. ax.hist(df.City1, color=color_bars, bins=10) нет plt.hist и, вероятно f.plot_pdf(names=None, Nbest=4, lw=1, method='sumsquare_error', ax=ax) , но из API неясно .plot_dff , принимает ли ax параметр.

2. Chi2-это особый случай гамма-излучения. Я бы сказал, что гамма нанесена поверх chi2, так что вы ее не видите.

Ответ №1:

Простой способ построения объектов друг на друге (с использованием некоторых свойств Fitter класса)

 import scipy.stats as st import matplotlib.pyplot as plt from fitter import Fitter, get_common_distributions  from scipy import stats numberofpoints=50000 df = stats.norm.rvs( loc=1090, scale=500, size=numberofpoints)  fig, ax = plt.subplots(1, figsize=(16, 6))  n, bins, patches = ax.hist( df, bins=30, density=True)  f = Fitter(df, distributions=get_common_distributions()) f.fit()  errorlist = sorted(  [  [f._fitted_errors[dist], dist]   for dist in get_common_distributions()  ] )[:4]  for err, dist in errorlist:  ax.plot( f.x, f.fitted_pdf[dist] )  plt.show()  

Используя нормализацию гистограммы, нужно было бы поиграть с масштабированием, чтобы снова обобщить.