Salut tout le monde,
(Utilisateur de JMP 17 Pro) Je rencontre un problème étrange lorsque j'essaie de transmettre des objets de table de données à Python et de les récupérer dans JSL, en particulier lors de l'utilisation d'Application Builder.
Comme c'est la première fois que j'utilise Application Builder, j'ai rédigé une ébauche du comportement que je souhaitais dans l'application via un script JSL standard (pour le contexte, l'objectif est une application qui permet à l'utilisateur de sélectionner un répertoire/fichier, puis laissez JMP générer un graphique pour analyse). Le comportement fonctionne dans un script JSL standard, mais ne fonctionne pas dans Application Builder.
Voici mon script autonome (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");Et le résultat de ce script :
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
dt1 = DataTable("dt1");
"second";(NE FONCTIONNE PAS) Voici mon script 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");
);et le résultat troublant :
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
/**********/
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
/**********/
dt1 = .;
"second";TLDR : dans mon script autonome, après avoir récupéré ma table de données du nettoyage en Python via dt1 = Python Get(dt1); , je récupère un objet sous la forme dt1 = DataTable("dt1"); . Cependant, dans le script JMP Application Builder, j'obtiens dt1 = .; (ce qui pour moi indique que l'objet n'existe pas ?).
Je l'ai reconnu pour la première fois lorsque j'ai tenté d'utiliser dt1 << Nouvelle fenêtre de données ; et la lecture de ce fil m'a fait réaliser que je ne travaille probablement pas du tout avec un objet : https://community.jmp.com/t5/Discussions/Error-in-running-script-Send-Expects-Scriptable-Object-in -access/td-p/718245
Toutes mes excuses pour le long message. C'est une erreur étrange, et merci d'avance à tous pour votre aide sur ce problème !
Je ne vois dans votre script Application Builder aucun Python Send(dt1);
Notez également que JMP 18 modifie ce qui se passe avec un Python Send(dt). Dans JMP 18 et versions ultérieures, vous obtenez un objet jmp.DataTable au lieu d'un pandas.DataFrame. Et cet objet DataTable n'est plus une copie des données mais un accès en direct à la table de données, vous pouvez effectuer le traitement en Python directement sur la table en direct. Consultez l' index de script dans JMP 18 pour obtenir des exemples d'API Python prises en charge via le package import jmp .
Si vous devez passer de jmp.DataTable à pandas.DataFrame, il existe plusieurs exemples dans le répertoire $SAMPLE_SCRIPTS/Python. dt2pandas.py fait exactement ce que JMP 14-17 a fait, enregistre le DataTable sur le disque en tant que fichier CSV temporaire, puis indique aux pandas de read_csv() sur le fichier. JMP2pandas.py est un exemple de script montrant comment utiliser les capacités de l'objet jmp.DataTable et créer un pandas.DataFrame en mémoire.
Python Get( dt ) reconnaît le nouvel objet jmp.DataTable, tandis que Python Get( df ) reconnaîtra le DataFrame et importera en utilisant CSV de la même manière que JMP 14-17
Merci beaucoup pour votre solution détaillée, cela a été très utile. Je ne peux pas croire que j'ai raté quelque chose d'aussi petit.