Data Science Python Trilhas Diversas

Modelos em Produção com Streamlit

Fala galera! Espero que esteja tudo bem com vocês. Já falamos aqui de vários modelos de machine learning! Mas e agora? Meus modelos treinados vão ficar para sempre no Jupyter ou no colab? Claro que não. Consigo deixar mais profissa de uma forma SIMPLES? A resposta é SIM! E é o que vou te mostrar aqui, agora. 

Vou te apresentar um framework para colocar seus modelos de machine learning em “produção”. Nada de outro mundo, coisa simples e de fácil implementação. Vamos utilizar o modelo que fizemos sobre NLP, não lembra ou não viu, só conferir o post NLP com scikit-learn. Primeiramente vamos conhecer agora que framework é esse.

1. Framework Streamlit

O streamlit é um framework open-source, que constrói aplicações web. Como ele foi desenvolvido pensando na área de ciência de dados, então é de fácil utilização. Como diz na própria página do streamlit “Tudo em python. Tudo de graça.”.

Aqui vou te mostrar as opções de exibição, algumas formas de interação com o usuário e como trabalhar com arquivos externos. Nunca se esqueça de consultar a documentação, em qualquer ferramenta, deve ser sua fonte primária de informação.

Instalar o pacote

Se for a primeira vez que for construir uma aplicação com o streamlit, é possível que precise instalar o pacote. Utilize o comando em python abaixo:

pip install streamlit

Importando o pacote

Na aplicação é preciso importar a biblioteca do streamlit como qualquer outra. Utilize o comando em python abaixo:

import streamlit as st

Executando a aplicação

Para executar uma aplicação que utiliza o streamlit salvo em um arquivo do tipo python (extensão .py). Utilize o comando em python abaixo:

streamlit run app.py

