6 razões que eu amo Bokeh para exploração de dados com Python

O Bokeh existe há anos, mas só recentemente descobri isso e não demorei muito para me tornar minha biblioteca de visualização Python favorita. Aqui estão seis razões pelas quais.

Shawn Cochran Segue 15 de jul · 10 min ler Bokeh é uma biblioteca de visualização baseada em navegador

O que é o Bokeh e o que o torna diferente?

Rapidamente, antes de entrar, vamos fazer o parágrafo de introdução obrigatório, onde eu lhe apresento o tópico. Lembre-se da idade das trevas onde tudo o que tínhamos era Matplotlib? O Bokeh é outra biblioteca de visualização, com o fator de diferenciação real (pelo menos para mim), pois ela foca nos recursos visuais de um navegador da web. Enquanto você ainda pode salvar figuras como .png ou .jpeg, o poder real do Bokeh é que, como ele renderiza no navegador (com Javascript), você pode facilmente adicionar interatividade e imitar ferramentas super poderosas como D3 sem ter que passar pelo doloroso processo de aprendizagem D3. Também tem havido claramente muito trabalho para fazer o Bokeh funcionar perfeitamente com o Pandas para acompanhar uma API intuitiva. Em resumo, Bokeh é um fácil de usar biblioteca de plotagem que funciona bem com o Pandas e torna as coisas super compartilháveis. Parece legal? Leia!

Dados e Notebook Jupyter para este artigo

Este Github Repo tem um Notebook Jupyter e os dados brutos que usaremos neste artigo. Os dados vêm das listagens de apartamentos da Craigslist nas últimas semanas em Nova York. Especificamente, usaremos o Bokeh para analisar a relação entre o preço e a metragem quadrada do apartamento. Começaremos com um gráfico de dispersão básico e, ao longo do caminho, aprimoraremos nosso gráfico básico usando recursos do Bokeh e mencionaremos outros recursos úteis. Vamos ver os motivos pelos quais o Bokeh é incrível (os dois primeiros passos definem o cenário e depois começamos a plotar).

1 – Bokeh funciona muito bem em notebooks Jupyter

 from bokeh.io import output_notebook 
output_notebook ()

Se eu passasse tanto tempo com minha mãe quanto em Jupyter Notebooks, seria o material do ano. Obviamente, se você está lendo, eu já lhe disse que você pode acompanhar o Bloco de Notas Jupyter no repositório a que me vinculei. Se Bokeh não funcionou bem com Jupyter, isso é uma coisa muito estúpida para se dizer. Felizmente, funciona muito bem em Jupyter e realmente destaca seu visual em comparação com o gráfico Matplotlib padrão (na minha opinião). É particularmente bom quando você quer adicionar alguma interatividade (zoom em gráficos, adicionar filtros, adicionar dicas de ferramentas / focas, etc), que discutiremos mais tarde. Também é bastante simples, basta adicionar o código acima e seus gráficos renderizarão bem em Jupyter. A outra coisa que gosto de adicionar é um modo de escala quando você instancia a figura, pois ela preencherá toda a janela do bloco de anotações, para que você não precise mais especificar um tamanho.

 figure = (sizing_mode = 'stretch_width') 

2 – Temas

Temas basicamente permitem que você diga ao Bokeh “Eu sempre quero que meu gráfico use fonte tamanho 14 no título, esconda as feias linhas de grade e sempre faça com que as minhas legendas axiais tenham tamanho 12 e negrito”. Se você é preguiçoso e neurótico sobre suas tramas como eu, então isso é uma dádiva de Deus, porque você não precisa fazer muito de qualquer estilo a cada vez que você faz um enredo e eles simplesmente saem bonitos por padrão. Aqui está um exemplo de um tema do Notebook Jupyter.

 de bokeh.io import curdoc 
de bokeh.themes import Tema
curdoc (). theme = Tema (json = {'attrs': { # aplica padrões para propriedades da Figura
'Figura': {
'toolbar_location': nenhuma,
'outline_line_color': nenhuma,
'min_border_right': 10,
'sizing_mode': 'stretch_width'
},
'Grid': {
'grid_line_color': nenhuma,
}
'Título': {
'text_font_size': '14pt'
},
# aplica padrões às propriedades do Axis
'Eixo': {
'minor_tick_out': nenhuma,
'minor_tick_in': nenhuma,
'major_label_text_font_size': '11pt',
'axis_label_text_font_size': '13pt',
'axis_label_text_font': 'Trabalhe sem'
}
# aplicar padrões às propriedades da legenda
'Lenda': {
'background_fill_alpha': 0,8,
}}})

Você pode ir para a documentação do Bokeh para ver todas as diferentes opções, mas geralmente ele apenas se alinha com o modo como você faz os comandos no Bokeh. Você essencialmente apenas dá um dicionário de valores e aplica automaticamente esses gráficos. Por exemplo, em "Título", definimos o tamanho da fonte para sempre ser 14pt. Isso permite a personalização completa dos seus gráficos e você só precisa fazer isso uma vez! Geralmente, esta é a primeira coisa que especifico quando começo um bloco de notas ou um script em que estou usando gráficos Bokeh. Os temas economizam seu tempo – use-os!

