Esta presentación describe las actualizaciones nuevas e importantes del soporte de JMP 18 para Python, que proporciona una integración mucho más estrecha con Python y una experiencia de usuario centrada en Python significativamente mayor. En JMP 18, podrás:
Estas capacidades de JMP expuestas a Python se expandirán con el tiempo, pero el enfoque actual es la funcionalidad crítica y el soporte de datos en memoria. En esta presentación, escuche de primera mano los cambios y las razones detrás de ellos, además de ser testigo de la nueva funcionalidad proporcionada a los usuarios de JMP. Se analiza la extensibilidad y la capacidad de importación de datos mediante el uso de paquetes Python externos y se demuestra el acceso a las GPU a través de la interfaz Python utilizando paquetes externos.
Hola, soy Paul Nelson. Estoy aquí para hablar sobre JMP, Python y nuestro próximo paso. Después de una de las presentaciones anteriores el año pasado, decidimos que podíamos mejorar nuestro juego. JMP, Python tenía margen de mejora y de eso hablaré aquí.
Los mayores desafíos que tuvieron los clientes fueron JMP 14 a 17 con solo hacer funcionar el soporte de Python. Si funcionó. Simplemente funcionó bien. Con demasiada frecuencia ese no era el caso. Con numerosas distribuciones de Python y diferentes entornos que nos dificultaron las pruebas.
A veces se podría hacer que Anaconda funcione en Windows, y a veces se podría hacer que los entornos virtuales de Python funcionen. El entorno, debido a que todos tenían Pythons diferentes, 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 fue difícil y desagradable. Un lenguaje en el que los bloques de código están delimitados por espacios. Cuando tienes que pegar eso como una cadena en JSL, resulta un desafío. No hay suficientes informes de errores en las versiones antiguas de JMP de Python, lo que dificultaba la depuración de los scripts de Python.
Finalmente, las transferencias de tablas y matrices de datos se realizaron a través del sistema de archivos, y con una tabla de datos se hizo como un archivo CSV, lo cual es lento si realmente tienes datos grandes. Las clases grandes funcionan bien, pero los datos más grandes son lentos.
La visión que hemos tenido es asegurarnos de que la integración de Python simplemente funcione. No es necesaria ninguna configuración. Con ese fin, hemos enterrado una versión 3.115 de Python y JMP 18.0, y se instala como parte de JMP. Es 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 los datos que fluyen entre JSL y Python sean transferencias en memoria y sin acceso de copia a la memoria. Lo hemos convertido en un entorno atractivo y productivo para los programadores de Python. Ahora también tenemos un editor de secuencias de comandos Python donde hay coloración de código y resaltado de sintaxis.
Puede ejecutar scripts de Python puros directamente desde el editor de scripts y desde el entorno de Python, puede obtener acceso directo a los datos de JMP, el registro, puede llamar a JSL y acceder a los datos desde Python. Hemos mejorado enormemente el informe de errores en el registro JMP y el registro integrado.
Debido a que es un entorno común, ahora podemos probarlo y verificarlo. Nuestro entorno es el mismo que deberías ver. Hemos agregado una categoría completa de Python en el Índice de secuencias de comandos para que coincida... para explicar y mostrar ejemplos de lo que ahora está disponible con el paquete JMP de importación y un par de paquetes de utilidades más.
La otra parte de esto es que nos brinda la capacidad de ampliar las capacidades de JMP a través de la amplia biblioteca de paquetes de Python. No estamos intentando crear un JSL alternativo uno a uno. En cambio, intentamos proporcionar un entorno familiar y productivo para la programación en Python dentro de JMP.
Esto es modernización, renovación y revisión. Algunas de las decisiones de diseño originales para la integración de Python de JMP proporcionaron limitaciones. Hemos hecho todo lo posible para minimizar las roturas provocadas por el cambio y, al mismo tiempo, proporcionar una base sólida y estable para el futuro.
Hay muchas expectativas de que la ruptura se limite a esta transición a JMP. El aspecto clave es que ahora solo admitimos la versión de Python que enviamos con JMP. Piense en ello como un entorno virtual JMP privado.
La otra cosa que sucederá en los scripts es que hemos cambiado la forma en que funciona el envío de una tabla de datos en Python. Ahora crea un JMP con ese objeto de tabla de datos. Este es el acceso en vivo a la tabla de datos de JMP. La copia en memoria, puede editar y modificar la tabla existente. Ya no es una copia.
JMP 14 a 17 creó un objeto Pandas DataFrame copiando los datos a través de un archivo CSV temporal en el sistema de archivos. Para grandes datos. La exportación a CSV explota, se vuelve muy grande y lenta. También tiene el problema de una posible pérdida de precisión porque pasa de un formato binario a un formato de texto y regresa del texto a un formato binario.
Si realmente necesita la misma funcionalidad, proporcionamos un DT para pandas Python en los archivos de muestra que proporciona una función de dos pandas. Esto funciona como solía hacerlo internamente. Crea un archivo CSV temporal y le dice a pandas que importe el archivo CSV.
También hay un ejemplo de JMP a pandas que muestra cómo crear un DataFrame de pandas en la memoria a partir de un objeto de tabla de datos JMP que está creando una columna en pandas con una columna de la columna JMP a la vez.
Python Send Matrix era otro que solía escribir a través del sistema de archivos. Escribiría un archivo de dobles para que NumPy leyera el archivo. Esto ahora sucede internamente a través de la memoria y es una referencia viva a la matriz en lugar de una copia.
La mayoría de la API JSL Python permanece intacta. Los cambios involucrados fueron principalmente la eliminación de argumentos y funciones obsoletos utilizados para configurar el soporte original de Python para elegir una versión de Python.
La única eliminación de API fue la función de obtención de gráficos de Python, que recuperó una imagen de Matplotlib, y en nuestro índice de secuencias de comandos, tenemos un ejemplo que muestra exactamente cómo hacer lo mismo que JMP hizo internamente con solo código JSL y Python. Muéstralo ya. Vamos a ver. Salgamos de la demostración.
Aquí tenemos JMP. Una de las cosas que quiero mostrar es que verán íconos de Python en las barras de herramientas y en el menú Archivo nuevo tenemos un script JSON, pero ahora tenemos un nuevo script Python. Abriremos el editor de scripts de Python.
Podemos usar mostrar el registro incrustado. Tenemos un paquete de importación JMP. Importar JMP. Hemos hecho nuestro esfuerzo para asegurarnos de haber colocado cadenas de documentos de Python para que pueda ejecutar, ayuda a JMP Python. Podemos ejecutar ese script. Verá que hemos documentado los objetos y funciones dentro de este paquete de importación JMP de nivel superior.
Hay un montón de constantes. La mayoría de los directorios especiales están representados. Entonces podemos hacerlo. Y ahora lo hago desde Python. JMP abierto. JMP, bueno, hoy no puedo escribir, JMP. DATA DE MUESTRA. Más. Gran Jefe. Y al igual que en JSL, podemos seleccionar la línea de código y ejecutarla en el script. Y tenemos gran clase.
Ahora bien, esto no es una copia. Podemos conseguir ese objeto. Podríamos haber puesto TT igual a JMP abierto y tendríamos una referencia. Pero también podemos decir que TT es 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 de gran clase. Son cinco por 40 columnas. Pero incluso. Más diversión puedes hacer. TT. Nombre. Y podemos usar operadores de corte de Python. Le estoy diciendo que nos dé todos los demás nombres en la columna de nombres que comiencen con cero.
Indexamos en Python al igual que Python si indexamos comenzando con cero. El índice de nuestra tabla de datos está columna por fila. Ya que somos una columna importante tipo de formato y si la imprimimos. Uno sí y otro no. Nombre, tenemos a Katie. Jane. Lili. James, Bárbara, Susan, Joe y David.
Este es un acceso en vivo, por lo 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. Eso nos da, elegir. Aquí está tu... Elegí uno, ¿verdad, Lewis? Lo siento. Cero cero. Es Katie. Dado que la tabla de datos está activa. tu puedes hacer katie
Servir. Minúsculas. Caso mixto. Ahora vemos el resultado en nuestro registro incrustado. Notarás. Lo hemos cambiado en la tabla de datos. Esto le brinda la posibilidad de modificar tablas de datos, acceder a las tablas de datos en forma de Python y puede crear tablas de datos desde Python. Hemos hecho los esfuerzos.
Ahora tenemos el índice de secuencias de comandos. Mostraré... aquí, como dije, obtener gráficos está en desuso. En realidad, ya no es una función válida en JMP, pero el ejemplo en el índice de secuencias de comandos le muestra cómo pasar de lo que solía tener a cómo lo hicimos internamente dentro de JMP para guardar la figura, abrir la imagen y crear una nueva. ventana con la imagen.
Una de las nuevas características agradables del entorno centrado en Python es que la categoría Python es una categoría en sí misma. El paquete de importación JMP tiene objetos de tabla de datos. Hay ejemplos para cada uno de los cuales podemos crear nuevas columnas, podemos agregar filas y guardar la tabla. Las propiedades que contiene, como obtener nombres de tablas. Todo de eso.
Éste crearía una nueva tabla de datos impulsada por Python. También contamos con utilidades JMP. Donde pueda, o podemos usarlo para ejecutar pip JMP porque ha creado su propio entorno aislado. Cuando instalamos paquetes, deben estar en un entorno aislado de JMP.
Con suerte, no debería tener ningún problema con los paquetes que tiene en JMP que entran en conflicto con otras cosas u otras instalaciones de Python. Lo hemos mantenido aislado. Y en este caso, si es necesario... tenemos create jpip, que creará un script que empaquetará el script pip de Python para permitirle instalarlo, o puede ejecutarlo desde la clase de utilidades JMP desde gem.
Aquí mostraremos la lista de comandos list pip y esto se apagará. Llamo a pip y me devuelve la lista de paquetes que tengo instalados en mi entorno Python. Otro ejemplo aquí es que puedes instalar paquetes. Y eso funcionará directamente desde JMP.
Hay un par de advertencias, razón por la cual existe create jpip. Si un paquete se carga en memoria como NumPy, ya que tiene una biblioteca compartida. Windows y puede impedirle actualizar ese paquete. Hay algunos paquetes que requieren compilación. Es posible que deban hacerse desde la línea de comando.
Algunos de ellos pueden funcionar, pero es posible que sea necesario ejecutarlos desde la línea de comandos. Es por eso que querrás crear un script contenedor jpip. Cuando se ejecute, aparecerá una ventana emergente y le dará un directorio en el que escribir el archivo, luego seleccione la carpeta y escribirá un script contenedor jpip que se puede ejecutar desde la línea de comando.
Allí, cuando lo ejecuta, desea utilizar el indicador de usuario menos menos después de la instalación. Lo hacemos automáticamente cuando se llama desde aquí. También hay una función JSL que también ejecutará la instalación. Los paquetes de instalación de Python son aún más sencillos. Puede simplemente ejecutar el script JSL y llamará a pip en segundo plano, configurando adecuadamente todas las variables de entorno necesarias para colocar el paquete en el entorno aislado de JMP.
Vamos. Luego podemos continuar mostrándole algunas demostraciones más. Estas son las cosas básicas fáciles. Pero lo que también… parte de todo este proceso fue hacer que JMP fuera más amigable para Python y mucho más fácil de extender las capacidades de JMP a través de paquetes adicionales de Python.
Una de nuestras vías de soporte frecuentes que la gente desea es poder importar archivos de parquet. Esta demostración toma y extrae una mesa de mi disco. Uno que descargué de internet. Correcto. Luego imprime la forma del archivo parquet y construye una tabla de datos JMP columna por columna a partir de los datos del archivo parquet. Limpiaremos los registros. De hecho, mírame hacerlo.
No ejecuté el script. Debí haber resaltado algunas cosas. Aquí vamos. Esta era una lima de parquet. Que el parquet pyrrow lo hicimos tal como lo importó PQ. Las propiedades de los archivos Parquet. Son mil filas. La forma es de 13 columnas por mil filas. Schema le muestra al príncipe el esquema y los nombres de las columnas.
Aquí, en la parte inferior, podemos mostrar una de las otras cosas: aún no hemos terminado ni mucho menos con las cosas que queremos mejorar en el lado de Python, pero hasta que lleguemos allí, puede ejecutar JSL desde Python.
Aunque el código Python aún no admite cosas como la configuración, el ancho de visualización o incluso el cambio de tipos de columnas. Puede crear una nueva columna, pero no puede cambiar su tipo desde Python. Esas son cosas a las que queremos llegar, pero ahora mismo tiene una solución alternativa para poder ejecutar scripts JSL desde Python, tal como pudo ejecutar Python desde JSL.
Ahora, con este entorno mejorado, puedes realizar llamadas entre ambos. Python puede ejecutar scripts JSL. Esta llamada en Python puede luego ejecutarse en el entorno JSL, de modo que pueda anidar las llamadas para lograr cosas que de otro modo no serían posibles. Eso es llevar un archivo parquet de tipo de datos a JMP que no se maneja de forma nativa. Pero lo hemos hecho importando un paquete de Python para admitirlo.
Una de las otras cosas que aprecio. No soy un gran estadístico, pero soy gráfico y otras matemáticas. Aquí se utiliza Open Compute Language u OpenCL. Hemos importado el paquete OpenCL. Para crear un fractal de Mandelbrot. Primero le mostraremos la CPU. Haciéndolo con la CPU. En realidad, esto tardará unos 16 segundos en ejecutarse.
Esto es doloroso y notará que JMP es lento. No responde porque Python tiene el control en este punto. Si pones una celda en funcionamiento a la espera en lo profundo de bucles cerrados, podrás recuperar el control. Esto está usando la CPU para generar este fractal.
Ahora cambiémoslo para que ejecute la GPU y ejecutemos el script. Auge. Se necesita una fracción de segundo para generar la imagen, guardarla, abrirla en un script y ver qué decimos. Tomó 16 segundos usar las GPU en comparación con... pero cada vez que retrocedemos lo suficiente. En realidad, me tomó 32 segundos mientras estoy aquí presentando hacerlo en la CPU.
Esto se abre si desea utilizar la GPU con JMP, ahora puede hacerlo a través de Python. Hemos probado tanto PyOpenCL como PyCuda, por lo que si tiene una tarjeta Nvidia y está trabajando con Cuda. Puede incorporar PyCuda o el OpenCL más genérico. Mejora aún más la capacidad informática de JMP sin dejar sin uso la energía de su escritorio.
También podemos conectarnos a SaaS a través de Python. SaaS tiene un SaaS y. Package, y lo hemos instalado en... y esto es parte de este trabajo que uno de mis compañeros de trabajo armó. Limpiemos los registros. De hecho, vemos lo que tengo y podemos ejecutar el script.
Está recopilando esto como debería ser. 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 usted puede configurarlo. Eso es parte de lo que ven aquí en el registro, que dice 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, revisaremos el registro.
El script se repite en el registro. Como dije aquí. Tenemos información de conexión donde se conecta a SaaS y ejecuta los productos. Nuestra logística. Luego se devuelven los valores de salida y el final de la sesión SaaS.
Hemos escuchado que TensorFlow podría ser algo que interese a la gente. Aquí hay uno realmente simple. Incorrecto, nuevamente instalé TensorFlow y esto se ejecuta desde JSL, pero fácilmente podríamos haber ejecutado este código aquí desde Python.
Ejecuta el flujo tensor y crea la suma. Estoy seguro de que se le 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 de las cosas, incluida la ejecución de JSL, donde me permite elegir un directorio usando el directorio de selección JMP, el directorio de selección JSL y usarlo en un script de Python. Todo esto es script de Python puro. Me permite elegir un directorio.
Crea una suma de comprobación de cada archivo en el directorio. Lo coloca en una base de datos SQLite y luego crea una tabla de datos JMP a partir de la base de datos. Le brinda un poco de programación de bases de datos, le brinda un poco de JMP para crear una tabla de datos JMP desde Python y ejecutar JSL 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... verifica cada archivo en el directorio, me dieron sus nombres de ruta y una suma de verificación MD5 del contenido del archivo. Construyó la base de datos. Creó la tabla de datos JMP a partir de Python y también usó JSL para establecer los anchos de las columnas.
Nuevamente, eso es algo que aún no hemos implementado, pero es algo que está en la lista para considerar. Pero puedes hacer cosas desde... puedes hacer cosas JSL desde tu Python si así lo deseas.
Es posible que algunas personas nos quieran R. Bueno, en este caso, he creado una conexión usando nuestro servicio en mi máquina y en nuestro entorno. Simplemente fue más fácil ejecutar nuestro servicio desde un sistema Windows para el entorno WSL de Linux.
Tengo un demonio de servicio R corriendo por aquí. Y usando el cliente reservado. Estoy haciendo solo un poquito, 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 desea algo realmente simple que funcione desde la línea de comandos, hay un ejemplo sobre cómo usar algún proceso para desembolsar y ejecutar R desde la línea de comandos.
Por último, la estadística donde Jon Saul le ha ayudado. Cree una muestra que utilice el paquete Python de escaneo HDB. Una cosa a tener en cuenta con Matplotlib. Matplotlib en Windows no tiene un backend gráfico, por lo que si desea ver algún resultado, descubrimos que PyQt5 funciona mejor.
Como la parte trasera y. En Mac, si usa Matplotlib, lo forzaremos a ser AGG, el backend no gráfico, si no lo ha instalado. Uno de los PyQt5 o PySide. Porque Matplotlib en Mac va automáticamente al backend cacao, y hay un error que cuando cierras la última ventana en Matplotlib en Mac, hará que JMP se cierre.
Para protegernos contra lo que estamos forzando, si encontramos Matplotlib en su sistema, si hay un back-end, cargaremos Matplotlib y lo forzaremos a usar el back-end de Qt. De lo contrario, nos aseguramos de que sea un backend no gráfico. Lo hemos hecho en la parte trasera. Tengo PyQt5 en mi máquina. Con este ejemplo ejecutamos algunas agrupaciones en el escaneo HDB.
Ahora mostremos el registro incrustado. Ejecutaremos el script. Lo que obtenemos es una figura generada en la tabla de datos de Matplotlib. Aquí puedes ver que abrimos un JMP y tomamos la referencia DT. Esas son las muestras que tengo. Creer.
Voy a recuperar la presentación. Nuestras prioridades para el futuro próximo. Refinamiento y mejora continuos. Aumente la interoperabilidad de datos entre JMP y Python. En este momento, la limitación dentro de la edición de modificación de columnas es que puede crear columnas de cualquier tipo, pero solo puede modificar y obtener valores para columnas numéricas y de caracteres, columnas de expresión o columnas de estado. La creación de tablas vinculadas se realizará en el futuro.
Si bien el editor de scripts de Python admite coloración de código y resaltado de sintaxis, aún no admite sangría automática. Estaremos investigando eso también.
El objetivo de la modernización era hacer que la integración de JMP Python funcionara de inmediato. Debería poder ser productivo con JMP y Python sin ninguna configuración. Es decir, si no funcionaba, era un gran desafío. ¿Por qué no reducir el tiempo que necesitan los programadores de Python para ser productivos dentro de JMP y crear JMP? Mejorar la capacidad de JMP. Ser un centro analítico gracias a la fácil expansión de JMP mediante paquetes externos de Python.
Mejorar nuestra capacidad para cargar diferentes formatos de datos que otras personas han escrito y dedicado tiempo a escribir como el formato parquet donde nosotros, hdf5, también lo hemos probado. Hay muchos formatos disponibles, más formatos de los que cualquier equipo de desarrollo puede tener tiempo de escribir internamente, pero de esta manera puedes incorporar el paquete Python y convertirlo en una tabla de datos JMP a partir de esos datos y tener ese poder. dentro del JMP.
Aprecia tu tiempo. Espero que hayas disfrutado lo que hemos hecho y que estés muy interesado en recibir comentarios. Gracias.