Панды, вычислите много средств с помощью доверительных интервалов начальной загрузки для построения графика.

Я хочу вычислить средние значения с доверительными интервалами начальной загрузки для некоторых подмножеств кадра данных; конечная цель состоит в том, чтобы получить гистограммы средних значений с доверительными интервалами начальной загрузки в качестве полос ошибок. Мой фрейм данных выглядит так:

ATG12 Norm     ATG5 Norm    ATG7 Norm    Cancer Stage    
5.55           4.99         8.99         IIA
4.87           5.77         8.88         IIA
5.98           7.88         8.34         IIC

Подмножества, которые меня интересуют, - это каждая комбинация столбцов нормы и стадии рака. Мне удалось составить таблицу средств, используя:

df.groupby('Cancer Stage')['ATG12 Norm', 'ATG5 Norm', 'ATG7 Norm'].mean()

Но мне нужно вычислить доверительные интервалы начальной загрузки, чтобы использовать их как погрешности для каждого из этих средств, используя подход, описанный здесь: http://www.randalolson.com/2012/08/06/statistical-analysis-made-easy-in-python/ Это сводится к:

import scipy
import scikits.bootstraps as bootstraps
CI = bootstrap.ci(data=Series, statfunction=scipy.mean)
# CI[0] and CI[1] are your low and high confidence intervals

Я попытался применить этот метод к каждому подмножеству данных с помощью скрипта с вложенным циклом:

for i in data.groupby('Cancer Stage'):
    for p in i.columns[1:3]: # PROBLEM!!
        Series = i[p]
        print p
        print Series.mean()
        ci = bootstrap.ci(data=Series, statfunction=scipy.mean)

Который выдал сообщение об ошибке

AttributeError: 'tuple' object has no attribute called 'columns' 

Не зная, что такое "кортежи", у меня есть кое-что почитать, но я боюсь, что мой нынешний подход с использованием вложенных циклов оставит меня с некоторой структурой данных, которую я не смогу легко построить. Я новичок в Pandas, поэтому я не удивлюсь, обнаружив, что есть более простой и легкий способ получения данных, которые я пытаюсь построить на графике. Любая помощь будет очень ценится.

1 ответ

Решение

То, как вы перебираете объект groupby, неверно! Когда вы используете groupby(), ваш фрейм данных разрезается вдоль значений в вашем столбце (столбцах) groupby вместе с этими значениями в качестве имен групп, образуя так называемый "кортеж":(name, dataforgroup), Правильный рецепт для перебора групповых объектов:

for name, group in data.groupby('Cancer Stage'):
    print name
    for p in group.columns[0:3]:
    ...

Пожалуйста, прочитайте больше о групповой функциональности панд здесь и просмотрите python-ссылку, чтобы понять, что такое кортежи!

Группировка фреймов данных и применение функции по сути делается в одном выражении, используя applyФункциональность панд:

cols=data.columns[0:2]
for col in columns:
    print data.groupby('Cancer Stage')[col].apply(lambda x:bootstrap.ci(data=x, statfunction=scipy.mean))

делает все, что вам нужно, в одну строку, и создает (красиво) сериал для вас

РЕДАКТИРОВАТЬ: я играл с объектом фрейма данных, который я создал сам:

df = pd.DataFrame({'A':range(24), 'B':list('aabb') * 6, 'C':range(15,39)})
for col in ['A', 'C']:
    print df.groupby('B')[col].apply(lambda x:bootstrap.ci(data=x.values))

дает две серии, которые выглядят так:

B
a    [6.58333333333, 14.3333333333]
b                      [8.5, 16.25]

B
a    [21.5833333333, 29.3333333333]
b            [23.4166666667, 31.25]
Другие вопросы по тегам