3— Facilidade de Integração com os Pandas

Toda manhã preparo uma boa xícara de café e digito pandas importados como pd, é uma espécie de rotina matinal. Se você é como eu, e vive e morre com o Pandas, então Bokeh é seu novo melhor amigo. O Bokeh usa algo chamado ColumnDataSource , que, embora não precise ser um dataframe do Pandas, funciona maravilhosamente com ele. Você pode ler a documentação completa se estiver interessado, mas basicamente transforma o dataframe do Pandas em uma arma de plotagem em massa. Os passos básicos que sigo são:

  • Coloque meus dados em um dataframe de pandas limpo e organizado
  • Crie um ColumnDataSource com esse dataframe
  • Desenhe com facilidade!

Aqui está um exemplo super simples para nos começar (disponível no Jupyter Notebook e no Github Repo com link na introdução), que analisa os preços dos apartamentos em comparação com a metragem quadrada do apartamento.

Nosso lote básico de dispersão

Pessoalmente acho isso muito mais fácil e intuitivo do que o Matplotlib, e também fica mais bonito em um Caderno Jupyter. Basicamente, isso faz com que o Bokeh saiba que você usará o dataframe do Pandas como fonte para seus gráficos. Quando você realmente traça algo em sua figura (p.scatter) e diz x = 'area' e y = 'price', você está apenas dizendo quais colunas dentro do seu Bfr de dados devem ir e olhar para obter esses dados. Assim, ele vê 'área' e 'preço' especificados e ele passará por cada linha no seu dataframe e plotar esses pontos de par. Isso torna a criação de gráficos com os Pandas intuitivos e rápidos.

O outro grande aspecto é que isso permite aproveitar os recursos dos Pandas para aprimorar seus enredos. Ou seja, qualquer coluna no seu dataframe pode ser usada! Vamos criar uma coluna 'cor' que mapeie o número de quartos para uma cor. Podemos então usar essa nova coluna como uma opção para colorir nosso gráfico de dispersão. Especificamente, veja as linhas 9 e 10 e, em seguida, na linha 22, dizemos usar esta coluna para colorir nosso gráfico.

Nosso lote de dispersão colorido por número de dormitórios

Uma coisa importante para se lembrar, que muitas vezes esqueço, é que se você adicionar uma coluna ao dataframe do Pandas, precisará recriar seu ColumnDataSource. Neste exemplo, agora criamos uma nova coluna de cores, portanto, o ColumnDataSource anterior, que foi criado antes de ter essa coluna, não teria nosso recurso de cor. Uma vez que você faz isso, é tão simples quanto passar a cor = 'cor' para o método de dispersão e o Bokeh sabe procurar a cor na coluna 'cor' apropriadamente chamada. Há muitas outras maneiras de utilizar esse tipo de material, como o dimensionamento pelo número de ocorrências, mas deixarei isso para você em um exercício adicional. O ponto é se você pode criá-lo em Pandas, então você pode utilizá-lo em uma trama Bokeh!

4— A exportação para HTML é uma brisa

Compartilhar gráficos do Bokeh com um colega ou em um aplicativo da Web é fácil, pois pode ser facilmente exportado para algo que o código HTML pode usar. Se você estiver interessado em usar esses gráficos em produção em um site ou compartilhá-los em um arquivo HTML, então você deve definitivamente ler esta documentação . Se você quiser ver uma versão real de como isso parece na prática, confira os dados do Game Of Thrones de um pequeno aplicativo web que eu construí ou este website estático do S3 usando dados primários democráticos . Todos esses gráficos são feitos em Bokeh usando o método abaixo. Veja como fazer isso:

  • Importe o recurso de componentes. Isso é o que permite transformar essa figura em um script e div em HTML.
 de componentes de importação bokeh.embed 
  • Crie seu enredo no Bokeh como você faria normalmente
  • No final, adicione o seguinte código, onde p é seu objeto de figura
 script, div = components (p) 
script de retorno, div

A primeira linha dá-lhe um pedaço de Javascript que tem tudo que você precisa para o seu enredo (incluindo os dados) e um elemento div onde o gráfico será colocado. É isso aí! Mais uma vez, este código não depende mais da sua fonte de dados! Pegue esse script e div, coloque-o em algum lugar em um arquivo HTML e agora você tem um gráfico totalmente exportável. Se você estiver familiarizado com o Django, muitas vezes passo o script e div do arquivo views.py para o HTML e, em seguida, posso usá-lo em meus arquivos de modelo, mas há muitas maneiras de utilizá-lo. Se você costuma compartilhar dados em HTML, o Bokeh é o melhor que o Python tem a oferecer na minha opinião.

