Я хочу рисовать поле, но у меня нет необработанных данных, а агрегированных результатов в 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,
...
Таким образом, из этого
и 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()
Я не понимаю, какие данные у вас есть и сколько ящиков вы ожидаете. 'ax.bxp' ожидает значения медианных, квартили и вискеров. У вас есть это? – jrjc
До сих пор я понял, что у вас есть только 'p' и' e', и вы хотите создать поле в виде квадрата со значением в 'p' как среднее значение и значение в' e' как std, так или иначе ± e ', это то, что вы хотите? – jrjc
ОК, и была ли группировка прямоугольника прямо в моем ответе? Также в вашем кадре данных у вас есть несколько значений для медианы для данной пары (group; person), я должен использовать среднее значение этих значений? (как вы это делали раньше с помощью 'pivot_table'?) – jrjc