Esta presentación describe las nuevas e importantes actualizaciones del soporte de JMP 18 para Python, que proporciona una integración mucho más estrecha con Python y una experiencia de usuario significativamente más centrada en Python. En JMP 18, podrá:
Estas capacidades de JMP, disponibles para Python, se ampliarán con el tiempo, pero actualmente nos centramos en la funcionalidad crítica y la compatibilidad con datos en memoria. En esta presentación, podrá conocer de primera mano los cambios y su justificación, así como ver las nuevas funcionalidades disponibles para los usuarios de JMP. Se analiza la extensibilidad y la capacidad de importación de datos mediante paquetes Python externos, y se demuestra el acceso a las GPU a través de la interfaz Python utilizando dichos paquetes.
Hola, soy Paul Nelson. Estoy aquí para hablarles de JMP, Python y nuestros próximos pasos. Tras una de las presentaciones del año pasado, decidimos que podíamos mejorar. JMP y Python tenían margen de mejora, y de eso hablaré aquí.
Los mayores desafíos que enfrentaban los clientes con JMP versiones 14 a 17 eran lograr que la compatibilidad con Python funcionara. Si funcionaba, simplemente funcionaba bien. Pero con demasiada frecuencia, no era así. La gran cantidad de distribuciones de Python y los diferentes entornos dificultaban nuestras pruebas.
Anaconda a veces funcionaba en Windows, y los entornos virtuales de Python también. Debido a que cada usuario tenía una versión diferente de Python, un script ni siquiera podía depender de una versión común de Python en el entorno del usuario.
Editar código Python en el editor JSON era difícil y desagradable. En un lenguaje donde los bloques de código están delimitados por espacios, pegarlos como una cadena en JSL se vuelve complicado. La falta de informes de errores en las versiones antiguas de JMP de Python dificultaba la depuración de los scripts de Python.
Finalmente, la transferencia de tablas y matrices de datos se realizó a través del sistema de archivos, y en el caso de las tablas de datos, se utilizó un archivo CSV, lo cual resulta lento si se manejan grandes cantidades de datos. Con datos grandes funciona bien, pero con datos aún mayores, el proceso es lento.
Nuestra visión es garantizar que la integración con Python funcione sin problemas, sin necesidad de configuración. Para ello, hemos incluido Python versión 3.115 y JMP 18.0, instalados como parte de JMP. Se trata de un entorno común, y todos los usuarios tendrán la misma versión de Python con la misma versión de JMP.
Hemos ido más allá y nos hemos asegurado de que la transferencia de datos entre JSL y Python se realice directamente en memoria, sin acceso a la misma mediante copia. Hemos creado un entorno atractivo y productivo para los programadores de Python. Ahora también contamos con un editor de scripts de Python con resaltado de sintaxis y resaltado de color en el código.
Puedes ejecutar scripts de Python puro directamente desde el editor de scripts y, dentro del entorno de Python, acceder directamente a los datos de JMP y al registro. Además, puedes llamar a JSL y acceder a los datos desde Python. Hemos mejorado significativamente la notificación de errores en el registro de JMP y en el registro integrado.
Ahora que es un entorno común, podemos probarlo y verificarlo. Nuestro entorno es el mismo que debería ver. Hemos añadido una categoría completa de Python en el Índice de scripts para explicar y mostrar ejemplos de lo que ahora está disponible con el paquete JMP y otros paquetes de utilidades.
Por otro lado, esto nos permite ampliar las capacidades de JMP mediante la extensa biblioteca de paquetes de Python. No pretendemos crear una alternativa idéntica a JSL, sino proporcionar un entorno familiar y productivo para la programación en Python dentro de JMP.
Esto es modernización, una renovación y una revisión completa. Algunas de las decisiones de diseño originales para la integración de Python en JMP resultaron limitantes. Hemos hecho todo lo posible para minimizar los problemas derivados del cambio, al tiempo que proporcionamos una base sólida y estable para el futuro.
Se espera que el problema se limite a esta transición a JMP. Lo fundamental es que ahora solo admitimos la versión de Python que viene incluida con JMP. Imagínelo como un entorno virtual privado de JMP.
Otro cambio en los scripts es que hemos modificado la forma en que Python envía una tabla de datos. Ahora crea un objeto de tabla de datos JMP. Esto permite el acceso en tiempo real a la tabla de datos JMP. La copia en memoria permite editar y modificar la tabla existente. Ya no se trata de una copia.
En JMP versiones 14 a 17, se creaba un objeto DataFrame de pandas copiando los datos a través de un archivo CSV temporal en el sistema de archivos. Para grandes volúmenes de datos, la exportación a CSV se vuelve muy lenta y el proceso se complica. Además, existe el problema de la posible pérdida de precisión al convertir de un formato binario a uno de texto y viceversa.
Si realmente necesitas la misma funcionalidad, hemos incluido un DT para pandas Python en los archivos de ejemplo que proporciona dos funciones de pandas. Funciona como lo hacía internamente antes: crea un archivo CSV temporal e indica a pandas que lo importe.
También hay un ejemplo de JMP a pandas que muestra cómo crear un DataFrame de pandas en memoria a partir de un objeto DataTable de JMP que construye una columna en pandas con una columna de JMP a la vez.
La función Send Matrix de Python era otra que solía escribir a través del sistema de archivos. Escribía un archivo de números de doble precisión para que NumPy lo leyera. Ahora, esto se realiza internamente a través de la memoria, y se trata de una referencia directa a la matriz en lugar de una copia.
La mayor parte de la API de JSL para Python permanece intacta. Los cambios consistieron principalmente en eliminar argumentos y funciones obsoletas que se utilizaban para configurar la compatibilidad original con Python y así seleccionar una versión específica de Python.
La única API que se eliminó fue la función de Python para obtener gráficos, que recuperaba una imagen de Matplotlib, y en nuestro índice de scripts tenemos un ejemplo que muestra exactamente cómo hacer lo mismo que JMP hacía internamente con solo JSL y código Python. Muéstralo ya. Veamos. Salgamos de la demostración.
Aquí tenemos JMP. Una de las cosas que quiero mostrarles es que verán íconos de Python en las barras de herramientas y en el menú Archivo > Nuevo tenemos Script JSON, pero ahora tenemos Nuevo Script Python. Abriremos el editor de scripts de Python.
Podemos usar el registro incrustado. Tenemos un paquete de importación de JMP. Importar JMP. Nos hemos esforzado por incluir cadenas de documentación de Python para que puedas ejecutar `help JMP Python`. Podemos ejecutar ese script. Verás que hemos documentado los objetos y funciones dentro de este paquete de importación de JMP de nivel superior.
Hay un montón de constantes. Todos los directorios especiales están representados. Así que podemos hacerlo. Y ahora lo hago desde Python. JMP abierto. JMP, bueno, hoy no puedo escribir, JMP. DATOS DE EJEMPLO. Además. Gran Jefe. Y al igual que en JSL, podemos seleccionar la línea de código y ejecutarla en el script y eso. Y tenemos una gran clase.
Ahora bien, esto no es una copia. Podemos obtener ese objeto. Podríamos haber puesto TT igual a JMP abierto y tendríamos una referencia. Pero también podemos usar TT igual a JMP.current. Eso nos dará una referencia a la tabla de datos actual.
Bueno, podemos hacer cosas como imprimir TT. Eso nos dice que es una clase grande. Es de cinco por 40 columnas. Pero incluso. Más divertido puedes hacer. TT. Nombre. Y podemos usar operadores de segmentación de Python. Le estoy diciendo que nos dé todos los nombres alternos en la columna de nombres comenzando con cero.
En Python indexamos como Python debería indexar comenzando desde cero. El índice de nuestra tabla de datos es columna por fila. Como tenemos un formato de columna principal y si imprimimos. Cada dos. Nombre, obtenemos Katie. Jane. Lilly. James, Barbara, Susan, Joe y David.
Este es un acceso en vivo, así que podemos hacer cosas como… y podemos hacer cosas como TT, y podemos usar el nombre o el índice de la columna. Columna que imprimimos. Eso nos da, elige. Aquí está tu… Elegí uno, ¿verdad, Lewis? Lo siento. Cero cero. Es Katie. Como la tabla de datos está en vivo, puedes hacer Katie.
Espere. Minúsculas. Mayúsculas y minúsculas. Ahora vemos la salida en nuestro registro incrustado. Notará. Lo hemos cambiado en la tabla de datos. Esto le da la capacidad de modificar tablas de datos, acceder a las tablas de datos de una manera Python, y puede crear tablas de datos desde Python. Hemos dedicado los esfuerzos.
Ahora tenemos el índice de scripts. Les mostraré... aquí, como dije, la función get graphics está obsoleta. En realidad, ya no es una función válida en JMP, pero el ejemplo en el índice de scripts les muestra cómo pasar de lo que tenían antes a cómo lo hacíamos internamente en JMP para guardar la figura, abrir la imagen y crear una nueva ventana con la imagen.
Una de las nuevas y geniales características del entorno centrado en Python es que se encuentran en la categoría de Python, que es una categoría aparte. El paquete de importación JMP tiene objetos de tabla de datos. Hay ejemplos para cada uno de ellos, podemos crear nuevas columnas, agregar filas y guardar la tabla. Las propiedades de la tabla, como obtener los nombres de las tablas. Todo eso.
Esta crearía una nueva tabla de datos con Python. También tenemos utilidades JMP. Donde puedes entrar, o podemos usarla para ejecutar pip JMP porque ha creado su propio entorno aislado. Cuando instalamos paquetes, deben estar en el entorno aislado de JMP.
Esperemos que no tengas ningún problema con los paquetes que tienes en JMP que entren en conflicto con otras cosas o con otras instalaciones de Python. Lo hemos mantenido aislado. Y en este caso, si tienes que... tenemos create jpip creará un script que envolverá el script pip de Python para permitirte instalarlo, o también puedes ejecutarlo desde la clase JMP utils dentro de gem.
Aquí mostraremos la lista de comandos de pip y esto saldrá. Llama a pip y devuelve la lista de paquetes que tengo instalados en mi entorno Python. Otro ejemplo aquí es que puedes instalar paquetes. Y eso se ejecutará directamente desde JMP.
Hay algunas advertencias, por eso existe la creación de jpip. Si un paquete se carga en memoria como NumPy, ya que tiene una biblioteca compartida, Windows podría impedirle actualizarlo. Algunos paquetes requieren compilación, la cual podría tener que realizarse desde la línea de comandos.
Algunos de ellos podrían funcionar, pero es posible que necesiten ejecutarse desde la línea de comandos. Por eso, conviene crear un script envoltorio de jpip. Al ejecutarlo, aparecerá una ventana emergente que le indicará dónde guardar el archivo; luego, seleccione la carpeta y generará un script envoltorio de jpip que podrá ejecutarse desde la línea de comandos.
Allí, al ejecutarlo, debes usar el indicador de usuario `--` después de la instalación. Lo hacemos automáticamente cuando se llama desde aquí. También hay una función JSL que ejecuta la instalación. Instalar paquetes en Python es aún más sencillo. Simplemente ejecuta el script JSL, y este llamará a pip en segundo plano, configurando correctamente todas las variables de entorno necesarias para colocar el paquete en el entorno aislado de JMP.
Vamos. Luego podemos mostrarles más demostraciones. Esto es lo básico y sencillo. Pero también… parte de todo este proceso fue hacer que JMP fuera más compatible con Python y mucho más fácil de ampliar sus capacidades mediante paquetes adicionales de Python.
Una de las funciones más solicitadas por los usuarios es la importación de archivos Parquet. Esta demostración toma una tabla de mi disco duro, que descargué de internet. Luego, imprime la estructura del archivo Parquet y crea una tabla de datos JMP columna por columna a partir de los datos del archivo. Borraremos los registros. Vean cómo lo hago.
No ejecuté el script. Debí haber resaltado algunas cosas. Ahí está. Este era un archivo parquet. Hicimos el parquet pyrrow como PQ lo importó. Las propiedades de los archivos parquet. Son mil filas. La forma es de 13 columnas por mil filas. El esquema muestra el esquema de los nombres de las columnas.
Aquí, al final, podemos mostrar que otra de las cosas es que aún no hemos terminado ni mucho menos con las cosas que queremos mejorar en el lado de Python, pero hasta que lleguemos a eso, puedes ejecutar JSL desde Python.
Aunque el código Python aún no admite funciones como configurar el ancho de visualización o cambiar el tipo de columna, puedes crear una nueva columna, pero no puedes cambiar su tipo desde Python. Queremos implementar estas funciones, pero por ahora tienes una solución alternativa para ejecutar scripts JSL desde Python, al igual que podías ejecutar Python desde JSL.
Ahora, con este entorno mejorado, puedes comunicarte fácilmente entre ambos. Python puede ejecutar scripts JSL, que luego se ejecutan en el entorno JSL. De esta forma, puedes anidar las llamadas para lograr resultados que de otro modo serían imposibles. Esto implica procesar archivos Parquet con un tipo de datos que JMP no admite de forma nativa. Sin embargo, lo hemos logrado importando un paquete de Python para ello.
Otra cosa que me importa mucho. No soy muy buen estadístico, pero sí me gustan los gráficos y las matemáticas. Aquí usamos Open Compute Language u OpenCL. Hemos importado el paquete OpenCL. Para crear un fractal de Mandelbrot. Primero, veamos cómo lo hace la CPU. Esto tardará unos 16 segundos en ejecutarse.
Esto es doloroso, y notarás que JMP es lento. No responde porque Python tiene el control en este punto. Si colocas una espera de celda en ejecución dentro de bucles cerrados, podrás recuperar el control. Esto utiliza la CPU para generar este fractal.
Ahora cambiémoslo para que use la GPU y ejecutemos el script. ¡Listo! Generar la imagen, guardarla y abrirla en un script lleva una fracción de segundo. Veremos qué sucede. Usábamos las GPU y tardó 16 segundos, pero si retrocedemos lo suficiente, en realidad tardó 32 segundos en hacerlo con la CPU.
Esto abre la posibilidad de utilizar la GPU con JMP; ahora puedes hacerlo a través de Python. Hemos probado tanto PyOpenCL como PyCuda, así que si tienes una tarjeta Nvidia y trabajas con CUDA, puedes usar PyCuda o la versión más genérica de OpenCL. Esto mejora aún más la capacidad de cálculo de JMP, aprovechando al máximo la potencia de tu ordenador.
También podemos conectarnos a SaaS a través de Python. SaaS tiene un paquete SaaS y, y lo hemos instalado en... y parte de este trabajo es algo que uno de mis compañeros de trabajo preparó. Borremos los registros. De hecho, vemos lo que tengo y podemos ejecutar el script.
Está recopilando esto como debería. Aquí vamos. Este en realidad usa JSL para intentar asegurarse de que todos los paquetes de Python que podrían ser necesarios para ejecutar el script ya estén instalados, y puedes configurarlo. Eso es parte de lo que ves aquí en el registro que decía que ya están satisfechos. Aquí están todos los resultados que se obtuvieron al ejecutar el script conectándose a SaaS. Usando el paquete SaaS Py, y volveremos a revisar el registro.
El script se registra en el log. Como ya mencioné, tenemos información de conexión con SaaS y la ejecución de los productos. También se registra nuestra logística. Luego, se devuelven los valores de salida y finaliza la sesión de SaaS.
Hemos oído que TensorFlow podría interesar a mucha gente. Aquí tenéis un ejemplo muy sencillo. Bueno, en realidad he instalado TensorFlow y lo estoy ejecutando desde JSL, pero podríamos haber ejecutado este código fácilmente desde Python.
Ejecuta el flujo tensorial y crea esta suma. Estoy seguro de que se te ocurrirán usos mucho más complicados que los que tengo para demostrar. Py digest es otro. Es, pantalla. Aquí había una muestra que creé para mostrar, una era para mostrar varias cosas, incluyendo la ejecución de JSL donde me permite usar para seleccionar un directorio usando JMPs pick directory, el JSL pick directory y usarlo en un script de Python. Todo esto es un script de Python puro. Me permite seleccionar un directorio.
Crea una suma de verificación para cada archivo del directorio. La guarda en una base de datos SQLite y luego crea una tabla de datos JMP a partir de ella. Te da una pequeña introducción a la programación de bases de datos, a JMP (creando una tabla de datos JMP desde Python) y a JSL (ejecutando desde Python).
Directorio para elegir. Tengo muchos datos aquí, así que elijamos la presentación, la carpeta parquet o seleccionemos la carpeta. Ahora tenemos una tabla de sumas de verificación. Crearon el… verifica cada archivo en el directorio, me dio sus nombres de ruta y una suma de verificación MD5 del contenido del archivo. Construí la base de datos. Construí la tabla de datos JMP desde Python y también usé JSL para establecer los anchos de las columnas.
Repito, es algo que aún no hemos implementado, pero está en nuestra lista de tareas pendientes. Sin embargo, puedes hacer cosas desde... puedes hacer cosas de JSL desde tu Python si así lo deseas.
Algunas personas podrían querer usar R. Bueno, en este caso, he creado una conexión usando nuestro servidor en mi máquina y en nuestro entorno. Simplemente era más fácil ejecutar nuestro servidor desde un sistema Windows para el entorno Linux WSL.
Tengo un demonio de servidor R ejecutándose aquí. Y usando el cliente reservado. Estoy haciendo algo pequeño, creando un vector R en el servidor, sumando el resultado y ejecutando este script. Nos hemos conectado a nuestro servidor. Obtenemos el vector y sumamos todos los elementos para obtener seis. Nuestro py2. También hay algunos ejemplos de eso que tenemos. Si quieres algo realmente simple que funcione desde la línea de comandos, hay un ejemplo sobre cómo usar algún proceso para ejecutar R desde la línea de comandos.
Finalmente, la parte de estadística en la que Jon Saul lo ayudó. Crea una muestra que use el paquete de Python HDB scan. Un detalle a tener en cuenta con Matplotlib: Matplotlib en Windows no tiene un backend gráfico, así que si quieres ver algún resultado, hemos comprobado que PyQt5 funciona mejor.
Como backend y. En Mac si usa Matplotlib, lo forzaremos a ser AGG, el backend no gráfico si no lo ha instalado. Uno de PyQt5 o PySide. Porque Matplotlib en Mac automáticamente va al backend cocoa, y hay un error que cuando cierra la última ventana en Matplotlib en Mac, hará que JMP se cierre.
Para protegernos de eso, si encontramos Matplotlib en su sistema, si hay un backend, cargaremos Matplotlib y lo forzaremos a usar el backend de Qt. De lo contrario, nos aseguramos de que sea un backend no gráfico. Lo hemos configurado como backend. Tengo PyQt5 en mi máquina. Con este ejemplo, ejecutamos un análisis de agrupamiento en el escaneo de HDB.
Ahora mostremos el registro incrustado. Ejecutaremos el script. Lo que obtenemos es una figura generada en la tabla de datos de Matplotlib. Aquí pueden ver que hicimos una apertura JMP y tomamos la referencia DT. Esas son las muestras que tengo. Créanme.
Voy a retomar la presentación. Nuestras prioridades para el futuro cercano: perfeccionamiento y mejora continuos. Aumentar la interoperabilidad de datos entre JMP y Python. Actualmente, la limitación en la edición de modificación de columnas es que se pueden crear columnas de cualquier tipo, pero solo se pueden modificar y obtener valores para columnas numéricas y de caracteres, columnas de expresiones o columnas de estado. La creación de tablas vinculadas se realizará en el futuro.
Si bien el editor de scripts de Python admite el resaltado de sintaxis y el coloreado del código, aún no ofrece soporte para la indentación automática. También estamos trabajando en ello.
El objetivo de la modernización era lograr que la integración de JMP con Python funcionara sin problemas desde el primer momento. Debería ser posible ser productivo con JMP y Python sin necesidad de configuración. Si no funcionaba, sería un gran desafío. ¿Por qué no reducir el tiempo que necesitan los programadores de Python para ser productivos con JMP y mejorar las capacidades de JMP? Convertirse en un centro de análisis gracias a la fácil expansión de JMP mediante paquetes externos de Python.
Mejoramos nuestra capacidad de cargar diferentes formatos de datos que otras personas han dedicado tiempo a escribir, como el formato parquet, que también hemos probado (hdf5). Hay muchos formatos disponibles, más de los que un solo equipo de desarrollo puede escribir internamente, pero de esta manera puedes incorporar el paquete de Python y convertir esos datos en una tabla de datos JMP, aprovechando así esa funcionalidad dentro de JMP.
Agradecemos su tiempo. Esperamos que haya disfrutado de nuestro trabajo y nos interesa mucho recibir sus comentarios. Gracias.