La última versión de JMP amplía la compatibilidad con Python introducida en JMP 18, centrándose en un aspecto fundamental del flujo de trabajo: el acceso a los datos. Al ampliar las operaciones de tablas de datos y la interoperabilidad entre Python y JSL, el acceso a los datos se vuelve sencillo y práctico.
¿Prefieres el video? Míralo aquí.
Operaciones de tabla de datos
La función jmp.from_dataframe() proporciona una manera eficiente de convertir tramas de datos externas en tablas de datos JMP. El protocolo de tramas de datos proporciona el mecanismo para convertir entre tramas de datos en memoria. Todos los objetos de tramas de datos compatibles con el protocolo de intercambio de tramas de datos pueden convertir entre tramas de datos en memoria. Ejemplos notables son pandas, polars e ibis.
El siguiente ejemplo muestra una transformación de un marco de datos de pandas en una tabla de datos JMP.

Asimismo, es igual de fácil transformar tablas de datos de JMP en otro tipo de biblioteca de marcos de datos compatible. Por ejemplo, de JMP a Pandas:

En JMP 18, jmp.DataTable solo ofrecía compatibilidad total con columnas numéricas y de caracteres. Ahora, todos los tipos de datos de columna de JMP son compatibles con Python. Otros objetos ofrecen compatibilidad con expresiones y estados de fila.
El objeto jmp.DataTable añade la propiedad row_states para permitir configurar los estados de fila de la tabla desde Python. Esto simplifica la posibilidad de copiar el conjunto de estados de fila a una columna o configurar los estados de fila de la tabla desde una columna.

Ahora se puede acceder al formato de columna de una tabla mediante col.format con una cadena o tupla, según el caso de uso. JMP 19 combina correctamente la representación de fecha y hora de JMP con la de Python: fechas de JMP en la tabla de datos, objetos de fecha y hora de Python desde código Python.

De manera similar, Python Get()/Python Send() ahora admite la transferencia perfecta de valores de fecha y hora entre Python y JSL.
Además de la capacidad de formatear columnas, Columnas también puede agregar fórmulas, utilizando col.formula con jmp.Expressions.

JMP 19 también permite la posibilidad de establecer jmp.Images como valores de columna de expresión.
Se pueden encontrar otras operaciones de tabla de datos no resaltadas utilizando el Índice de scripts en la categoría Python.
Interoperabilidad entre Python y JSL
Muchos flujos de trabajo aún requieren compatibilidad con JSL para realizar tareas específicas en JMP. Para optimizar el flujo de trabajo multilenguaje, se ha añadido compatibilidad para añadir, leer y modificar variables JSL desde Python. Actualmente, solo se admite a través de los espacios de nombres Global y Here. El siguiente ejemplo muestra cómo Python configura la variable JSL 'e' desde Python, luego usa JSL para configurar la variable here::pi e imprime el conjunto de variables globals::e desde Python, y finalmente imprime desde Python el conjunto de variables here::pi desde JSL.

Integración R
JMP 19 introduce compatibilidad inicial con R a través de Python mediante rpy2. JMP proporciona un nuevo módulo, jmpex , para admitir extensiones. R es la única extensión compatible actualmente con jmpex. Esta compatibilidad consiste en una API de Python similar a la API de R de JSL. El paquete jmpex es una capa de interfaz entre JMP y rpy2, que, a su vez, depende de R. Debe existir una versión de R instalada por el usuario en el sistema y la variable de entorno R_HOME debe estar configurada en la ubicación de R. Estos requisitos deben estar presentes antes de instalar jmpex o de llamar a R Init() por primera vez, debido a los requisitos del paquete jmpex.
La compatibilidad de JSL con R se ha restaurado en JMP 19 mediante el uso interno del paquete jmpex.
El siguiente ejemplo ilustra la nueva API de Python para R proporcionada por jmpex.

