Hallo allerseits,
(JMP 17 Pro-Benutzer) Beim Versuch, Datentabellenobjekte an Python zu übergeben und sie wieder in JSL abzurufen, stoße ich auf ein seltsames Problem, insbesondere bei der Verwendung von Application Builder.
Da ich Application Builder zum ersten Mal verwende, habe ich einen groben Entwurf des gewünschten Verhaltens in der App über ein Standard-JSL-Skript geschrieben (zum Kontext: Das Ziel ist eine Anwendung, die es dem Benutzer ermöglicht, ein Verzeichnis/eine Datei auszuwählen und dann von JMP ein Diagramm zur Analyse erstellen zu lassen). Das Verhalten funktioniert in einem Standard-JSL-Skript, aber nicht im Application Builder.
Hier ist mein eigenständiges (nicht Application Builder-)Skript:
// 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");Und die Ausgabe für dieses Skript:
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
dt1 = DataTable("dt1");
"second";(FUNKTIONIERT NICHT) Hier ist mein Application Builder-Skript:
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");
);und das beunruhigende Ergebnis:
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
/**********/
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
/**********/
dt1 = .;
"second";TLDR: In meinem eigenständigen Skript erhalte ich, nachdem ich meine Datentabelle aus der Bereinigung in Python über dt1 = Python Get(dt1); abgerufen habe, ein Objekt als dt1 = DataTable("dt1"); zurück. Im JMP Application Builder-Skript erhalte ich jedoch dt1 = .; (was für mich bedeutet, dass das Objekt nicht existiert?).
Ich habe dies zum ersten Mal bemerkt, als ich versuchte , dt1 << Neues Datenfenster zu verwenden. Beim Lesen dieses Threads wurde mir klar, dass ich wahrscheinlich überhaupt nicht mit einem Objekt arbeite: https://community.jmp.com/t5/Discussions/Error-in-running-script-Send-Expects-Scriptable-Object-in-access/td-p/718245
Entschuldigen Sie den langen Beitrag. Es handelt sich um einen seltsamen Fehler. Vielen Dank im Voraus an alle, die bei diesem Problem helfen!
Ich sehe in Ihrem Application Builder-Skript kein Python Send(dt1);
Beachten Sie auch, dass JMP 18 ändert, was mit einem Python Send(dt) passiert. In JMP 18 und höher erhalten Sie ein jmp.DataTable-Objekt anstelle eines pandas.DataFrame. Und dieses DataTable-Objekt ist keine Kopie der Daten mehr, sondern Live-Zugriff auf die Datentabelle. Sie können die Verarbeitung in Python direkt auf der Live-Tabelle durchführen. Beispiele für die Python-APIs, die über das Paket „import jmp“ unterstützt werden, finden Sie im Scripting Index in JMP 18.
Wenn Sie von jmp.DataTable zu pandas.DataFrame wechseln müssen, finden Sie mehrere Beispiele im Verzeichnis $SAMPLE_SCRIPTS/Python. dt2pandas.py macht genau das, was JMP 14-17 getan hat: Es speichert die DataTable als temporäre CSV-Datei auf der Festplatte und weist Pandas an, die Datei mit read_csv() zu bearbeiten. JMP2pandas.py ist ein Beispielskript, das zeigt, wie die Funktionen des jmp.DataTable-Objekts verwendet und ein pandas.DataFrame im Speicher erstellt werden.
Python Get( dt ) erkennt das neue jmp.DataTable-Objekt, während Python Get( df ) den DataFrame erkennt und mit CSV importiert, genau wie JMP 14-17
Vielen Dank für Ihre ausführliche Lösung, das war sehr hilfreich. Ich kann nicht glauben, dass ich so etwas Kleines übersehen habe.