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
- Salve o código em dashboard.py
- Abra o terminal
- Digite: streamlit run dashboard.py
- 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:
- Adicionar um gráfico de pizza com a participação de cada produto
- Criar um filtro de período (último mês, últimos 3 meses, etc.)
- 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!
Comentários (0)
Seja o primeiro a comentar!
Deixe um comentário