5 – Sugestões inteligentes sobre erros

Se eu fosse o Czar do Python com a capacidade de criar leis para todas as bibliotecas do Python, esta é definitivamente uma que eu implementaria. Com o Bokeh, se você estiver tentando editar algo com o seu enredo, como alterar o rótulo do eixo e colocar o comando errado, o Bokeh lhe dirá sugestões para o que acha que você quis dizer.

AttrbuteError é que, na verdade, salvando você do Googling!

Observe aqui que eu disse p.yaxis.axis_title, mas na verdade é p.yaxis.axis_label. Se você olhar no AttributeError, ele fornecerá sugestões mais próximas do que você acha que está tentando fazer. Geralmente isso funciona incrivelmente bem e poupa muito tempo perguntando ao google “Alterando o título do eixo em Bokeh”. Se alguém pudesse implementar isso no Matplotlib, eu ficaria eternamente em débito com você, já que nem quero saber quanto tempo passei fazendo isso. Mas, na seriedade, esse é um recurso incrível, especialmente se você estiver alternando entre diferentes bibliotecas de visualização.

6 – Interatividade fácil

Um recurso realmente interessante do Bokeh é como é fácil adicionar interatividade aos nossos gráficos. Por padrão, você obtém ferramentas à direita de um gráfico que permite fazer um monte de coisas fora da caixa.

Por exemplo, se você selecionar o botão de zoom, poderá desenhar uma caixa em torno de qualquer área do gráfico que deseja focar.

Observe como também atualiza o eixo xey para se concentrar em nossa área especificada, tudo sem código adicional. Mas isso é apenas o começo da interatividade no Bokeh. Vamos ver como você também pode adicionar essas pequenas dicas interessantes no Tableau sem muito esforço. Para criá-los (bem, existem várias maneiras) você precisa usar o HoverTool.

 de bokeh.models import HoverTool 

Agora eu gosto de ficar um pouco chique com o meu HoverTools e adicionar um pouco de HTML personalizado para dar um toque especial. Se você não está se sentindo tão corajoso, então você pode ver alguns exemplos mais simples no Bokeh Docs , mas se você pode lidar com algum HTML elementar, então continue comigo meus amigos. Vamos construir o gráfico de dispersão que usamos pela última vez com as cores adicionais.

Eis nossas gloriosas dicas de ferramentas quando pairamos!

Nós realmente queremos nos concentrar nas linhas 24 e além, já que eu discuti as coisas anteriores há alguns passos atrás. Aqui está o que está acontecendo:

  • Bokeh permite que você passe HTML como uma string, então criativamente uma variável chamada tooltips
  • As divs são apenas para armazenar os dados da dica de ferramenta, eu fiz uma div para cada linha na nossa dica de ferramenta, mas você não precisa fazer isso.
  • Cada div tem duas partes: um cabeçalho e os dados reais, cada um dentro de tags <h5>. Portanto, o primeiro <h5> é o cabeçalho “Craigslist URL”, “Price ($)” ou “Square Footage” em cada linha.
  • O segundo <h5> é o dado real, que novamente torna o Bokeh incrivelmente fácil de acessar. Como estamos usando um ColumnDataSource, apenas colocamos @columnname para obter os dados lá. Por exemplo, no primeiro div eu uso @url para que ele pegue o URL da linha de pontos em nossos dados. Observe como podemos obter pontos de dados que não estão sendo plotados, já que eles são puxados da coluna na mesma linha que nossos dados. Nós fazemos o mesmo para preço e metragem quadrada. Você pode até mesmo formatar seus dados de entrada, que mostro com o {0,0}, que adiciona o separador de vírgulas aos milhares no preço e na metragem quadrada. Existem muitos formatadores, mas os mais comuns são para datas, decimais e porcentagens.
  • É isso aí! Dicas de ferramentas maravilhosamente interativas em apenas algumas linhas! Você pode fazer coisas realmente incríveis com as dicas de ferramentas, mas isso deve ser suficiente para estimular sua imaginação. Isso dá ao seu notebook que você compartilha com um colega um pouco mais de força para deixá-lo brincar com seus dados.

Se você for à galeria do Bokeh, existem várias maneiras de adicionar interatividade e fazer o máximo em painéis, por isso é só um gostinho. Se você está interessado em criar enredos realmente interativos Bokeh é uma das minhas opções favoritas no mercado agora, especialmente se você quiser evitar o mundo sombrio, frio e mal do Javascript.

Resumo

É isso aí! Espero que, se você é novo no Bokeh, isso lhe dá um gostinho de seu incrível poder. Eu ainda uso Matplotlib e Seaborn para algumas coisas (boxplots, gráficos de distribuição), mas na maioria das vezes eu sou um defensor do Bokeh. Dê um giro, você pode ser em breve também! Feliz aprendizado!

Sinta-se à vontade para se conectar comigo no LinkedIn