Cambios generales
La transición de Python 3.11 en JMP 18 a Python 3.13 en JMP 19 proporciona actualizaciones de seguridad durante todo el ciclo de vida de JMP 19. JMP 19 también ofrece una forma práctica de restablecer el entorno compartido de Python mediante jmp.reset(). También hay mejoras en jmputils:
- jmputils.__versión__
- jmputils.is_installed('paquete')
- jmputils.packages()
- jmputils.package_version('paquete')
Para mejorar la instalación de paquetes mediante scripts, jmputils.jpip() ahora devuelve el objeto subprocess.CompletedProcess de Python. Consulte la documentación de Python para obtener información sobre el objeto CompletedProcess.
Desusos
- Python Init()
- Término de Python()
- Control de Python()Remoto.
- Obtener gráficos() de Python Remoto.
- Término R()
- R Obtener gráficos()Obsoleto, no tiene efecto.
- R Control( Echo (bool) )ParámetrosAsíncrono( ),yInterrumpir( )
¿Que sigue?
JMP 18 se centró en construir una nueva base para soportar un flujo de trabajo nativo de Python dentro de JMP. Esta base comenzó solucionando los problemas más complejos de la integración de JMP y Python.
JMP 19 continúa desarrollando esta base, centrándose en el refinamiento y proporcionando una importante compatibilidad adicional con tablas de datos. Nuestro objetivo es ofrecer la misma capacidad para trabajar con tablas de datos desde Python que la disponible en JSL. Todos los tipos de columnas ahora son compatibles con Python. El formato de columnas y los estados de fila son accesibles y modificables desde scripts de Python.
La finalización de la compatibilidad con tipos de columna permitió la compatibilidad con el protocolo de marcos de datos portátiles. Se ha restaurado la conversión sencilla entre marcos de datos portátiles, incluyendo pandas y un objeto jmp.DataTable, lo que preserva el trabajo en memoria, sin recurrir a una copia CSV en el sistema de archivos.
Además, nos hemos centrado en mejorar la productividad, optimizando el comportamiento de nuestros objetos para que se comporten como un programador de Python esperaría. Por último, la nueva versión soluciona algunos problemas que se pasaron por alto en JMP 18 o que se agotó el tiempo de desarrollo antes del lanzamiento.
La integración con Python tiene un futuro prometedor. En JMP, estamos desarrollando nuestras propias capacidades de Python: la restauración de la conectividad con SAS, la compatibilidad con JSL R, una nueva API de Python para R y conectores de datos, todos ellos basados en la integración con Python.
Mirar hacia el futuro siempre es especulativo, pero hay algunas cosas que estamos investigando para su posible inclusión en futuros lanzamientos:
- Mejoras continuas en la compatibilidad con el editor de scripts.
- Soporte de JMP para entornos virtuales de Python.
- Mejora adicional en el soporte de manejo de paquetes, que incluye:
- Opciones de configuración para conectarse a repositorios corporativos o internos.
- Formas simplificadas de crear paquetes de sitios validados y bloqueados por un administrador del sitio.
- Soporte para generar cuadros de diálogo y ventanas desde Python que permiten crear gráficos e informes desde Python.
Sus sugerencias son muy apreciadas, ya que queremos centrarnos en las áreas que más mejorarán su flujo de trabajo.
Blog coescrito por @Paul_Nelson .
Esto es fantástico. JMP y Python son compañeros naturales, y lo hemos usado ampliamente en JMP v18. La implementación es increíblemente clara desde la perspectiva del usuario, y pude usarla casi de inmediato. Las actualizaciones de JMP v19 se ven fantásticas, especialmente los estados de fila, las fórmulas y el manejo de fecha y hora.
Algunos comentarios/sugerencias:
- Detener. Al ejecutar scripts de Python en JMP (v18+), si un script contiene un bucle infinito como "while True: pass", toda la sesión de JMP deja de responder y debe forzarse su cierre. Sería extremadamente útil que JMP ofreciera una forma de interrumpir o detener un script de Python en ejecución (como un botón de detención o un mecanismo de tiempo de espera) sin cerrar la aplicación.
- Incrustar. Sería útil que JMP permitiera incrustar scripts de Python en una tabla de datos (a menos que esto ya sea posible).
- Obtener la entrada del usuario. También sería útil que Python pudiera solicitar a JMP que emitiera un diálogo modal para obtener la entrada del usuario.
Obviamente, las fórmulas de columnas basadas en Python también serían increíbles, pero creo que es mucho pedir.
¡¡Felicitaciones a ti y a tu equipo, gran trabajo!!
Con respecto a
1. Detener. Ya existe la posibilidad de abortar el proceso. Esto depende de la inclusión de jmp.run_jsl('Wait(0);') dentro del bucle activo. Al devolver periódicamente el control a JMP, el mecanismo ESC normal permitirá cancelar el script.
2. Está en nuestras mentes que aún no es posible excepto como JSL que envuelve las llamadas JSL de Python.
3. En nuestra mente, pero puedes llamar al código del diálogo JSL mediante jmp.run_jsl(). Uno de los 18 ejemplos de JMP, el que realiza un hash MD5 de un directorio y crea una tabla de datos SQLite, hace exactamente eso: llama a jsl para un diálogo de selección de directorios desde el script de Python para proporcionar la ruta del directorio al script de Python.