Tienes el modelo. Lo entrenaste con cuidado, le hiciste validación cruzada, lo dejaste bien comentado en un Jupyter notebook. Y ahí sigue: en un .ipynb que solo tú abres. La semana pasada marketing te pidió filtrar por región, abriste el cuaderno, cambiaste el filtro, re-ejecutaste, exportaste a PDF, lo enviaste por correo. Esta semana te han pedido lo mismo por trimestre. La cadena ya no escala, y lo sabes.
El agujero entre el cuaderno y la herramienta
El problema no es técnico. Tu modelo predice bien. Tu notebook está limpio. El problema es que has entregado un fichero, no una herramienta. Un fichero necesita a alguien que lo abra, que tenga Python instalado, que recuerde ejecutar las celdas en orden. Una herramienta necesita solo un navegador.
Esto lo hemos visto muchas veces en equipos de datos: los proyectos no fallan por el algoritmo, fallan por la adopción. El mejor modelo del mundo, encerrado en un .ipynb que vive en tu portátil, no aporta valor a nadie más que a ti. La pregunta no es “¿sabes programar en Python?”, sino “¿alguien que no sabe puede usar lo que has programado?”. Ahí entra Streamlit.
Streamlit es Python que se renderiza
Streamlit es un framework que convierte un script de Python en una aplicación web interactiva sin escribir una sola línea de HTML, CSS ni JavaScript. Tú escribes st.slider(...) y Streamlit renderiza un deslizador en el navegador. Tú escribes st.plotly_chart(fig) y Streamlit incrusta el gráfico. El modelo mental es: estás escribiendo un script, no una página web.
La sorpresa es lo corto que es el camino. Con menos de 30 líneas de Python puedes tener una app con sidebar, filtros, KPIs y un gráfico interactivo. Sin npm install, sin crear un package.json, sin pelearte con un bundler. Solo pip install streamlit, un fichero app.py y streamlit run app.py en la terminal.
Cada interacción del usuario es una llamada nueva a tu script. Para la mayoría de dashboards no necesitas gestionar estado entre reruns; si en algún momento lo necesitas —por ejemplo, para acumular puntos en un gráfico—, ahí está st.session_state.
Tu primera app en 30 minutos
El siguiente ejemplo usa el dataset Ames Housing —el mismo del libro— y resume el flujo completo: cargar datos, añadir un filtro en la barra lateral, mostrar una métrica y un scatter plot. Es la versión mínima publicable.
import streamlit as st
import pandas as pd
import plotly.express as px
@st.cache_data
def cargar_datos():
return pd.read_csv("house_prices.csv")
df = cargar_datos()
st.title("Análisis de Precios de Vivienda")
st.metric("Precio mediano", "$163,000", "+5%")
min_precio, max_precio = st.sidebar.slider(
"Rango de precio ($)",
int(df["SalePrice"].min()),
int(df["SalePrice"].max()),
(50_000, 300_000),
)
df_filtrado = df[df["SalePrice"].between(min_precio, max_precio)]
fig = px.scatter(df_filtrado, x="GrLivArea", y="SalePrice", color="OverallQual")
st.plotly_chart(fig)
Hay tres detalles que vale la pena señalar. Primero, st.metric muestra el número grande con un delta coloreado —los KPIs de toda la vida, en una línea. Segundo, st.sidebar.slider mete el filtro en la barra lateral, separando los controles del contenido. Tercero, en Streamlit los gráficos Plotly se renderizan con st.plotly_chart, nunca con fig.show() — en un script de Streamlit esa línea no produce ninguna salida en el navegador.
El modelo de ejecución: cuidado con el botón
Aquí está el detalle que pilla a casi todo el mundo la primera vez — yo también caí, te lo advierto. Streamlit vuelve a ejecutar el script entero de arriba abajo cada vez que el usuario toca un widget. Cambias el slider, todo el script corre de nuevo. Cambias el selectbox, todo el script corre de nuevo.
Esto no es un bug, es el modelo. Y tiene una consecuencia directa: si cargar el dataset cuesta tres segundos, tu app tarda tres segundos en responder a cada clic. La solución es @st.cache_data, un decorador que cachea el resultado de la función. La segunda vez que se llama, devuelve lo que ya tenía en memoria.
@st.cache_data
def cargar_datos():
return pd.read_csv("house_prices.csv")
Misma idea para entrenar modelos: @st.cache_resource para objetos pesados que no se pueden serializar (modelos de sklearn, conexiones a bases de datos). La regla es simple: lo que cuesta tiempo, se cachea. Lo que es barato, se recalcula.
De local a URL pública
Publicar es la parte que asusta, y resulta que es la más corta. El flujo de Streamlit Community Cloud es: subir el código a un repo público de GitHub, conectar el repo en streamlit.io/cloud, esperar dos minutos. El resultado es una URL pública que puedes mandar a quien sea, sin configurar DNS, sin preocuparte por certificados HTTPS, sin pelearte con un servidor.
Solo necesitas:
app.py— el script de Streamlitrequirements.txt— las dependencias (streamlit,pandas,plotly, …).streamlit/config.toml— opcional, para tema y configuración
La capa gratuita de Community Cloud es más que suficiente para un portfolio: CPU compartida, 1 GB de RAM, repos públicos. Si necesitas repo privado o más memoria hay planes de pago, pero rara vez hacen falta para un dashboard de datos.
El primer deploy tarda menos que prepararte un café. Los deploys siguientes, cuando haces git push a main, son automáticos. Es el mismo flujo mental de un Notion o un Google Doc: la herramienta vive en la nube, no en tu portátil.

Portfolio que se toca, no que se cuenta
Aquí está el motivo de fondo, el que separa a un candidato de otro en una entrevista. Un portfolio de datos típico es un PDF con capturas, o un GitHub lleno de notebooks que el reclutador no va a abrir. Una app de Streamlit desplegada es un enlace que cualquiera puede visitar, tocar, romper y entender en treinta segundos. La diferencia entre “hice un modelo de churn” y “publiqué una herramienta para predecir churn que mi equipo de retención usó durante tres meses” no es de párrafo en el CV — es de entrevista técnica.
He visto a gente llegar a la entrevista con la app abierta en una pestaña del navegador y soltar: “¿quieres probar el modelo en directo?”. Eso no se sustituye con un PDF de 30 páginas.
Los proyectos de datos no fracasan por el algoritmo, fracasan porque nadie llega a usarlos.
La UT09 — Dashboards y Comunicación de Resultados de Análisis de Datos con Python cubre el camino completo: Streamlit, Plotly y despliegue real.
¿Qué modelo en tu portátil lleva meses esperando a que alguien lo abra?