Python e IA

Crea dashboards web con Streamlit

Crea un dashboard web interactivo con Streamlit y Python: filtros, tarjetas de KPI, gráficos con Plotly, descargas y cómo compartirlo con tu equipo.

Por Equipo editorial de DashCore HubActualizado 8 min de lectura

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:

StreamlitPower BI / Tableau
Cómo se construyeCódigo PythonInterfaz de arrastrar y soltar más fórmulas (DAX, campos calculados)
Ideal paraLógica personalizada, modelos en Python, pronósticos, funciones con IA, herramientas internasReportes de negocio estándar, exploración de autoservicio, datos corporativos gobernados
Modelado de datosLo que hagas en pandas o SQLModelo semántico integrado con relaciones y medidas
Cómo se comparteSe 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 aprendizajeFácil si sabes Python; difícil si noFá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

  1. Instala las librerías: pip install streamlit pandas plotly. Usar un entorno virtual por proyecto mantiene las versiones en orden.
  2. Crea un archivo llamado app.py con dos líneas: import streamlit as st y st.title("Hola, dashboard").
  3. En la terminal, desde esa misma carpeta, ejecuta streamlit run app.py.
  4. 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.
Consejo: Ejecuta la app con 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_data guarda 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 df filtrado.
  • st.columns coloca elementos uno al lado del otro; así se arma la fila de KPI y los dos gráficos.
  • st.metric muestra una tarjeta con un número grande. También acepta el argumento delta si 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.

Atajo con IA: Los asistentes escriben muy buen código de Streamlit porque la librería es popular y sencilla. Prueba un prompt como: "Escribe una app de Streamlit que lea inventory.csv con las columnas sku, category, warehouse, on_hand, reorder_point. Agrega un filtro de almacén en la barra lateral, un KPI con cuántos SKU están por debajo de su punto de reorden, un gráfico de barras de on_hand por categoría y una tabla con los artículos a reordenar. Usa pandas y Plotly Express y pon en caché la carga de datos." Después ejecútala, prueba los filtros y verifica un número a mano.

Comparte tu dashboard

Un dashboard que solo corre en tu laptop solo te ayuda a ti. Para compartirlo, hay varios caminos comunes:

  1. Streamlit Community Cloud. Sube tu app y un archivo requirements.txt a 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.
  2. 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.
  3. 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

Building a Dashboard web app in Python - Full Streamlit Tutorialpor Data Professor · Ver en YouTube ↗Video en inglés — activa los subtítulos traducidos en YouTube si los necesitas.

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.

¿Aprendes con la Academia?
Marca esta lección como completada para seguir tu progreso.
Hacer el quiz