2015-12-31 4 views
1

Я хочу рисовать поле, но у меня нет необработанных данных, а агрегированных результатов в Pandas DataFrame.Pandas DataFrame сгруппированный график из агрегированных результатов

Можно ли рисовать полевой график из агрегированных результатов?

Если нет, то какой самый близкий сюжет, который я могу получить, чтобы построить график min, max, mean, median, std-dev и т. Д. Я знаю, что могу нарисовать их с помощью линейной диаграммы, но мне нужны ящики сгруппированных/кластерным.

Вот мои данные, часть чертежа отсутствует. Пожалуйста помоги. Благодаря

import matplotlib.pyplot as plt 

import numpy as np 
import pandas as pd 

df = pd.DataFrame({ 
     'group' : ['Tick Tick Tick', 'Tock Tock Tock', 'Tock Tock Tock', 'Tick Tick Tick']*3, # , ['Tock Tock Tock', 'Tick Tick Tick']*6, 
     'person':[x*5 for x in list('ABC')]*4, 
     'Median':np.random.randn(12), 
     'StdDev':np.random.randn(12) 
        }) 
df["Average"]=df["Median"]*1.1 
df["Minimum"]=df["Median"]*0.5 
df["Maximum"]=df["Median"]*1.6 
df["90%"]=df["Maximum"]*0.9 
df["95%"]=df["Maximum"]*0.95 
df["99%"]=df["Maximum"]*0.99 

df 

UPDATE,

я теперь один шаг ближе, чтобы получить мой результат - я только что обнаружил, что эта функция была available since matplotlib 1.4, и я использую Matplotlib 1.5, и я испытал это и proved that it is working for me.

Проблема заключается в том, что я не знаю, почему это работает, и как адаптировать мой код выше, чтобы использовать такую ​​новую функцию. Я переведу свой рабочий код ниже, надеюсь, что кто-то сможет понять и поставить два и два вместе.

Данные, которые у меня есть, средние, средние, минимальные, 90%, 95%, 99%, максимальные и StdDev, и я надеюсь наметить их все. и я смотрел на структуру данных logstats следующего кода, после for stats, label in zip(logstats, list('ABCD')), и нашел его поля:

