Боксплот с пандами, групповой, субплоттинг, вычислительная / описательная статистика, агрегация - PullRequest
0 голосов
/ 08 января 2019

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

'Game','Country','Team','Ball Possession Interval (sec)' 1,Croatia,A,9 2,France,B,11 1,Croatia,A,8 4,Spain,C,10 1,Croatia,B,6 2,France,B,7 3,Germany,C,12 2,France,A,8 ...

Игра - это количество игр, в которых до сих пор играла команда. Например, 2,France,B,7 означает, что команда B из Франции, которая сейчас находится во второй игре, только что потеряла мяч через 7 секунд.

Мне бы хотелось, чтобы график, сгруппированный по странам (подзаговор для каждой страны), с командами вдоль оси, и блок-график суммы «Интервал владения мячом (сек)» за игру за команду. Я попробовал следующее,

df.groupby('Country').boxplot(by='Team',column=*vector of sum of ball possession intervals per game*)

но я не знаю, как установить столбец . Я хотел бы установить следующее:

df.groupby(['Country','Team','Game'])['Ball Possession Interval (sec)'].sum()

но это не работает.

Есть ли простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я узнал желаемое решение с помощью pivot_table:

plotdf = df.pivot_table(index=['Country','Team','Game'], values='Ball Possession Interval (sec)', aggfunc=np.sum)

Из документации по сводной таблице значения - это столбец для агрегирования, aggfunc - метод агрегирования. Теперь для сгруппированного бокспоттинга ...

plotdf.groupby('Country').boxplot(by='Team', column='Ball Possession Interval (sec)')

Это работает, потому что pivot_table возвращает объект dataframe, который доступен для boxplot.

Причина, по которой следующее не сработало, состоит в том, что она возвращает серию, которая не поддается блокпосту, df.groupby(['Country','Team','Game'])['Ball Possession Interval (sec)'].sum().

0 голосов
/ 08 января 2019

Это можно сделать просто с помощью pd.DataFrame.boxplot -

from matplotlib import pyplot as plt
df = pd.DataFrame({'A': ['a1', 'a2']*16,
         'B': ['b1', 'b2', 'b3', 'b4']*8,
         'val': [i for i in range(32)]
     })

df.head()
#    A   B  val
#0  a1  b1    0
#1  a2  b2    1
#2  a1  b3    2
#3  a2  b4    3
#4  a1  b1    4

df.boxplot(column='val', by=['A', 'B']) 
# In your case, df.boxplot(column = 'Ball Possession Interval(s)', by=['Country','Team','Game'])
plt.show() # if you're running this in an ipython terminal

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...