Tengo un problema de gestión de datos científicos que parece general, pero no puedo encontrar una solución existente o incluso una descripción de la misma, que hace mucho tiempo me desconcertó. Estoy a punto de embarcarme en una importante reescritura (Python), pero pensé en lanzar una última vez para las soluciones existentes, así puedo descartar la mía y volver a la biología, o al menos aprender un lenguaje apropiado para mejorar la búsqueda de Google. .soluciones python para gestionar el gráfico de dependencia de datos científicos por valores de especificación
Problema: Tengo atributos de datos caros (de horas a días para calcular) y grandes (GB) que normalmente se crean como transformaciones de uno o más atributos de datos. Necesito hacer un seguimiento exacto de cómo se construyen estos datos para poder reutilizarlos como entrada para otra transformación si se ajusta al problema (construido con los valores de especificación correctos) o para construir nuevos datos según sea necesario. Aunque no debería importar, normalmente empiezo con información de biología molecular algo heterogénea de 'valor agregado', por ejemplo, genomas con genes y proteínas anotados por otros procesos por otros investigadores. Necesito combinar y comparar estos datos para hacer mis propias inferencias. A menudo se requieren varios pasos intermedios, y estos pueden ser costosos. Además, los resultados finales pueden convertirse en la entrada para transformaciones adicionales. Todas estas transformaciones se pueden realizar de múltiples maneras: restringir con diferentes datos iniciales (por ejemplo, usar diferentes organismos), usar diferentes valores de parámetros en las mismas inferencias, o usar diferentes modelos de inferencia, etc. Los análisis cambian frecuentemente y se basan en otros de formas no planificadas. Necesito saber qué datos tengo (qué parámetros o especificaciones lo definen completamente), ambos para poder reutilizarlos si corresponde, así como para la integridad científica general.
Mis esfuerzos en general: Diseño mis clases de python con el problema de la descripción en mente. Todos los atributos de datos construidos por un objeto de clase se describen mediante un único conjunto de valores de parámetros. Llamo a estos parámetros o especificaciones definitorias el 'def_specs', y estos def_specs con sus valores la 'forma' de los datos atts. El estado de parámetros global completo para el proceso puede ser bastante grande (por ejemplo, un centenar de parámetros), pero los datos de atts proporcionados por cualquier clase requieren solo un pequeño número de estos, al menos directamente. El objetivo es verificar si los datos de configuración anteriores son apropiados probando si su forma es un subconjunto del estado de parámetro global.
Dentro de una clase es fácil encontrar las def_specs necesarias que definen la forma mediante el examen del código. El problema surge cuando un módulo necesita datos de otro módulo. Estos datos tendrán su propia forma, tal vez pasados como argumentos por el objeto llamante, pero más frecuentemente filtrados del estado de parámetro global. La clase de llamada se debe aumentar con la forma de sus dependencias para mantener una descripción completa de sus datos. En teoría, esto podría hacerse manualmente examinando el gráfico de dependencia, pero este gráfico puede ser profundo, y hay muchos módulos, que estoy constantemente cambiando y agregando, y ... Soy demasiado flojo y descuidado para hacerlo. mano.
Por lo tanto, el programa descubre dinámicamente la forma completa de los datos atts mediante el seguimiento de llamadas a los atributos de otras clases y devolviendo su forma a la (s) llamada (s) mediante una pila administrada de llamadas __get__
. Mientras reescribo, encuentro que necesito controlar estrictamente el acceso de atributos a mis clases de compilador para evitar que la información arbitraria influya en los datos. Afortunadamente, Python lo está haciendo fácil con descriptores.
Guardo la forma de los datos atts en un db para que pueda consultar si ya existen los datos apropiados (es decir, su forma es un subconjunto del estado del parámetro actual). En mi reescritura me estoy moviendo de mysql a través de la gran SQLAlchemy a un objeto db (ZODB o couchdb?) Como la tabla para cada clase tiene que ser alterada cuando se descubren def_specs adicionales, lo cual es un problema, y porque algunas de las def_specs son listas o dictados de pitón, que son un dolor de traducir a sql.
No creo que esta gestión de datos pueda separarse de mi código de transformación de datos debido a la necesidad de un estricto control de atributos, aunque intento hacerlo todo lo posible. Puedo usar las clases existentes envolviéndolas con una clase que proporcione sus def_specs como atributos de clase, y administración de db a través de descriptores, pero estas clases son terminales en el sentido de que no se puede descubrir más la forma de dependencia adicional.
Si la gestión de datos no puede separarse fácilmente de la construcción de datos, supongo que es poco probable que exista una solución lista para usar, sino mil soluciones específicas. Tal vez hay un patrón aplicable? Agradecería cualquier sugerencia sobre cómo buscar o describir mejor el problema. Para mí, parece un problema general, aunque manejar datos profundamente en capas es tal vez en desacuerdo con los vientos dominantes de la web.
Su descripción de los requisitos para los atributos de datos me recuerda vagamente las diapositivas "Trees!", "Structural Sharing" de http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey de Rich Hickey (Clojure) 0:41:10 – jfs
Gracias por la sugerencia: parece profunda, así que tendré que dedicarle algo de tiempo. – ricopan
Ok observé la conversación y asimilé bastante de una manera general. Nunca había pensado en el tiempo explícitamente. Viniendo de mi problema específico, he visto la necesidad de hacer que mis objetos actúen más como funciones que proporcionan objetos inmutables como la única manera de garantizar la integridad de los datos con 'formas' conocidas. Solo había pensado en la concurrencia un poco, pero reforzaba la idea de que mis clases esencialmente tenían que actuar como funciones y tener un estricto control de atributos. Gracias de nuevo. Tengo que apegarme a lo práctico, pero eso me da algunas ideas y terminología para usar, y un poco de fe. – ricopan