Streamlit es una librería de Python gratuita y de código abierto que convierte un script normal de Python en un dashboard web interactivo, con filtros, tarjetas de KPI, gráficos y tablas, sin escribir nada de HTML ni JavaScript. Si ya sabes cargar y resumir datos con pandas, puedes construir y compartir un dashboard funcional en Streamlit en una tarde.
Qué es Streamlit (y en qué se diferencia de Power BI)
Una app de Streamlit es simplemente un archivo .py. Cada línea como st.title(), st.metric() o st.line_chart() agrega un elemento a la página. Cuando el usuario cambia un filtro, Streamlit vuelve a ejecutar el script completo, de arriba abajo, con el nuevo valor. Esa sola idea, "todo el script se vuelve a ejecutar en cada interacción", explica casi todo sobre cómo funciona Streamlit.
Es un tipo de herramienta distinto a Power BI o Tableau, así que conviene saber dónde encaja cada uno:
| Streamlit | Power BI / Tableau | |
|---|---|---|
| Cómo se construye | Código Python | Interfaz de arrastrar y soltar más fórmulas (DAX, campos calculados) |
| Ideal para | Lógica personalizada, modelos en Python, pronósticos, funciones con IA, herramientas internas | Reportes de negocio estándar, exploración de autoservicio, datos corporativos gobernados |
| Modelado de datos | Lo que hagas en pandas o SQL | Modelo semántico integrado con relaciones y medidas |
| Cómo se comparte | Se publica como app web (servicio en la nube o servidor propio) | Se publica en el servicio del proveedor; aplican licencias para quienes lo ven |
| Curva de aprendizaje | Fácil si sabes Python; difícil si no | Fácil para empezar sin código |
Una regla práctica: si tu empresa ya usa Power BI y la pregunta es un reporte estándar de ventas o finanzas, constrúyelo ahí. Usa Streamlit cuando necesites algo que esas herramientas hacen mal, como ejecutar un modelo de pronóstico a pedido, permitir que el usuario suba un archivo o poner un asistente de IA encima de tus datos. Para la base de Python, empieza con Python para análisis de datos: por dónde empezar.
Instala Streamlit y ejecuta tu primera app
- Instala las librerías:
pip install streamlit pandas plotly. Usar un entorno virtual por proyecto mantiene las versiones en orden. - Crea un archivo llamado
app.pycon dos líneas:import streamlit as styst.title("Hola, dashboard"). - En la terminal, desde esa misma carpeta, ejecuta
streamlit run app.py. - El navegador abre una página local (normalmente en
localhost:8501). Edita el archivo, guárdalo y la página te ofrecerá volver a ejecutarse con los cambios.
streamlit run app.py, no con python app.py. Si la corres con Python a secas, no se levanta el servidor web y verás advertencias en lugar de un dashboard.Construye un dashboard de ventas paso a paso
El ejemplo de abajo espera un archivo sales.csv con las columnas date, region, product, order_id y revenue. Incluye filtros en la barra lateral, tres tarjetas de KPI, dos gráficos, una tabla de detalle y un botón de descarga. Cada parte se explica después del código. Los textos de la interfaz están en inglés, pero puedes traducirlos sin problema.
import pandas as pd
import plotly.express as px
import streamlit as st
st.set_page_config(page_title="Sales Dashboard", layout="wide")
@st.cache_data
def load_data(path):
df = pd.read_csv(path, parse_dates=["date"])
df["month"] = df["date"].dt.to_period("M").dt.to_timestamp()
return df
sales = load_data("sales.csv")
st.title("Sales Dashboard")
# Sidebar filters
regions = st.sidebar.multiselect(
"Region", sorted(sales["region"].unique()),
default=sorted(sales["region"].unique()),
)
dates = st.sidebar.date_input(
"Date range", (sales["date"].min(), sales["date"].max())
)
if len(dates) != 2:
st.info("Pick a start and an end date.")
st.stop()
start, end = dates
mask = (
sales["region"].isin(regions)
& sales["date"].between(pd.Timestamp(start), pd.Timestamp(end))
)
df = sales[mask]
if df.empty:
st.warning("No data for these filters.")
st.stop()
# KPI row
c1, c2, c3 = st.columns(3)
c1.metric("Revenue", f"${df['revenue'].sum():,.0f}")
c2.metric("Orders", f"{df['order_id'].nunique():,}")
c3.metric("Avg. order value",
f"${df['revenue'].sum() / df['order_id'].nunique():,.2f}")
# Charts
left, right = st.columns(2)
monthly = df.groupby("month", as_index=False)["revenue"].sum()
left.plotly_chart(px.line(monthly, x="month", y="revenue",
title="Revenue by month"), width="stretch")
by_product = (df.groupby("product", as_index=False)["revenue"].sum()
.nlargest(10, "revenue"))
right.plotly_chart(px.bar(by_product, x="revenue", y="product",
orientation="h", title="Top 10 products"),
width="stretch")
# Detail table + download
st.subheader("Detail")
st.dataframe(df, width="stretch", hide_index=True)
st.download_button("Download filtered data (CSV)",
df.to_csv(index=False), "sales_filtered.csv", "text/csv")
Cómo funciona cada parte
@st.cache_dataguarda el archivo cargado en memoria. Como el script se vuelve a ejecutar con cada clic, el caché evita leer el CSV cada vez y mantiene la app rápida.- Los widgets de la barra lateral (
st.sidebar.multiselect,st.sidebar.date_input) devuelven lo que el usuario eligió como valores normales de Python. El selector de fechas devuelve una sola fecha mientras el usuario todavía está eligiendo, por eso la app espera hasta que estén las dos. - La máscara filtra el DataFrame igual que lo harías en un notebook. Todo lo de abajo usa el
dffiltrado. st.columnscoloca elementos uno al lado del otro; así se arma la fila de KPI y los dos gráficos.st.metricmuestra una tarjeta con un número grande. También acepta el argumentodeltasi quieres mostrar el cambio frente a un periodo anterior.st.stop()detiene la ejecución con un mensaje amable cuando los filtros no devuelven filas, en lugar de mostrar gráficos rotos.
Los gráficos usan Plotly Express, que trae tooltips al pasar el mouse y zoom sin esfuerzo extra. Streamlit también tiene gráficos integrados sencillos como st.bar_chart y es compatible con Matplotlib, Altair y otros. Nuestra comparación de Matplotlib vs Plotly te ayuda a elegir. La API de Streamlit va cambiando con el tiempo, así que si algún parámetro de este ejemplo muestra una advertencia de obsolescencia en tu versión, revisa la documentación oficial para ver el nombre actual.
Consejos de diseño para un dashboard que la gente sí use
Streamlit hace muy fácil agregar elementos, y eso también hace fácil terminar con una página saturada. Aquí aplican los mismos principios que en cualquier dashboard:
- Responde una pregunta principal por página. Si necesitas más, usa la función multipágina de Streamlit (una carpeta
pages). - Pon los KPI primero, las tendencias después y las tablas de detalle al final.
- Limita los filtros a los que la gente realmente usa y dales valores predeterminados razonables para que la primera vista ya sea útil.
- Da formato a los números con separadores de miles y símbolo de moneda, como en los f-strings del ejemplo.
- Etiqueta todo con lenguaje de negocio claro, no con nombres de columnas como
rev_net_adj.
Para profundizar en decisiones de diseño y color, lee nuestra guía de principios de visualización de datos que sí funcionan.
Comparte tu dashboard
Un dashboard que solo corre en tu laptop solo te ayuda a ti. Para compartirlo, hay varios caminos comunes:
- Streamlit Community Cloud. Sube tu app y un archivo
requirements.txta un repositorio de GitHub, conecta el repositorio y el servicio aloja la app en una URL pública. Tiene una opción gratuita, pero los límites y condiciones cambian, así que revisa la documentación oficial de Streamlit antes de depender de ella. - La infraestructura de tu empresa. El equipo de TI puede correr la app en un servidor interno, en un contenedor o en una plataforma en la nube, para que quede detrás del inicio de sesión de la empresa. Algunas plataformas de datos también ofrecen hospedaje integrado para Streamlit; consulta la documentación de tu proveedor.
- Misma red, demo rápida. Mientras la app corre, Streamlit muestra una URL de red que tus compañeros en la misma red quizá puedan abrir. Sirve para una demostración, no para producción.
Un requirements.txt mínimo para el ejemplo se ve así:
streamlit
pandas
plotly
Antes de publicar cualquier cosa con datos de la empresa, piensa en la seguridad. Una URL pública en la nube la puede ver cualquiera que tenga el enlace, a menos que configures controles de acceso. Nunca subas contraseñas ni credenciales de bases de datos a GitHub; Streamlit permite un archivo de secretos separado justamente para eso. Si tienes dudas, pregúntale a tu equipo de TI o de datos dónde deben vivir las apps internas.
Próximos pasos
Copia la app de ejemplo, apúntala a una exportación CSV que ya uses y cambia los nombres de las columnas en el código para que coincidan. Hazla correr en tu computadora y luego agrega una función a la vez: un delta en el KPI de ingresos, una segunda página o un cargador de archivos con st.file_uploader. Cuando le sea útil a otros, publícala y pide opiniones. Si la lógica detrás de tu dashboard todavía está cambiando, haz primero un prototipo en un notebook con nuestra guía de Jupyter Notebooks y luego lleva el código terminado a Streamlit.
Mira: lecciones en video

Preguntas frecuentes
¿Streamlit es gratis?
La librería Streamlit es gratuita y de código abierto. El hospedaje puede tener costo o no según dónde publiques la app, así que revisa las condiciones del servicio que elijas.
¿Necesito saber HTML o JavaScript para usar Streamlit?
No. Toda la interfaz se construye con funciones de Python como st.title, st.metric y st.plotly_chart. Saber pandas es el requisito más útil.
¿Streamlit puede reemplazar a Power BI?
En algunos casos sí, como herramientas a la medida o apps con IA. Para reportes de negocio estándar y gobernados, con muchos usuarios no técnicos, una plataforma BI como Power BI suele ser mejor opción.
¿Streamlit se puede conectar a una base de datos en vez de un CSV?
Sí. Puedes consultar bases de datos con librerías como SQLAlchemy o el driver de Python de cada base, y Streamlit también ofrece una función de conexión integrada. Guarda las credenciales en un archivo de secretos, no en el código.
Marca esta lección como completada para seguir tu progreso.