Buenas prácticas de análisis de datos
Hábitos de análisis reproducibles, vectorizados y con tipos de datos correctos que evitan números erróneos silenciosos en cuadernos y trabajos de producción.
Cómo usar esta lista
- Repasa A-D antes de enviar un informe o trabajo programado.
- Revisa los elementos en la revisión de PR para cualquier cambio que afecte a la ingesta, uniones o agregados.
- Vuelve a visitar después de incidentes (KPI incorrecto, OOM, filas duplicadas) y añade reglas específicas del equipo.
A - Ingesta y Tipos
- Leer con dtypes explícitos. Pasa
dtype,parse_datesyusecolsaread_csv; la inferencia oculta columnas de objeto. - Contar filas y nulos inmediatamente.
len(df),df.isna().sum()ydf.duplicated(subset=keys).sum()antes de las transformaciones. - Almacenar marcas de tiempo en UTC.
pd.to_datetime(..., utc=True)al cargar; convertir solo para visualización. - Preferir cadenas Arrow y categóricas.
string[pyarrow]ycategoryreducen el uso de RAM en claves de texto en pandas 2.2+. - Documentar la imputación de NA. Las medias/medianas son decisiones de modelado; regístralas en los metadatos del cuaderno o del trabajo.
B - Transformaciones y Vectorización
- Usar
.locpara asignaciones. Nunca encadenesdf[mask]["col"] = x; asigna en una sola llamada a.loc. - Preferir agregaciones integradas sobre apply.
groupby.aggy las expresiones de Polars superan a las UDF de Python por fila. - Establecer
observed=Trueen categóricas. Omitir niveles de categoría no utilizados en groupby/pivot de pandas 2.x. - Normalizar claves de cadena antes de las uniones.
str.strip()y un casing consistente evitan fusiones huérfanas. - Limitar o marcar valores atípicos; no eliminarlos silenciosamente. Los límites del dominio requieren la aprobación de los interesados.
C - Uniones y Agregados
- Asegurar los recuentos de filas alrededor de las fusiones. Las explosiones de muchos a muchos son el principal error de KPI.
- Usar
validate=en las fusiones.many_to_oneyone_to_onedetectan errores de cardinalidad de forma temprana. - Añadir
indicator=Trueen uniones izquierdas. Cuantificar las filas de dimensión no coincidentes antes de rellenar NA con cero. - Ordenar el índice de tiempo antes de re-muestrear/rodar. Las marcas de tiempo desordenadas producen ventanas basura.
- Nombrar explícitamente las agregaciones.
agg(total=("revenue", "sum"))con nombre supera a las columnas MultiIndex misteriosas.
D - Rendimiento y Reproducibilidad
- Medir la memoria con
deep=True.memory_usagesuperficial miente sobre las columnas de objeto. - Dividir o escanear archivos que exceden la RAM.
chunksize, poda de columnas de Parquet o Polarsscan_parquet. - Escribir Parquet intermedio con esquema. Ejecuciones posteriores más rápidas que re-analizar CSV.
- Fijar dependencias con archivos lock de uv. El comportamiento de pandas 2.2+ y Polars 1.x no debería variar entre el portátil y CI.
- Sembrar el muestreo aleatorio.
sample(random_state=42)ynumpy.random.default_rngpara auditabilidad.
Preguntas frecuentes
¿Cuál es el hábito de mayor impacto?
- Comprobaciones de recuento de filas y unicidad de claves en la ingesta y después de cada fusión.
- La mayoría de los errores de KPI de producción son de cardinalidad, no de matemáticas.
¿Cuándo es aceptable el apply de pandas?
- Solo para prototipos en muestras pequeñas.
- Reemplazar con operaciones vectorizadas antes de programar el trabajo.
¿Deben los cuadernos ser la fuente de verdad?
- Los cuadernos exploran; los scripts/módulos programados con pruebas envían los KPI.
- Extraer funciones una vez que la lógica se estabiliza.
¿Cómo pruebo un análisis?
- Fragmentos de CSV/Parquet de prueba en pytest con agregados esperados.
- Asegurar el diccionario de dtypes y los recuentos de filas, no solo los números finales.
¿Cuándo migrar a Polars?
- Después de que la optimización de dtypes de pandas y la división en fragmentos aún no cumplan el SLA o el presupuesto de RAM.
- Benchmarking de una ruta crítica antes de una reescritura completa.
¿Cómo comparto resultados con los interesados?
- Exportar gráficos y tablas con filtros documentados.
- Nunca edites Excel manualmente después de exportar; cambia el script.
¿Qué pasa con SQL en lugar de pandas?
- DuckDB/SQL sobresale cuando los datos ya residen en tablas de almacén.
- pandas sigue ganando para archivos locales pequeños y el rico ecosistema de Python.
¿Cómo manejo PII?
- Eliminar o hashear identificadores antes de que los cuadernos salgan de entornos seguros.
- Registrar listas de columnas, no muestras de filas, en los registros del trabajo.
¿Debería usar float32?
- Para características de ML y matrices numéricas grandes cuando el compromiso de precisión está documentado.
- Usar float64 para totales financieros a menos que se haya medido que es seguro.
¿Cómo versiono los conjuntos de datos?
- Rutas de Parquet direccionadas por contenido (
dt=2025-01-15/) más manifiesto JSON. - Nunca sobrescribas las entradas; escribe nuevas particiones.
Relacionado
- Conceptos básicos de análisis de datos - recorrido introductorio
- Limpieza y transformación de datos - política de dtypes y NA
- Uniones y fusiones - comprobaciones de cardinalidad
- Rendimiento y memoria - división en fragmentos y Arrow
- Validación y calidad de datos - puertas de esquema
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 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+ y uv 0.6+.