Панды, вычислите много средств с помощью доверительных интервалов начальной загрузки для построения графика.
Я хочу вычислить средние значения с доверительными интервалами начальной загрузки для некоторых подмножеств кадра данных; конечная цель состоит в том, чтобы получить гистограммы средних значений с доверительными интервалами начальной загрузки в качестве полос ошибок. Мой фрейм данных выглядит так:
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]