9 · Gráficos, cargas y un panel pulido
Completa el panel: `st.line_chart`/`st.bar_chart`/`st.pyplot` para visualizar, `st.file_uploader` para puntuar por lotes un CSV cargado, y `st.download_button` para devolver los resultados. El flujo completo — cargar un CSV → puntuar cada fila → descargar el archivo puntuado — es el patrón cotidiano de predicción por lotes en Streamlit.
Los gráficos (`st.line_chart`/`st.bar_chart`/`st.pyplot`) convierten predicciones en un panel legible, y el bucle de puntuación por lotes es el caballo de batalla: `st.file_uploader` acepta un CSV → leerlo en un DataFrame → `model.predict` sobre TODAS las filas a la vez → mostrar + ofrecer el archivo puntuado vía `st.download_button`. Cargar → puntuar por lotes → descargar es el patrón cotidiano con-humano-en-el-bucle para puntuar muchos registros sin escribir una API.
Sin esto:
Sin gráficos el panel es solo números; y sin el bucle cargar→puntuar→descargar, un usuario que necesita puntuar toda una hoja de clientes tendría que llamar la API fila por fila en vez de soltar un solo CSV.
La lección 7 puntuó un cliente; la lección 8 hizo la app rápida y con disposición. Esta lección la convierte en un panel pulido: visualiza predicciones con gráficos, y deja que un usuario puntúe por lotes todo un CSV cargándolo y descargando el resultado puntuado — sin API, sin código, solo arrastrar-soltar-descargar.
Gráficos — una línea cada uno. Los gráficos integrados de Streamlit toman un DataFrame o array y renderizan un gráfico interactivo:
st.line_chart(df)— tendencias sobre un índice (una probabilidad en el tiempo, una métrica por día).st.bar_chart(df)— comparaciones categóricas (predicciones por segmento).st.pyplot(fig)— inserta cualquier figura de Matplotlib cuando necesitas control total (un histograma de scores de churn, una matriz de confusión). Construyes elfigcomo siempre y se lo pasas ast.pyplot.
Un gráfico convierte una columna de probabilidades crudas en algo que un interesado puede leer de un vistazo — el punto entero de un panel de cara al humano.
st.file_uploader — toma un archivo del usuario. uploaded = st.file_uploader("Cargar CSV de clientes", type="csv") renderiza una caja de arrastrar-y-soltar y devuelve un objeto tipo-archivo una vez que el usuario elige un archivo (o None antes de eso). Se lo pasas directo a pd.read_csv(uploaded) para obtener un DataFrame — toda la hoja del usuario, en tus manos.
Puntúa todo el DataFrame de una vez. Esta es la eficiencia clave: el model.predict de scikit-learn es vectorizado — dale un array 2-D de muchas filas y devuelve muchas predicciones en una sola llamada. Así que no iteras fila por fila; seleccionas las columnas de características en el orden de entrenamiento, pasas el bloque entero, y obtienes una predicción por fila: df["prediction"] = model.predict(df[FEATURES]). Una llamada puntúa todo el archivo.
st.download_button — devuelve los resultados. Una vez que agregaste una columna de predicción, el usuario quiere el archivo de vuelta. st.download_button("Descargar CSV puntuado", df.to_csv(index=False), "scored.csv") renderiza un botón que descarga los bytes que le des — aquí el DataFrame puntuado como CSV. Eso cierra el bucle.
El patrón completo: cargar → puntuar por lotes → descargar. En conjunto: el usuario suelta un CSV, lo lees, puntúas cada fila con un predict vectorizado, muestras un gráfico y una tabla de vista previa, y ofreces un botón de descarga para el archivo puntuado. Es el flujo cotidiano de "puntúa mi hoja" — quien no programa obtiene predicciones masivas con cero ingeniería, y nunca tuviste que construir ni llamar una API para ello.
La celda de solo-lectura ensambla el panel pulido: una carga, una puntuación por lotes de una llamada, un gráfico, una vista previa, y un botón de descarga.
Un panel de puntuación por lotes en Streamlit: `st.file_uploader` lee un CSV, un `model.predict_proba` vectorizado puntúa cada fila, `st.bar_chart`/`st.dataframe` visualizan, y `st.download_button` devuelve el archivo puntuado.
En el panel de puntuación por lotes de Streamlit, ¿cuál es el flujo correcto para puntuar una hoja de clientes cargada?
- Los gráficos de Streamlit son una línea cada uno: `st.line_chart`/`st.bar_chart` toman un DataFrame, y `st.pyplot(fig)` incrusta cualquier figura de Matplotlib para control total.
- Puntúa por lotes con UN `model.predict(df[FEATURES])` vectorizado sobre todo el DataFrame — nunca un bucle por fila, que es más lento e inútil.
- El bucle cargar→puntuar-por-lotes→descargar (`st.file_uploader` → puntuar → `st.download_button`) deja a quien no programa puntuar toda una hoja sin API.
Puntuar por lotes un CSV mediante una carga de Streamlit es cómo los analistas obtienen rutinariamente predicciones masivas — suelta un archivo de registros, descárgalo con una columna de predicción, sin ingeniería de por medio.
Si lo quitas: Sin el bucle de cargar-y-puntuar, un usuario con una hoja de clientes no tiene forma de obtener predicciones masivas salvo llamar la API una vez por fila a mano.