Será aberto o app no seu navegador padrão com o endereço (http://localhost:8501/), sendo transparente para o usuário como está sendo executado por trás da aplicação. 

Agora podemos conhecer as opções de exibição disponíveis.  

2. Opções de Exibição

Com apenas uma linha de comando podemos exibir na aplicação, textos, tabelas, mídias (imagens, áudio e vídeo) e gráficos. De uma forma bem simples, vamos ver.

2.1. Texto

Existem algumas formas de inserir o textos com uma certa formatação para facilitar o desenvolvimento. Vamos ver 3 delas e como utilizamos no streamlit

st.title('Classificação Mercadológica')
st.subheader('**Classificação com NLP**')
st.markdown('Este app faz a classificação mercadológica, a partir da descrição…)

Abaixo podemos ver na imagem como é exibido, em amarelo o título (st.title), em azul o subtítulo (st.subheader) e em verde o texto (st.markdown) em formato markdown

2.2. Dados

Os dados formatados em tabelas podem ser exibidos facilmente através do código abaixo:

st.dataframe(df)

É exibida uma tabela com os dados do dataframe informado.

2.3. Mídia

Para exibir imagens na aplicação como a logo de uma empresa, com apenas uma linha, passamos a função, o caminho e o formato, como vemos no código python abaixo:

st.image('LogoD3.png', format='PNG')

É exibida a logo na página da aplicação, como podemos ver na figura abaixo. Logo após a logo está o título, que está aí só para representar a aplicação. 

É possível inserir áudio e vídeo de forma bem simples também, para a minha aplicação não foi necessária, caso você precise, basta consultar a documentação.

2.4. Gráficos

Podemos inserir gráficos pré formatados do próprio framework, ou se preferir, pode contar com o suporte a várias bibliotecas gráficas disponível no streamlit. A biblioteca mais básica é a famosa e já conhecida por nós a Matplotlib

Vejamos o código para gerar um gráfico do tipo WordCloud.

all_words = ' '.join(s for s in df['nova_descricao'].values)
# criar uma wordcloud
wc = WordCloud(stopwords=stop_words, background_color="black", width=1600, height=800)
wordcloud = wc.generate(all_words)
# plotar wordcloud
fig, ax = plt.subplots(figsize=(10,6))
ax.imshow(wordcloud, interpolation='bilinear')
ax.set_axis_off()
st.pyplot()

O comando st.pyplot() é o responsável por fazer a integração do matplotlib com o streamlit, exibindo o gráfico mostrado na imagem abaixo.

3. Interações com Usuário

É possível interagir com o usuário de diversas formas através do streamlit desde botões até formas de seleções.

3.1. Botões

Podemos inserir botões como o Link Exemplo, que está logo após o texto na imagem abaixo. Vamos ver o código python.

if st.button('Link Exemplo'):
    exemplo = pd.read_csv('https://raw.githubusercontent.com/dadosaocubo/streamlit/master/itens.csv')
    st.markdown(get_download(exemplo, 'itens'), unsafe_allow_html=True)

Na nossa aplicação ao acionar o botão é apresentado o link de download do exemplo de itens que pode ser baixado pelo usuário. 

3.2. Radio

O radio é uma forma de seleção exclusiva, em outras palavras, ou você escolhe uma ou outra opção, vamos ver como fica em python.

st.subheader('**Selecione uma das Opções**')
options = st.radio('O que deseja fazer?',('Carregar Arquivo', 'Digitar Itens'))
if options == 'Carregar Arquivo':
    ...
if options == 'Digitar Itens':
    ...

Na nossa aplicação cada uma das opções geram geram outras instruções no programa. Uma opção permite o carregamento de arquivo csv e a outra a inserção de itens pelo usuário.

3.3. Checkbox

O checkbox é uma forma de seleção múltipla, onde o usuário pode fazer a seleção de um ou mais opções, vamos ver como fazer isso com python.

if st.checkbox('WordCloud'):
    ...
if st.checkbox('Top10 Departamentos'):
    ...
if st.checkbox('Bottom10 Departamentos'):
    ...

Na nossa aplicação, temos 3 opções de checkbox, que permite ao usuário gerar gráficos ao selecioná-las. A primeira opção gera um gráfico do tipo WordCloud, a segunda com os Top10 Departamentos com mais itens e por último os Bottom10 Departamentos com menos itens. Como podemos ver na imagem abaixo.

4. Trabalhando com Arquivos

Podemos também trabalhar com arquivos externos, fazendo tanto upload, quanto download de arquivos.

4.1. Upload

Pode ser necessário, subir um conjunto de dados para trabalhar pela aplicação, neste caso fazemos um upload do arquivo. Em python fica da seguinte forma.

data = st.file_uploader('Escolha o dataset (.csv)', type = 'csv')
if data is not None:
    df = pd.read_csv(data)

É apresentada uma tela similar a imagem abaixo para ser feito o upload do arquivo, internamento uso a variável data para receber o caminho do arquivo através da função (st.file_uploader), usei um if  somente para garantir que a variável data não está vazia. Após selecionar o arquivo crio o dataframe através da função (pd.read_csv).

4.2. Download

Para fazer o download precisamos criar uma função, tornando possível o usuário baixar o arquivo gerado após o processamento. Vejamos a função em python.

def get_download(df, arq):
    csv = df.to_csv(index=False)
    b64 = base64.b64encode(csv.encode()).decode() 
    href = f'<a href="data:file/csv;base64,{b64}" download="'+arq+'.csv">Download</a>'
    return href

Para chamar a função usamos a função de texto (st.markdown) do streamlit, segue comando exemplo em python.

st.markdown(get_download(exemplo, 'itens'), unsafe_allow_html=True)

Então é exibido um botão com o link para download, como vemos na imagem abaixo. 

5. Onde a Mágica Acontece!

Agora precisamos compilar todas essas informações que vimos até aqui para sair a aplicação. O nosso modelo que classifica o departamento foi criado no post NLP com scikit-learn. E vamos usar a função abaixo para carregar esse modelo treinado e retornar as predições com os departamentos. Passando apenas o dataframe com as descrições.

from joblib import load

def model(df):
    cvt = load('models/cvt.joblib') 
    tfi = load('models/tfi.joblib') 
    clf = load('models/clf.joblib') 
    new_cvt = cvt.transform(df)
    new_tfi = tfi.transform(new_cvt)
    result = clf.predict(new_tfi)
    return result

6. Conclusões

E vamos chegando ao fim de mais um post. Hoje vimos o framework streamlit e suas principais funcionalidades. Compilamos tudo isso, mas o modelo criado de NLP para colocar uma aplicação em “produção”.

Esse é o resultado da aplicação como podemos ver na imagem abaixo.

Está disponível o código completo da aplicação no nosso GitHub. Não perca o próximo post, que vamos fazer o deploy dessa mesma aplicação no Heroku. Espero que tenham gostado e não esquece de deixar aquele feedback.

Referências

Você pode gostar:

Comentários: