Dashboards são essenciais para visualizar dados de forma clara e interativa. Se você já trabalha com Python e quer criar aplicações web sem complicação, Streamlit é a ferramenta perfeita.

Neste post, vamos construir um dashboard completo do zero. Sem enrolação, só código que funciona.

O que é Streamlit?

Streamlit transforma scripts Python em aplicações web interativas. Simples assim. Não precisa saber HTML, CSS ou JavaScript. Escreve Python, roda o comando, e pronto - você tem uma aplicação web.

Instalação Rápida

Primeiro, instale o que precisamos:

pip install streamlit pandas plotly

Pronto. Só isso.

Seu Primeiro Dashboard - Código Completo

Vamos criar um arquivo dashboard.py com tudo que precisamos:

import streamlit as st
import pandas as pd
import plotly.express as px
import numpy as np

# Configuração básica
st.set_page_config(
    page_title="Dashboard de Vendas",
    page_icon="📊",
    layout="wide"
)

st.title("📊 Dashboard de Vendas")
st.markdown("---")

Gerando Dados de Exemplo

Para este tutorial, vamos criar dados fictícios. Na vida real, você conectaria ao seu banco de dados ou arquivo CSV.

@st.cache_data
def criar_dados():
    np.random.seed(42)  # Para resultados consistentes
    meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun']
    
    dados = {
        'Mês': meses,
        'Vendas': [45000, 52000, 48000, 61000, 55000, 67000],
        'Clientes': [450, 520, 480, 610, 550, 670],
        'Produto_A': [15000, 18000, 16000, 21000, 19000, 23000],
        'Produto_B': [20000, 22000, 21000, 25000, 23000, 28000],
        'Produto_C': [10000, 12000, 11000, 15000, 13000, 16000]
    }
    return pd.DataFrame(dados)

df = criar_dados()

O @st.cache_data é importante. Ele evita que os dados sejam recriados toda vez que alguém interage com o dashboard. Performance importa.

Filtros na Sidebar

Todo dashboard precisa de filtros. Vamos colocar na sidebar:

st.sidebar.header("Filtros")

meses_escolhidos = st.sidebar.multiselect(
    "Escolha os meses:",
    options=df['Mês'].tolist(),
    default=df['Mês'].tolist()
)

# Filtra os dados
df_filtrado = df[df['Mês'].isin(meses_escolhidos)]

Métricas Principais

Métricas chamam atenção. Vamos criar cards com os números importantes:

col1, col2, col3 = st.columns(3)

with col1:
    total_vendas = df_filtrado['Vendas'].sum()
    st.metric(
        "💰 Vendas Totais", 
        f"R$ {total_vendas:,.0f}",
        f"+{12}%"
    )

with col2:
    total_clientes = df_filtrado['Clientes'].sum()
    st.metric(
        "👥 Clientes", 
        f"{total_clientes:,}",
        f"+{8}%"
    )

with col3:
    ticket_medio = total_vendas / total_clientes if total_clientes > 0 else 0
    st.metric(
        "🎫 Ticket Médio", 
        f"R$ {ticket_medio:.0f}",
        f"+{5}%"
    )

Gráficos que Importam

Dados sem visualização não servem para nada. Vamos criar gráficos interativos:

# Duas colunas para os gráficos
col1, col2 = st.columns(2)

with col1:
    st.subheader("Evolução das Vendas")
    fig_vendas = px.line(
        df_filtrado, 
        x='Mês', 
        y='Vendas',
        markers=True,
        title="Vendas por Mês"
    )
    st.plotly_chart(fig_vendas, use_container_width=True)

with col2:
    st.subheader("Clientes por Mês")
    fig_clientes = px.bar(
        df_filtrado,
        x='Mês',
        y='Clientes',
        title="Base de Clientes",
        color='Clientes'
    )
    st.plotly_chart(fig_clientes, use_container_width=True)

Comparação de Produtos

Vamos ver qual produto vende mais:

st.subheader("Performance por Produto")

# Reorganiza os dados para o gráfico
produtos_df = df_filtrado.melt(
    id_vars=['Mês'], 
    value_vars=['Produto_A', 'Produto_B', 'Produto_C'],
    var_name='Produto', 
    value_name='Vendas'
)

fig_produtos = px.bar(
    produtos_df,
    x='Mês',
    y='Vendas',
    color='Produto',
    barmode='group',
    title="Vendas por Produto"
)
st.plotly_chart(fig_produtos, use_container_width=True)

Tabela de Dados

Às vezes você precisa ver os números brutos:

if st.checkbox("Mostrar dados detalhados"):
    st.dataframe(df_filtrado)
    
    # Botão para download
    csv = df_filtrado.to_csv(index=False)
    st.download_button(
        "📥 Baixar CSV",
        csv,
        "vendas.csv",
        "text/csv"
    )

Widgets Interativos

Vamos adicionar uma calculadora simples:

st.subheader("Simulador de Receita")

col1, col2, col3 = st.columns(3)

with col1:
    preco = st.number_input("Preço unitário (R$)", 1, 1000, 50)

