En nuestro afán por aprovechar las amplias capacidades de Python en JMP, nos enfrentamos al reto de integrar la flexibilidad de Python con la experiencia de usuario intuitiva e interactiva de JMP. Antes de JMP 18, lo lográbamos mediante una solución alternativa: ejecutar Python en un servidor para evitar la engorrosa integración con Python en JMP. Sin embargo, el lanzamiento de JMP 18 reintrodujo la integración con Python, simplificando este proceso.
Partiendo de nuestra idea inicial de permitir a los usuarios de JMP aprovechar Python sin necesidad de conocimientos de programación, desarrollamos JMPyFacade (JMPy). Esta herramienta ofrece una interfaz familiar, similar a la de JMP, para ejecutar servicios Python predefinidos mediante una interfaz de usuario generada dinámicamente, abstrayendo al mismo tiempo el código subyacente de Python y JSL.
En esta presentación, exploramos la arquitectura técnica de JMPyFacade y demostramos cómo conecta eficazmente JMP y Python. Los asistentes aprenden cómo aprovechar Python en JMP para un análisis de datos eficiente y atractivo.
Hola, bienvenidos a mi presentación en póster sobre la integración de JMP y Python para un análisis fluido y atractivo. Me llamo Jarmo Hirvonen y trabajo en Murata, Finlandia. En este póster, explicaré por qué deberían usar Python en JMP o integrarlo en JMP. Algunos aspectos importantes sobre la integración, y una de las aplicaciones que hemos desarrollado en Murata, Finlandia, mi colega Eero y yo, que la utiliza. Empecemos por explicar por qué utilizan esta función en JMP.
JMP es una herramienta muy visual e interactiva con buenas capacidades analíticas. Por otro lado, Python es básicamente el lenguaje de programación por excelencia para muchas tareas relacionadas con datos. Cuenta con numerosas bibliotecas consolidadas, y es posible que su empresa incluso tenga sus propias capacidades en Python.
Lo veo desde dos perspectivas. Primero, algunos usuarios tendrán acceso a funciones que no están disponibles de forma nativa en JMP, como algunos modelos de aprendizaje automático (Torch, por ejemplo), y luego, acceso a tipos de archivos que de otro modo no podrían usar en JMP.
Un ejemplo de ello son los archivos Parquet, que permiten abrirlos en Python y luego integrarlos con JMP. Los usuarios que primero usan Python tienen acceso a las herramientas visuales e interactivas de JMP, que pueden utilizar directamente en JMP o de forma integrada con Python. Por supuesto, también hay algunas capacidades analíticas que solo se encuentran en JMP. Cabe destacar que, con respecto a esta integración entre JMP y Python, Python se instala con JMP 18.
La carga inicial por instancia de JMP es un poco lenta. Es decir, la carga inicial del lugar en la instancia de JMP tarda un poco, pero en la siguiente carga, si no se cierra JMP por completo, es más rápida. Quizás deba tener esto en cuenta si solo está realizando algo muy pequeño. Podría valer la pena intentar hacerlo solo con JSL; es más rápido.
La gestión e instalación de paquetes a veces puede causar problemas, aunque existe documentación al respecto. Sin embargo, a veces puede ser un poco complicado de resolver. Solo tienes un entorno, así que si estás acostumbrado a trabajar con entornos virtuales, actualmente no puedes hacerlo en la integración de trabajos. Debes comprender en cierta medida las conversiones de tipos de datos de JSL y Python, pero hay documentación en alguna página web al respecto. El alcance puede ser confuso, o incluso un poco confuso. Python es básicamente de alcance global, y dependiendo de cómo nombres tus variables, pueden confundirse entre diferentes scripts, etc.
Finalmente, en mi opinión, quizás uno de los problemas más importantes es que la depuración y el desarrollo en Python pueden ser una experiencia algo molesta, y puede ser difícil entrar en ritmo. Esto se debe principalmente a que no se puede reiniciar Python en JMP ni el kernel, y se termina en este tipo de "ciclo de desarrollo". Se desarrolla en Python, luego se quiere probar y se sospecha que hay algo que se debe limpiar en algunas variables, por ejemplo.
La única forma de hacerlo actualmente es cerrar la instancia de JMP, volver a ejecutar los JMP, volver a cargar todo y, a continuación, probar el código. Esto no es un ciclo; básicamente, se interrumpe aquí y hay que reiniciar todo desde el principio. Interrumpe el flujo. Esto causa frustración, pero se puede mitigar un poco, dependiendo de cómo se escriba el código Python.
En cuanto a nuestra aplicación, ¿qué es JMPyFacade? El nombre se debe a la forma en que presenta el complejo código JMP y Python tras una interfaz de usuario bastante similar y familiar. Incorpora control de versiones, lo que permite a los usuarios de JMP acceder a las funciones de Python predeterminadas. A estos servicios los llamamos «servicios». Estos abarcan desde la creación de conjuntos de datos muy simples hasta modelos de aprendizaje mucho más complejos.
Lo que queremos con esto es dar acceso a nuestros usuarios de JMP para que utilicen las capacidades de Python sin que sepan que lo están usando. Anteriormente, teníamos algo similar, pero en ese caso, utilizamos el servidor para evitar la integración de JMP con Python, ya que antes era un poco difícil de usar. Ahora, con JMP18, podemos usar la integración nativa y funciona bastante bien.
El flujo de la aplicación, cuando el usuario la ejecuta, ejecuta el complemento y esta comprueba si está actualizado. Si no lo está, se actualiza y el usuario vuelve a ejecutar el complemento. Si no se encuentran actualizaciones, se inicializa LS Python en JMP. El propósito de este paso es básicamente crear la actualización de los pedidos. Si el usuario no la ha ejecutado, podría causar problemas si no existen.
Una vez inicializados, comprobaremos desde nuestra administración de paquetes si hay paquetes que deban actualizarse. Si es necesario, los actualizaremos. Si no hay nada que actualizar, continuaremos. Verificamos si el usuario tiene una tabla abierta. Si no hay ninguna, cerramos el complemento e informamos al usuario que debe abrir una tabla antes de ejecutarlo. Esto se hace actualmente porque solo admitimos una tabla estática.
Luego, cuando el usuario tiene una tabla abierta y desea analizarla, importamos los paquetes. Si surge un problema, se detiene y se muestra el registro del fallo. Si la operación es correcta, inicializamos la interfaz de usuario, la creamos y los usuarios pueden empezar a usar la herramienta. Si la interfaz de usuario ya existe en la instancia de JMP, simplemente la traemos al frente sin inicializar nada.
Un poco sobre cómo funciona en segundo plano, utilizamos tipos de datos, clases JMP y luego, en el lado de Python, también el paquete Pydantic para crear los modelos que usamos y para la validación de tipos y datos.
Aquí tenemos un ejemplo de HDBSCAN. Si tomamos como ejemplo este argumento de características, se trata de una lista de cadenas, un campo con una longitud mínima de uno y que utiliza el esquema JSON (columnas numéricas). Cuando JMP lo obtiene, sabe cómo crear este tipo de clase. Por lo tanto, se encontrará en un botón, un cuadro de lista de columnas. El usuario debe ingresar un solo valor numérico (al menos una columna numérica) para que esto funcione. También existen diferentes tipos de elementos para diferentes tipos de datos: enteros, 8 casillas numéricas, y luego tenemos valores booleanos (casillas de verificación), etc.
Cuando los usuarios estén listos para ejecutar el servicio, completan las columnas, hacen clic en el botón "Ejecutar servicio". En este punto, el código JMP creará un subconjunto de los datos (estas columnas) y tomará las columnas no excluidas. Estas se utilizan al llamar a la función de Python. Esto facilita la gestión en Python, por eso lo hacemos así.
Python ejecutará su algoritmo y actualizará los valores del subconjunto. Cuando el subconjunto y Python devuelvan valores, JMP indica: "Bien, ahora podemos actualizar la tabla original". Actualizará la tabla, cerrará el subconjunto y creará scripts de tabla y propiedades de columna en la tabla original. Cada vez que el usuario ejecuta un servicio, se crearán nuevas columnas en la tabla si hay columnas que crear.
A continuación, algunos ejemplos de uso. Este es un ejemplo básico: el usuario ejecuta el complemento y este lo verifica desde el control de versiones. En este caso, el usuario desea ejecutar tSNE desde este complemento. Para ello, selecciona tSNE en el panel izquierdo, introduce las columnas y consulta la documentación oficial de tSNE si, por ejemplo, desea saber cómo funciona, qué hace y cuáles son sus parámetros. Cuando el usuario está listo para ejecutar el servicio, hace clic en el botón "Ejecutar servicio" y se crean nuevas columnas en la tabla JMP. Ahora, puede trabajar con ellas como si fuera un botón JMP normal.
Luego, también vemos el script del informe; en este caso, solo se trata de los parámetros de entrada. Aquí se muestran ejemplos un poco más complejos, excesivos o extensos. En esta demostración, se utiliza un modo interactivo. En mi opinión, es una de las mejores funciones que tenemos. Estos no crean siempre columnas nuevas, sino que actualizan las columnas estáticas y vuelven a ejecutar inmediatamente sus algoritmos de Python cuando el usuario modifica cualquier valor en la interfaz. Por ejemplo, se pueden usar para el análisis de datos de exportación o para ajustar algoritmos.
Aquí, el usuario simplemente pulsa la flecha hacia arriba del teclado y el algoritmo de Python se ejecutará repetidamente. La agrupación en clústeres cambiará según el usuario cuando actualice los valores. A medida que se generan más vistas, los componentes cambian, por lo que se obtendrán clústeres totalmente diferentes según los valores. Se podrían modificar los valores interactivamente, determinar cuáles son los más adecuados en este caso y luego, quizás, volver a Python y usarlos allí, por ejemplo.
Luego, contamos con este servicio de importancia de características que utiliza múltiples algoritmos y utiliza los valores de Shapley para determinar cuáles podrían ser los más importantes para modelar o predecir algo. Ejecutamos los modelos, obtenemos los valores de Shapley [inaudible 00:10:32] y, además, la clasificación de nuestros algoritmos seleccionados. En este caso, RGBM, XGBoost y AdaBoost. Desde aquí, un usuario podría copiar y pegar valores y comenzar a modelar en JMP usando estas columnas.
Finalmente, algunos trabajos futuros para esta herramienta incluyen la adición de compatibilidad con la tabla dinámica. Ahora contamos con una tabla estática, más servicios, análisis de imágenes y nuestros propios modelos de aprendizaje automático personalizados. Se mejorará la interactividad, de modo que Python creará o actualizará scripts gráficos directamente. Se exportarán e importarán modelos de Python. Se utilizarán las excelentes capacidades DOE de JMP para el ajuste fino de parámetros. Se crearán pipelines para ejecutar múltiples servicios en secuencia. Se mejorarán las funciones dinámicas disponibles y, según las novedades de JMP19, se realizarán posibles refactorizaciones para mejorar aún más la herramienta. También se podría discutir la posibilidad de abrir el código fuente para que participemos más personas en el desarrollo de esta herramienta. Gracias.