Dashboards (Streamlit / Dash / Gradio)
Transforme notebooks em aplicativos compartilháveis: Streamlit para dashboards de dados rápidos, Dash para produtos focados em Plotly, Gradio para demonstrações de modelos.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
# streamlit_app.py
import streamlit as st
import pandas as pd
@st.cache_data
def load():
return pd.read_parquet("sales.parquet")
df = load()
region = st.selectbox("Região", sorted(df["region"].unique()))
filtered = df[df["region"] == region]
st.line_chart(filtered.set_index("ordered_at")["revenue"])Quando usar isso:
- Partes interessadas precisam de filtros sem o Jupyter
- Equipe de ML quer uma UI de pontuação rápida (Gradio)
- Dashboards Plotly com callbacks e autenticação (Dash)
- Ferramentas internas lançadas em dias, não meses
Exemplo de Trabalho
# Padrão mínimo Streamlit + Plotly
import streamlit as st
import pandas as pd
import plotly.express as px
st.set_page_config(page_title="Explorador de Receita", layout="wide")
@st.cache_data(show_spinner="Carregando vendas...")
def load_sales() -> pd.DataFrame:
# Substitua por read_parquet em produção
return pd.DataFrame(
{
"ordered_at": pd.date_range("2025-01-01", periods=30, freq="D", tz="UTC"),
"region": ["East", "West"] * 15,
"revenue": range(30),
}
)
df = load_sales()
col1, col2 = st.columns(2)
with col1:
regions = st.multiselect("Regiões", sorted(df["region"].unique()), default=["East"])
with col2:
min_rev = st.slider("Receita mínima", 0, int(df["revenue"].max()), 0)
filtered = df[df["region"].isin(regions) & (df["revenue"] >= min_rev)]
fig = px.line(filtered, x="ordered_at", y="revenue", color="region")
st.plotly_chart(fig, use_container_width=True)
st.dataframe(filtered, use_container_width=True)O que isso demonstra:
cache_dataevita recarregar Parquet a cada alteração de widget- Layout com colunas e configuração de página ampla
- Gráfico Plotly incorporado com largura responsiva
- Filtros compostos com máscaras booleanas do pandas
Mergulho Profundo
Como Funciona
- Streamlit reexecuta o script de cima para baixo a cada interação; widgets são declarativos.
- Dash usa Flask + callbacks do React - melhor para estado complexo e URLs.
- Gradio envolve uma função como blocos de E/S - ideal para
predict(image) -> label. - Todos os três rodam atrás de
uvicorn/servidor embutido - coloque um proxy reverso de autenticação em produção.
Escolha de Framework
| Framework | Ponto ideal |
|---|---|
| Streamlit | pandas/plots + filtros em horas |
| Dash | Aplicativos Plotly de várias páginas, corporativo |
| Gradio | Demonstrações de modelos Hugging Face |
Notas Python
# Esqueleto do Dash (app.py separado)
from dash import Dash, html, dcc, Input, Output
import plotly.express as px
app = Dash(__name__)
app.layout = html.Div([dcc.Graph(id="chart"), dcc.Dropdown(id="region")])
# @app.callback(Output("chart", "figure"), Input("region", "value")) ...Armadilhas
- Sem cache em carga pesada - cada clique no slider recarrega Parquet. Correção:
@st.cache_data/ Dashdcc.Store. - Incorporação de segredos no repositório - chaves de API apenas em
st.secretsou variáveis de ambiente. Correção: nunca comitar credenciais. - Multiselect sem limites - selecionar todas as regiões reimprime frames enormes. Correção: limitar a seleção ou agregar no lado do servidor.
- Ciclos de callback do Dash - Outputs mútuos sem guardas criam loop. Correção: estado de fonte única de verdade.
- Gradio para dashboards de BI - ferramenta errada - layout e filtros SQL são estranhos. Correção: Streamlit/Dash em vez disso.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Panel/HoloViz | Integração com a pilha PyData | Equipe quer o caminho mais simples (Streamlit) |
| FastAPI + React | UX e autenticação personalizadas | Precisa de um aplicativo em uma tarde |
| Superset/Metabase | BI de warehouse sobre SQL | Transformações Python pesadas na UI |
| Observable / Hex | Produtos de notebook hospedados | Requisito de Python auto-hospedado |
FAQs
Streamlit ou Dash primeiro?
- Streamlit para protótipos de análise de equipe única.
- Dash quando você precisa de roteamento de URL, callbacks e padrões de implantação gerenciados pela TI.
Como faço para implantar o Streamlit?
- Docker +
streamlit run app.py --server.port=8501. - Coloque OAuth no proxy reverso (nginx, Cloudflare Access).
Como compartilho o Gradio?
import gradio as gr
demo = gr.Interface(fn=predict, inputs="image", outputs="label")
demo.launch()- Use
share=Trueapenas para demonstrações, não para dados de produção.
Posso usar Polars no Streamlit?
- Sim - converta para pandas para
st.line_chartou use Plotly/Altair diretamente.
Como testo dashboards?
- Streamlit AppTest (embutido) para fluxos de widgets.
- Dash: pytest com fixtures
dash.testing.
Como lido com autenticação?
- Streamlit-Authenticator ou proxy SSO.
- Não implemente criptografia sozinho.
Por que meu aplicativo está lento?
- Perfilar o carregamento de dados e cacheá-lo.
- Agregar antes de plotar - não envie dataframes de milhões de linhas para o navegador.
O Dash pode usar pandas 2.2+?
- Sim - Dash é agnóstico à biblioteca de DataFrames.
Como versiono o aplicativo + dados juntos?
- Fixe a partição de dados na configuração do aplicativo (
DATA_DT=2025-01-15). - Registre o SHA do git no rodapé.
Gradio vs Streamlit para demonstrações de LLM?
- Gradio é o padrão para E/S de chat/imagem.
- Streamlit quando gráficos e filtros SQL dominam.
Relacionados
- Plotly - gráficos em Dash e Streamlit
- Plotagem de Dados Grandes - mantenha os aplicativos responsivos
- Melhores Práticas de Visualização - KPIs honestos em aplicativos
- Básicos de Análise de Dados - preparação de dados a montante
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.