Hola a todos,
(Usuario de JMP 17 Pro) Me encuentro con un problema extraño al intentar pasar objetos de tabla de datos a Python y recuperarlos nuevamente en JSL, específicamente mientras uso Application Builder.
Como esta es la primera vez que uso Application Builder, escribí un borrador del comportamiento que quería en la aplicación a través de un script JSL estándar (para el contexto, el objetivo es una aplicación que permita al usuario seleccionar directorio/archivo, luego deje que JMP genere un gráfico para su análisis). El comportamiento funciona en un script JSL estándar, pero no funciona dentro del Generador de aplicaciones.
Aquí está mi script independiente (que no es de Application Builder):
// Initialize Python within JMP
PyConnect = Python Connect();
Names Default to Here( 1 );
// Allow user to manually pick directory and file
directory = Pick Directory ("Select a directory.");
chosen_file = Pick File("Select a file", directory);
// Open the selected file, then send to Python
dt1 = Open(chosen_file, Table Contains Column Headers(0));
Python Send(dt1);
// Close the dirty data table to save space/resources
Close(dt1, NoSave);
show(dt1, "first");
// Clean the table by removing all references to "#"
Python Submit("\[
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
]\");
// Retrieve the processed table from Python and open in JMP
// Terminate Python connection
dt1 = Python Get(dt1);
Python Term();
show(dt1, "second");Y el resultado de este script:
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
dt1 = DataTable("dt1");
"second";(NO FUNCIONA) Aquí está mi script de Application Builder:
executePress=Function({thisBox}, {Default Local},
// This function is called when the button is pressed
py = Python Connect();
dt1 = Open(::file, Table Contains Column Headers(0));
Close(dt1, NoSave);
show(dt1, "first");
// Clean the table by removing all references to "#"
Python Submit("\[
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
]\");
dt1 = Python Get(dt1);
Python Term();
show(dt1, "second");
);y el resultado preocupante:
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
/**********/
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
/**********/
dt1 = .;
"second";TLDR: en mi script independiente, después de recuperar mi tabla de datos de la limpieza en Python a través de dt1 = Python Get(dt1); , obtengo un objeto como dt1 = DataTable("dt1"); . Sin embargo, en el script JMP Application Builder, obtengo dt1 = .; (¿Lo que para mí indica que el objeto no existe?).
Reconocí esto por primera vez cuando intenté usar dt1 << Nueva ventana de datos; y leer este hilo me hizo darme cuenta de que probablemente no estoy trabajando con ningún objeto: https://community.jmp.com/t5/Discussions/Error-in-running-script-Send-Expects-Scriptable-Object-in -acceso/td-p/718245
Disculpas por el post largo. Es un error extraño y gracias a todos de antemano por su ayuda con este problema.
No veo en el script del Generador de aplicaciones ningún Python Send(dt1);
También tenga en cuenta que JMP 18 cambia lo que sucede con un envío de Python (dt). En JMP 18 y posteriores, obtienes un objeto jmp.DataTable en lugar de pandas.DataFrame. Y ese objeto DataTable ya no es una copia de los datos, sino acceso en vivo a la tabla de datos; puede realizar el procesamiento en Python directamente en la tabla en vivo. Consulte el índice de secuencias de comandos en JMP 18 para ver ejemplos de las API de Python admitidas a través del paquete import jmp .
Si necesita pasar de jmp.DataTable a pandas.DataFrame, hay varios ejemplos en el directorio $SAMPLE_SCRIPTS/Python. dt2pandas.py hace exactamente lo que hizo JMP 14-17: guarda la tabla de datos en el disco como un archivo CSV temporal y le dice a los pandas que lean_csv() en el archivo. JMP2pandas.py es un script de ejemplo que muestra cómo utilizar las capacidades del objeto jmp.DataTable y crear un pandas.DataFrame en la memoria.
Python Get (dt) reconoce el nuevo objeto jmp.DataTable, mientras que Python Get (df) reconocerá el DataFrame y lo importará usando CSV igual que JMP 14-17.
Muchas gracias por su solución detallada, fue muy útil. No puedo creer que me haya perdido algo tan pequeño.