Ciao a tutti,
(Utente JMP 17 Pro) Riscontro uno strano problema quando tento di passare gli oggetti della tabella dati a Python e di recuperarli nuovamente in JSL, in particolare durante l'utilizzo di Application Builder.
Poiché è la prima volta che utilizzo Application Builder, ho scritto una bozza del comportamento che volevo nell'app tramite uno script JSL standard (per il contesto, l'obiettivo è un'applicazione che consenta all'utente di selezionare directory/file, quindi lasciare che JMP generi un grafico per l'analisi). Il comportamento funziona in uno script JSL standard, ma non funziona all'interno dell'Application Builder.
Ecco il mio script autonomo (non 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");E l'output per questo script:
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
dt1 = DataTable("dt1");
"second";(NON FUNZIONANTE) Ecco il mio script di 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");
);e il risultato preoccupante:
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
/**********/
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
/**********/
dt1 = .;
"second";TLDR: nel mio script autonomo, dopo aver recuperato la mia tabella dati dalla pulizia in Python tramite dt1 = Python Get(dt1); , ottengo un oggetto come dt1 = DataTable("dt1"); . Tuttavia, nello script JMP Application Builder, ottengo dt1 = .; (che per me indica che l'oggetto non esiste?).
L'ho riconosciuto per la prima volta quando ho tentato di utilizzare dt1 << New Data Window; e leggere questo thread mi ha fatto capire che probabilmente non sto lavorando affatto con un oggetto: https://community.jmp.com/t5/Discussions/Error-in-running-script-Send-Expects-Scriptable-Object-in -access/td-p/718245
Ci scusiamo per il lungo post. È un errore strano e grazie a chiunque in anticipo per il vostro aiuto su questo problema!
Non vedo nello script dell'Application Builder alcun Python Send(dt1);
Si noti inoltre che JMP 18 modifica ciò che accade con Python Send(dt). In JMP 18 e versioni successive, ottieni un oggetto jmp.DataTable invece di pandas.DataFrame. E quell'oggetto DataTable non è più una copia dei dati ma un accesso live alla tabella dati, puoi eseguire l'elaborazione in Python direttamente sulla tabella live. Consulta l' indice degli script in JMP 18 per esempi delle API Python supportate tramite il pacchetto import jmp .
Se devi passare da jmp.DataTable a pandas.DataFrame ci sono diversi esempi nella directory $SAMPLE_SCRIPTS/Python. dt2pandas.py fa esattamente quello che ha fatto JMP 14-17, salva DataTable su disco come file CSV temporaneo, dice ai panda di read_csv() sul file. JMP2pandas.py è uno script di esempio che mostra come utilizzare le funzionalità dell'oggetto jmp.DataTable e creare un pandas.DataFrame in memoria.
Python Get( dt ) riconosce il nuovo oggetto jmp.DataTable, mentre Python Get( df ) riconoscerà DataFrame e importerà utilizzando CSV come JMP 14-17
Grazie mille per la tua soluzione dettagliata, è stata molto utile. Non posso credere di essermi perso qualcosa di così piccolo.