[{'cihi': 4.2781254505311281, 
    'cilo': 1.6164348064249057, 
    'fliers': array([ 19.69118642, 19.01171604]), 
    'iqr': 5.1561885723613567, 
    'label': 'A', 
    'mean': 4.9486856766955922, 
    'med': 2.9472801284780168, 
    'q1': 1.7655440553898782, 
    'q3': 6.9217326277512345, 
    'whishi': 12.576334012545718, 
    'whislo': 0.24252084924003742}, 
{'cihi': 4.3186289184254107, 
    'cilo': 1.9963715983778565, 
    ... 

Таким образом, из этого

box plot

и bxp документ я собираюсь отобразить мои данные следующим образом:

  • whislo: Минимум
  • q1: Медиана
  • мед: Среднее
  • среднее: 90%
  • q3: 95%
  • whishi: 99%
  • и максимальный, как летуны

Чтобы отобразить их, я буду просто делать SELECT Minimum AS whislo, [90%] AS mean, [95%] as q3, [99%] as whishi ... Вот окончательный результат:

raw_data = {'label': ['Label_01 Init', 'Label_02', 'Label_03', 'Label_04', 'Label_05', 'Label_06', 'Label_07', 'Label_08', 'Label_99'], 'whislo': [0.17999999999999999, 2.0299999999999998, 4.0800000000000001, 2.0899999999999999, 2.3300000000000001, 2.3799999999999999, 1.97, 2.6499999999999999, 0.089999999999999997], 'q3': [0.5, 4.9699999999999998, 11.77, 5.71, 12.460000000000001, 11.859999999999999, 13.84, 16.969999999999999, 0.29999999999999999], 'mean': [0.40000000000000002, 4.1299999999999999, 10.619999999999999, 5.0999999999999996, 10.24, 9.0700000000000003, 11.960000000000001, 15.15, 0.26000000000000001], 'whishi': [1.76, 7.6399999999999997, 20.039999999999999, 6.6699999999999999, 22.460000000000001, 21.66, 16.629999999999999, 19.690000000000001, 1.1799999999999999], 'q1': [0.28000000000000003, 2.96, 7.6100000000000003, 3.46, 5.8099999999999996, 5.4400000000000004, 6.6299999999999999, 8.9900000000000002, 0.16], 'fliers': [5.5, 17.129999999999999, 32.890000000000001, 7.9100000000000001, 32.829999999999998, 70.680000000000007, 24.699999999999999, 32.240000000000002, 3.3500000000000001]} 
df = pd.DataFrame(raw_data, columns = ['label', 'whislo', 'q1', 'mean', 'q3', 'whishi', 'fliers']) 

Теперь т o вызов заключается в том, как представить мой вышефайлы данных в полевой диаграмме с несколькими уровнями группировки. Если несколько уровней группировки слишком сложны, давайте сначала обработаем график из фрейма данных pd, потому что у моего pd dataframe есть те же поля, что и требуемый массив np. Так что я попытался,

fig, ax = plt.subplots() 
ax.bxp(df.as_matrix(), showmeans=True, showfliers=True, vert=False) 

Но я получил

...\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in bxp(self, bxpstats, positions, widths, vert, patch_artist, shownotches, showmeans, showcaps, showbox, showfliers, boxprops, whiskerprops, flierprops, medianprops, capprops, meanprops, meanline, manage_xticks) 
    3601   for pos, width, stats in zip(positions, widths, bxpstats): 
    3602    # try to find a new label 
-> 3603    datalabels.append(stats.get('label', pos)) 
    3604    # fliers coords 
    3605    flier_x = np.ones(len(stats['fliers'])) * pos 

AttributeError: 'numpy.ndarray' object has no attribute 'get' 

Если я использую ax.bxp(df.to_records(), ..., то я получу AttributeError: 'record' object has no attribute 'get'.

КИ, я, наконец, получил это работает, заговор от PD dataframe, но не множественный уровня группировки, например:

df['fliers']='' 
fig, ax = plt.subplots() 
ax.bxp(df.to_dict('records'), showmeans=True, meanline=True, showfliers=False, vert=False) # shownotches=True, 
plt.show() 

Примечание моих выше данные отсутствуют med поля, вы можете добавить правильное или используйте df['med']=df['q1']*1.2, чтобы заставить его работать.

import matplotlib 
import matplotlib.pyplot as plt 

import numpy as np 
import pandas as pd 

def test_bxp_with_ylabels(): 
    np.random.seed(937) 
    logstats = matplotlib.cbook.boxplot_stats(
     np.random.lognormal(mean=1.25, sigma=1., size=(37,4)) 
    ) 
    print(logstats) 
    for stats, label in zip(logstats, list('ABCD')): 
     stats['label'] = label 

    fig, ax = plt.subplots() 
    ax.set_xscale('log') 
    ax.bxp(logstats, vert=False) 

test_bxp_with_ylabels() 

bxp_with_ylabels

+0

Я не понимаю, какие данные у вас есть и сколько ящиков вы ожидаете. 'ax.bxp' ожидает значения медианных, квартили и вискеров. У вас есть это? – jrjc

+0

До сих пор я понял, что у вас есть только 'p' и' e', и вы хотите создать поле в виде квадрата со значением в 'p' как среднее значение и значение в' e' как std, так или иначе ± e ', это то, что вы хотите? – jrjc

+0

ОК, и была ли группировка прямоугольника прямо в моем ответе? Также в вашем кадре данных у вас есть несколько значений для медианы для данной пары (group; person), я должен использовать среднее значение этих значений? (как вы это делали раньше с помощью 'pivot_table'?) – jrjc

ответ

1

В ожидании разъяснения вашей Д.Ф., связанных с:

dic = [{'cihi': 4.2781254505311281, 
     'cilo': 1.6164348064249057, 
     'fliers': array([ 19.69118642, 19.01171604]), 
     'iqr': 5.1561885723613567, 
     'mean': 4.9486856766955922, 
     'med': 2.9472801284780168, 
     'q1': 1.7655440553898782, 
     'q3': 6.9217326277512345, 
     'whishi': 12.576334012545718, 
     'whislo': 0.24252084924003742}] 

и как ваши данные должны карта:

из bxp док:

Required keys are: 

    - ``med``: The median (scalar float).  
    - ``q1``: The first quartile (25th percentile) (scalar 
    float). 
    - ``q3``: The first quartile (50th percentile) (scalar 
    float). # Here I guess it's rather : the 3rd quartile (75th percentile) 
    - ``whislo``: Lower bound of the lower whisker (scalar 
    float). 
    - ``whishi``: Upper bound of the upper whisker (scalar 
    float). 

    Optional keys are: 

    - ``mean``: The mean (scalar float). Needed if 
    ``showmeans=True``. 
    - ``fliers``: Data beyond the whiskers (sequence of floats). 
    Needed if ``showfliers=True``. 
    - ``cilo`` & ``cihi``: Lower and upper confidence intervals 
    about the median. Needed if ``shownotches=True``. 

Тогда вы просто должны сделать:

fig, ax = plt.subplots(1,1) 
ax.bxp([dic], showmeans=True) 

Так что вам просто нужно найти способ, чтобы построить свой dic. Обратите внимание, что он не отображает ваш std и для усов, вам нужно выбрать, доходят ли они до 90%, 95% или 99%, но вы не можете иметь все значения. В таком случае вам нужно добавить их потом с чем-то вроде plt.hlines().

HTH

+0

Спасибо jeanrjc за вашу помощь. Я, наконец, получил его работу, т. Е. Заработал заговор из pd dataframe, но не с несколькими уровнями группировки. Обновит мой OP позже. – xpt

Смежные вопросы