with col2:
    quantidade = st.number_input("Quantidade", 1, 10000, 100)

with col3:
    receita = preco * quantidade
    st.metric("Receita Total", f"R$ {receita:,.2f}")

Código Completo

Aqui está, tudo junto, em um arquivo:

import streamlit as st
import pandas as pd
import plotly.express as px
import numpy as np

# Configuração
st.set_page_config(page_title="Dashboard de Vendas", page_icon="📊", layout="wide")
st.title("📊 Dashboard de Vendas")
st.markdown("---")

# Dados
@st.cache_data
def criar_dados():
    np.random.seed(42)
    return pd.DataFrame({
        'Mês': ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun'],
        'Vendas': [45000, 52000, 48000, 61000, 55000, 67000],
        'Clientes': [450, 520, 480, 610, 550, 670],
        'Produto_A': [15000, 18000, 16000, 21000, 19000, 23000],
        'Produto_B': [20000, 22000, 21000, 25000, 23000, 28000],
        'Produto_C': [10000, 12000, 11000, 15000, 13000, 16000]
    })

df = criar_dados()

# Filtros
st.sidebar.header("Filtros")
meses_escolhidos = st.sidebar.multiselect(
    "Escolha os meses:", df['Mês'].tolist(), df['Mês'].tolist()
)
df_filtrado = df[df['Mês'].isin(meses_escolhidos)]

# Métricas
col1, col2, col3 = st.columns(3)
total_vendas = df_filtrado['Vendas'].sum()
total_clientes = df_filtrado['Clientes'].sum()
ticket_medio = total_vendas / total_clientes if total_clientes > 0 else 0

with col1:
    st.metric("💰 Vendas Totais", f"R$ {total_vendas:,.0f}", "+12%")
with col2:
    st.metric("👥 Clientes", f"{total_clientes:,}", "+8%")
with col3:
    st.metric("🎫 Ticket Médio", f"R$ {ticket_medio:.0f}", "+5%")

# Gráficos
col1, col2 = st.columns(2)

with col1:
    fig_vendas = px.line(df_filtrado, x='Mês', y='Vendas', markers=True, title="Vendas por Mês")
    st.plotly_chart(fig_vendas, use_container_width=True)

with col2:
    fig_clientes = px.bar(df_filtrado, x='Mês', y='Clientes', title="Clientes por Mês", color='Clientes')
    st.plotly_chart(fig_clientes, use_container_width=True)

# Produtos
produtos_df = df_filtrado.melt(
    id_vars=['Mês'], 
    value_vars=['Produto_A', 'Produto_B', 'Produto_C'],
    var_name='Produto', value_name='Vendas'
)
fig_produtos = px.bar(produtos_df, x='Mês', y='Vendas', color='Produto', barmode='group', title="Vendas por Produto")
st.plotly_chart(fig_produtos, use_container_width=True)

# Dados
if st.checkbox("Mostrar dados"):
    st.dataframe(df_filtrado)
    csv = df_filtrado.to_csv(index=False)
    st.download_button("📥 Baixar CSV", csv, "vendas.csv", "text/csv")

# Simulador
st.subheader("Simulador")
col1, col2, col3 = st.columns(3)
with col1:
    preco = st.number_input("Preço (R$)", 1, 1000, 50)
with col2:
    quantidade = st.number_input("Quantidade", 1, 10000, 100)
with col3:
    st.metric("Receita", f"R$ {preco * quantidade:,.2f}")

Como Rodar

  1. Salve o código em dashboard.py
  2. Abra o terminal
  3. Digite: streamlit run dashboard.py
  4. Pronto! O dashboard abre no navegador

Quando rodando o Streamlit pela primeria vez, vai ver algo assim:

Você pode deixar em branco ou colocar o seu email. Mas assim que tudo der certo, o seu Dashboard vai aparecer no seu browser.

Ficou legal, não ficou?

Dicas Importantes

Performance: Use @st.cache_data para funções que processam dados. Faz diferença.

Layout: st.columns() é seu amigo. Use para organizar elementos lado a lado.

Interatividade: Widgets como selectbox, slider, checkbox tornam o dashboard útil.

Dados reais: Substitua a função criar_dados() por pd.read_csv('seus_dados.csv').

Próximos Passos

  • Conecte com banco de dados usando sqlalchemy
  • Adicione mais filtros (datas, categorias)
  • Use st.form() para formulários complexos
  • Deploy no Streamlit Cloud (gratuito!)

Exercício Rápido

Modifique o dashboard para:

  1. Adicionar um gráfico de pizza com a participação de cada produto
  2. Criar um filtro de período (último mês, últimos 3 meses, etc.)
  3. Adicionar uma previsão simples usando média móvel

Poste suas soluções nos comentários!

Conclusão

Streamlit democratiza a criação de dashboards. Com poucas linhas de Python, você tem uma aplicação web completa. O segredo é começar simples e ir evoluindo.

Gostou? Compartilhe com quem está aprendendo análise de dados!