He intentado descifrar una respuesta a esta pregunta durante muchos meses mientras aprendía pandas. Utilizo SAS para mi trabajo diario y es excelente por su soporte fuera del núcleo. Sin embargo, SAS es horrible como una pieza de software por muchas otras razones.
Un día espero reemplazar mi uso de SAS con python y pandas, pero actualmente no tengo un flujo de trabajo fuera de núcleo para grandes conjuntos de datos. No estoy hablando de "big data" que requiere una red distribuida, sino archivos demasiado grandes para caber en la memoria pero lo suficientemente pequeños como para caber en un disco duro.
Mi primer pensamiento es usar HDFStore
para mantener grandes conjuntos de datos en el disco y extraer solo las piezas que necesito en los marcos de datos para su análisis. Otros han mencionado a MongoDB como una alternativa más fácil de usar. Mi pregunta es esta:
¿Cuáles son algunos flujos de trabajo de mejores prácticas para lograr lo siguiente?
- Carga de archivos planos en una estructura de base de datos permanente en disco
- Consultar esa base de datos para recuperar datos para alimentar una estructura de datos de pandas
- Actualización de la base de datos después de manipular piezas en pandas
Los ejemplos del mundo real serían muy apreciados, especialmente de cualquiera que use pandas en "datos grandes".
Editar: un ejemplo de cómo me gustaría que esto funcione:
- Importe iterativamente un archivo plano grande y guárdelo en una estructura de base de datos permanente en el disco. Estos archivos suelen ser demasiado grandes para caber en la memoria.
- Para usar Pandas, me gustaría leer subconjuntos de estos datos (generalmente solo unas pocas columnas a la vez) que pueden caber en la memoria.
- Crearía nuevas columnas realizando varias operaciones en las columnas seleccionadas.
- Entonces tendría que agregar estas nuevas columnas a la estructura de la base de datos.
Estoy tratando de encontrar una forma práctica recomendada de realizar estos pasos. Al leer enlaces sobre pandas y pytables parece que agregar una nueva columna podría ser un problema.
Editar - Respondiendo a las preguntas de Jeff específicamente:
- Estoy construyendo modelos de riesgo de crédito al consumo. Los tipos de datos incluyen teléfono, número de seguro social y características de la dirección; valores de propiedad; información despectiva como antecedentes penales, quiebras, etc. Los conjuntos de datos que uso todos los días tienen casi 1,000 a 2,000 campos en promedio de tipos de datos mixtos: variables continuas, nominales y ordinales de datos numéricos y de caracteres. Raramente agrego filas, pero realizo muchas operaciones que crean nuevas columnas.
- Las operaciones típicas implican combinar varias columnas usando lógica condicional en una nueva columna compuesta. Por ejemplo,
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'
. El resultado de estas operaciones es una nueva columna para cada registro en mi conjunto de datos. - Finalmente, me gustaría agregar estas nuevas columnas a la estructura de datos en disco. Repetiría el paso 2, explorando los datos con tablas de referencias cruzadas y estadísticas descriptivas tratando de encontrar relaciones interesantes e intuitivas para modelar.
- Un archivo de proyecto típico suele ser de aproximadamente 1 GB. Los archivos están organizados de tal manera que una fila consiste en un registro de datos del consumidor. Cada fila tiene el mismo número de columnas para cada registro. Este siempre será el caso.
- Es bastante raro que yo subconjunto por filas al crear una nueva columna. Sin embargo, es bastante común para mí subconjuntar en filas al crear informes o generar estadísticas descriptivas. Por ejemplo, podría querer crear una frecuencia simple para una línea de negocios específica, por ejemplo, tarjetas de crédito minoristas. Para hacer esto, seleccionaría solo aquellos registros donde la línea de negocio = minorista, además de las columnas sobre las que deseo informar. Sin embargo, al crear nuevas columnas, extraería todas las filas de datos y solo las columnas que necesito para las operaciones.
- El proceso de modelado requiere que analice cada columna, busque relaciones interesantes con alguna variable de resultado y cree nuevas columnas compuestas que describan esas relaciones. Las columnas que exploro generalmente se hacen en pequeños conjuntos. Por ejemplo, me enfocaré en un conjunto de, digamos, 20 columnas que solo tratan los valores de las propiedades y observaré cómo se relacionan con el incumplimiento de un préstamo. Una vez que se exploran y se crean nuevas columnas, luego paso a otro grupo de columnas, digo educación universitaria y repito el proceso. Lo que estoy haciendo es crear variables candidatas que expliquen la relación entre mis datos y algunos resultados. Al final de este proceso, aplico algunas técnicas de aprendizaje que crean una ecuación a partir de esas columnas compuestas.
Es raro que alguna vez agregue filas al conjunto de datos. Casi siempre crearé nuevas columnas (variables o características en estadísticas / lenguaje de aprendizaje automático).