Estoy construyendo un flujo de trabajo para crear modelos de aprendizaje automático (en mi caso, usando Python pandas
y sklearn
paquetes) a partir de datos extraídos de una base de datos muy grande (aquí, Vertica a través de SQL y pyodbc
), y un paso crítico en ese proceso implica que faltan valores de los predictores. Esto es sencillo dentro de una única plataforma de análisis o estadísticas, ya sea Python, R, Stata, etc., pero tengo curiosidad sobre dónde ubicar mejor este paso en un flujo de trabajo multiplataforma.
Es bastante simple hacer esto en Python, ya sea con la sklearn.preprocessing.Imputer
clase, usando el pandas.DataFrame.fillna
método o a mano (dependiendo de la complejidad del método de imputación utilizado). Pero dado que voy a usar esto para docenas o cientos de columnas en cientos de millones de registros, me pregunto si hay una forma más eficiente de hacerlo directamente a través de SQL con anticipación. Además de las eficiencias potenciales de hacer esto en una plataforma distribuida como Vertica, esto tendría el beneficio adicional de permitirnos crear una tubería automatizada para construir versiones "completas" de tablas, por lo que no necesitamos completar un nuevo conjunto de valores perdidos desde cero cada vez que queremos ejecutar un modelo.
No he podido encontrar mucha orientación sobre esto, pero imagino que podríamos:
- crear una tabla de valores sustitutos (p. ej., media / mediana / modo, ya sea global o por grupo) para cada columna incompleta
- unirse a la tabla de valores sustitutos con la tabla original para asignar un valor sustituto para cada fila y columna incompleta
- use una serie de declaraciones de casos para tomar el valor original si está disponible y el valor sustituto de lo contrario
¿Es esto algo razonable para hacer en Vertica / SQL, o hay una buena razón para no molestarse y simplemente manejarlo en Python? Y si es esto último, ¿hay un caso sólido para hacer esto en pandas en lugar de sklearn o viceversa? ¡Gracias!