Диаграмма Bokeh Dodge с использованием различных панд DataFrame - PullRequest
0 голосов
/ 04 февраля 2019

все!Таким образом, у меня есть 2 датафреймов , извлеченных из Pro-Football-Reference как csv и работавших через Pandas с помощью StringIO.

Я вставляю только заголовок и строку с информацией прямо ниже:

data_1999 = StringIO("""Tm,W,L,W-L%,PF,PA,PD,MoV,SoS,SRS,OSRS,DSRS Indianapolis Colts,13,3,.813,423,333,90,5.6,0.5,6.1,6.6,-0.5""")

data = StringIO("""Tm,W,L,T,WL%,PF,PA,PD,MoV,SoS,SRS,OSRS,DSRS Indianapolis Colts,10,6,0,.625,433,344,89,5.6,-2.2,3.4,3.9,-0.6""")

И затем интерпретируюсь как обычно, используя pandas.read_csv, создавая 2 разных dataframes называется df_nfl_1999 и df_nfl соответственно.

Так что я пытался использовать Bokeh и делать что-то вроде здесь , за исключением того, что вместо «яблок» и «груш» было бы название групп, являющихся основной группой.Я пытался эмулировать его, используя только данные Pandas Dataframe:

p9=figure(title='Comparison 1999 x 2018',background_fill_color='#efefef',x_range=df_nfl_1999['Tm'])
p9.xaxis.axis_label = 'Team'
p9.yaxis.axis_label = 'Variable'
p9.vbar(x=dodge(df_nfl_1999['Tm'],0.0,range=p9.x_range),top=df_nfl_1999['PF'],legend='PF in 1999', width=0.3)
p9.vbar(x=dodge(df_nfl_1999['Tm'],0.25,range=p9.x_range),top=df_nfl['PF'],legend='PF in 2018', width=0.3, color='#A6CEE3')
show(p9)

И ошибка, которую я получил, была:

ValueError: ожидался элемент либо String, Dict (Enum ('expr', 'field', 'value', 'transform'), Either (String, Instance (Transform), Instance (Expression), Float)) или Float, получил {'field': 0
Washington Redskins

Моей первоначальной идеей было сгруппировать по названию команды ( df_nfl ['Tm'] ), анализируя баллы в пользу каждого года (так что df_nfl ['PF')] для 2018 года и df_nfl_1999 ['PF'] для 1999 года).Простое смещение столбцов может разрешиться, но я не могу найти способ сделать это, кроме диаграммы уклонения, и это не совсем работает (я новичок).

ПоКстати, ссылка на ошибку назначается при возникновении:

p9.vbar(x=dodge(df_nfl_1999['Tm'],0.0,range=p9.x_range),top=df_nfl_1999['PF'],legend='PF in 1999', width=0.3)

Я мог бы, например, использовать график рассеяния, и обе диаграммы могли бы сосуществовать, а в некоторых случаях перекрываться (если данные совпадают), но я действительно стремился построить это рядом.Другие ответы, относящиеся к теме, обычно имеют более старые версии Bokeh с устаревшими функциями.

Как я могу решить эту проблему?Спасибо!

Редактировать:

Вот метод .head ().Другой вернет точно такие же категории, столбцы и строки, за исключением того, что данные, очевидно, изменяются, поскольку они относятся к другому сезону.

                    Tm   W   L   W-L%   PF   PA   PD  MoV  SoS  SRS  OSRS  \
0  Washington Redskins  10   6  0.625  443  377   66  4.1 -1.3  2.9   6.8   
1       Dallas Cowboys   8   8  0.500  352  276   76  4.8 -1.6  3.1  -0.3   
2      New York Giants   7   9  0.438  299  358  -59 -3.7  0.7 -3.0  -1.8   
3    Arizona Cardinals   6  10  0.375  245  382 -137 -8.6 -0.2 -8.8  -5.5   
4  Philadelphia Eagles   5  11  0.313  272  357  -85 -5.3  1.1 -4.2  -3.3   

   DSRS  
0  -3.9  
1   3.4  
2  -1.2  
3  -3.2  
4  -0.9  

И значение выполнения только x=dodge возвращает:

dodge () отсутствует 1 обязательный позиционный аргумент: 'значение'

При добавлении этого аргумента value=0.0 или value=0.2 возвращается та же ошибка, что и в исходном сообщении.

1 Ответ

0 голосов
/ 04 февраля 2019

Первый аргумент dodge должен содержать одно имя столбца столбца в ColumnDataSource.В результате все значения из этого столбца будут уклонены на указанное количество при использовании в качестве координат.

Вы пытаетесь передать содержимое столбца, что не ожидается.Трудно сказать наверняка без полного кода для тестирования, но вы, скорее всего, захотите

x=dodge('Tm', ...)

Однако вам также нужно будет использовать явный Bokeh ColumnDataSource и передать его как source в vbar как это сделано в примере, на который вы ссылаетесь.Вы можете создать его явно, но часто вы также можете просто передать кадр данных непосредственно source=df, и он будет адаптирован.

...