Функция для создания гистограммы с нормальной кривой для переданного столбца pandaDF - PullRequest
0 голосов
/ 28 июня 2018

Я хотел создать функцию, которая принимает df и col и возвращает гистограмму с нормальной кривой и некоторой маркировкой. Что-то, что я могу использовать и настраивать по своему усмотрению для будущих данных (будем благодарны за любые рекомендации, чтобы сделать их более настраиваемыми). Это было сделано для титанового тренировочного комплекта kaggle, при необходимости, пожалуйста, скачайте с здесь . Эта функция работает нормально для столбцов без значений NaN. Столбец Age имеет NaN, что, я думаю, выдает ошибку. Я пытался игнорировать NaN, используя Ошибка при построении DataFrame, содержащего NaN, с Pandas 0.12.0 и Matplotlib 1.3.1 на Python 3.3.2 , где одно из решений рекомендует использовать subplot, но это не так работать на меня; принятое решение понижает matplotlib (моя версия '2.1.2' , python - 3.6.4). Эта гистограмма pylab избавляет от nan использует интересный метод, который я не могу применить в моем случае. Как убрать NaN? Эта функция настраивается? Не основной вопрос - могу ли я аккуратно делать такие вещи, как round mean / std, добавить больше информации?

import numpy as np
import pandas as pd
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
mydf = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

def df_col_hist (df,col, n_bins):

    fig, ax = plt.subplots()
    n, bins, patches = ax.hist(df[col], n_bins, normed=1)

    y = mlab.normpdf(bins, df[col].mean(), df[col].std())
    ax.plot(bins, y, '--')

    ax.set_xlabel (df[col].name)
    ax.set_ylabel('Probability density')
    ax.set_title(f'Histogram of {df[col].name}: $\mu={df[col].mean()}$, $\sigma={df[col].std()}$')

    fig.tight_layout()
    plt.show()

df_col_hist (train_data, 'Fare', 100)
#Works Fine, Tidy little histogram. 

df_col_hist (train_data, 'Age', 100)
#ValueError: max must be larger than min in range parameter.

    ..\Anaconda3\lib\site-packages\numpy\core\_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
..\Anaconda3\lib\site-packages\numpy\core\_methods.py:26: RuntimeWarning: invalid value encountered in reduce
  return umr_maximum(a, axis, None, out, keepdims)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-75-c81b76c1f28e> in <module>()
----> 1 df_col_hist (train_data, 'Age', 100)

<ipython-input-70-1cf1645db595> in df_col_hist(df, col, n_bins)
      2 
      3     fig, ax = plt.subplots()
----> 4     n, bins, patches = ax.hist(df[col], n_bins, normed=1)
      5 
      6     y = mlab.normpdf(bins, df[col].mean(), df[col].std())

~\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, *args, **kwargs)
   1715                     warnings.warn(msg % (label_namer, func.__name__),
   1716                                   RuntimeWarning, stacklevel=2)
-> 1717             return func(ax, *args, **kwargs)
   1718         pre_doc = inner.__doc__
   1719         if pre_doc is None:

~\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in hist(***failed resolving arguments***)
   6163             # this will automatically overwrite bins,
   6164             # so that each histogram uses the same bins
-> 6165             m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)
   6166             m = m.astype(float)  # causes problems later if it's an int
   6167             if mlast is None:

~\Anaconda3\lib\site-packages\numpy\lib\function_base.py in histogram(a, bins, range, normed, weights, density)
    665     if first_edge > last_edge:
    666         raise ValueError(
--> 667             'max must be larger than min in range parameter.')
    668     if not np.all(np.isfinite([first_edge, last_edge])):
    669         raise ValueError(

1 Ответ

0 голосов
/ 28 июня 2018

Ваш вызов normpdf неверен, так как он ожидает массив значений x в качестве первого параметра, а не количество бинов. Но в любом случае mlab.normpdf устарела, афаик.

Тем не менее, я бы рекомендовал использовать norm.pdf из scipy:

from scipy.stats import norm

s = np.std(df[col])
m = df[col].mean()
x = np.linspace(m - 3*s, m + 3*s, 51)
y = norm.pdf(x, loc=m)   # additionally there's a `scale` parameter for norming against whatever in y-direction

ax.plot(x, y, '--', label='probability density function')

PS: для сброса nan в информационном фрейме pandas у вас есть

df[col].dropna()

т

n, bins, patches = ax.hist(df[col].dropna(), n_bins, normed=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...