La dernière version de JMP s'appuie sur l'intégration Python introduite dans JMP 18 en se concentrant sur un élément fondamental du workflow : l'accès aux données. Grâce au développement des opérations sur les tables de données et à l'interopérabilité Python-JSL, l'accès aux données devient simple et pratique.
Vous préférez la vidéo ? Regardez-la ici.
Opérations sur les tables de données
La fonction jmp.from_dataframe() offre un moyen efficace de convertir des trames de données externes en tables de données JMP. Le protocole de trame de données fournit le mécanisme de conversion entre les trames de données en mémoire. Tous les objets de trame de données prenant en charge le protocole d'échange de trames de données peuvent effectuer des conversions entre les trames de données en mémoire. Parmi les exemples notables, on peut citer pandas, polars et ibis.
L'exemple ci-dessous montre une transformation d'un cadre de données pandas en une table de données JMP.

De même, il est tout aussi simple de transformer des tables de données JMP en un autre type de bibliothèque de cadres de données pris en charge. Par exemple, de JMP vers Pandas :

Dans JMP 18, jmp.DataTable ne prenait en charge que les colonnes numériques et de caractères. Désormais, tous les types de données de colonnes JMP sont pris en charge par Python. Des objets supplémentaires prennent en charge les expressions et les états de ligne.
L'objet jmp.DataTable ajoute une propriété row_states pour permettre la définition des états des lignes de la table depuis Python. Cela simplifie la copie de l'ensemble des états des lignes vers une colonne ou la définition des états des lignes de la table à partir d'une colonne.

Le format des colonnes d'une table est désormais accessible via col.format avec une chaîne ou un tuple, selon le cas d'utilisation. JMP 19 assure une bonne gestion entre la représentation date-heure de JMP et celle de Python : dates JMP dans la table de données, objets date-heure Python issus du code Python.

De même, Python Get()/Python Send() prend désormais en charge le transfert transparent des valeurs de date et d'heure entre Python et JSL.
En plus de la possibilité de formater les colonnes, Columns peut également ajouter des formules, en utilisant col.formula avec jmp.Expressions.

JMP 19 permet également de définir jmp.Images comme valeurs de colonne d'expression.
D'autres opérations de table de données non mises en évidence peuvent être trouvées à l'aide de l'index de script sous la catégorie Python.
Interopérabilité Python-JSL
De nombreux workflows nécessitent encore la prise en charge de JSL pour effectuer des tâches spécifiques dans JMP. Afin d'optimiser le workflow multilingue, la prise en charge de l'ajout, de la lecture et de la modification de variables JSL depuis Python a été ajoutée. Actuellement, cette prise en charge n'est possible que via les espaces de noms Global et Here. L'exemple ci-dessous montre comment Python définit la variable JSL « e » depuis Python, puis utilise JSL pour définir la variable here::pi et afficher l'ensemble de variables globals ::e depuis Python, puis affiche l'ensemble de variables here::pi depuis JSL depuis Python.

Intégration R
JMP 19 introduit une prise en charge initiale de R via Python via rpy2. JMP fournit un nouveau module, jmpex , pour la prise en charge des extensions. R est la seule extension actuellement prise en charge par jmpex. Cette prise en charge consiste en une API Python similaire à l'API R de JSL. Le package jmpex est une couche d'interface entre JMP et rpy2, qui dépend elle-même de R. Une version de R installée par l'utilisateur doit déjà être présente sur le système et la variable d'environnement R_HOME doit être définie sur l'emplacement de R. Ces éléments doivent être présents avant l'installation de jmpex ou le premier appel de R Init(), conformément aux exigences du package jmpex.
La prise en charge JSL pour R a été restaurée dans JMP 19 en utilisant le package jmpex en interne.
L'exemple ci-dessous illustre la nouvelle API Python pour R fournie par jmpex.

Modifications générales
Le passage de Python 3.11 (JMP 18) à Python 3.13 (JMP 19) apporte des mises à jour de sécurité tout au long du cycle de vie de JMP 19. JMP 19 offre également un moyen pratique de réinitialiser l'environnement Python partagé via jmp.reset(). jmputils a également été amélioré :
- jmputils.__version__
- jmputils.is_installed('package')
- jmputils.packages()
- jmputils.package_version('package')
Pour une meilleure prise en charge de l'installation scriptée des packages, jmputils.jpip() renvoie désormais l'objet Python subprocess.CompletedProcess. Consultez la documentation Python pour plus d'informations sur l'objet CompletedProcess.
Dépréciations
- Python Init()
- Terme Python()
- Contrôle Python()Supprimé.
- Python Obtenir des graphiques() Supprimé.
- Terme R()
- R Obtenir des graphiques()Obsolète, n'a aucun effet.
- Contrôle R( Echo (booléen) )ParamètresAsynchrone( ),etInterrompre( )
Quelle est la prochaine étape ?
JMP 18 visait à établir de nouvelles bases pour la prise en charge d'un workflow Python natif au sein de JMP. Cette base a commencé par la résolution des problèmes les plus complexes liés à l'intégration de JMP et Python.
JMP 19 continue de s'appuyer sur ces bases, en se concentrant sur le perfectionnement et en offrant une prise en charge significativement plus poussée des tables de données. Notre objectif est d'offrir la même capacité à manipuler des tables de données depuis Python que celle offerte par JSL. Tous les types de colonnes sont désormais pris en charge depuis Python. Le formatage des colonnes et l'état des lignes sont accessibles et modifiables depuis des scripts Python.
La prise en charge complète des types de colonnes a permis la prise en charge du protocole de trame de données portable. La conversion aisée entre les trames de données portables, y compris Pandas et un objet jmp.DataTable, a été restaurée, ce qui préserve le fonctionnement en mémoire, sans recourir à une copie CSV dans le système de fichiers.
De plus, l'accent a été mis sur l'amélioration de la productivité, en nettoyant le comportement de nos objets afin qu'ils se comportent comme un programmeur Python l'attend. Enfin, la nouvelle version corrige certains problèmes qui avaient été négligés dans JMP 18 ou qui avaient été dépassés en termes de développement avant la sortie.
L'intégration Python a un avenir prometteur. Au sein de JMP, nous nous appuyons sur nos propres capacités Python : la restauration de la connectivité SAS, la restauration de la prise en charge JSL R, une nouvelle API Python pour R et des connecteurs de données, tous basés sur l'intégration Python.
Regarder vers l’avenir est toujours spéculatif, mais il y a quelques éléments sur lesquels nous recherchons des éléments à inclure dans les prochaines versions :
- Améliorations continues de la prise en charge de l'éditeur de scripts.
- Prise en charge JMP pour les environnements virtuels Python.
- Amélioration supplémentaire de la prise en charge de la gestion des packages, notamment :
- Options de configuration pour se connecter aux référentiels d'entreprise ou internes.
- Méthodes simplifiées de création de packages de sites validés et verrouillés par un administrateur de site.
- Prise en charge de la création de boîtes de dialogue et de fenêtres à partir de Python qui permettent de créer des graphiques et des rapports à partir de Python.
Vos suggestions sont très appréciées, car nous souhaitons nous concentrer sur les domaines qui amélioreront le plus votre flux de travail.
Blog co-écrit par @Paul_Nelson .
C'est fantastique ! JMP et Python se complètent naturellement, et nous les avons largement utilisés dans JMP v18. L'implémentation est étonnamment claire pour l'utilisateur, et j'ai pu l'utiliser presque immédiatement. Les mises à jour de JMP v19 sont superbes, notamment en ce qui concerne les états des lignes, les formules et la gestion des dates et heures.
Quelques commentaires/suggestions :
- Arrêt. Lors de l'exécution de scripts Python dans JMP (v18+), si un script contient une boucle infinie telle que « while True: pass », la session JMP entière cesse de répondre et doit être forcée à quitter. Il serait extrêmement utile que JMP propose un moyen d'interrompre ou d'arrêter un script Python en cours d'exécution, comme un bouton d'arrêt ou un mécanisme de temporisation, sans arrêter l'application entière.
- Intégration. Il serait utile que JMP permette l'intégration de scripts Python dans une table de données (à moins que cela ne soit déjà possible ?).
- Obtenir les données utilisateur. Il serait également utile que Python puisse demander à JMP d'ouvrir une boîte de dialogue modale pour recueillir les données utilisateur.
De toute évidence, les formules de colonnes basées sur Python seraient également incroyables, mais je pense que c'est une tâche difficile.
Bravo à vous et votre équipe, excellent travail !!
En ce qui concerne
1. Arrêt. Il est déjà possible d'interrompre le processus. Cela nécessite d'insérer une instruction jmp.run_jsl('Wait(0);') dans la boucle active. En repassant périodiquement le contrôle à JMP, le mécanisme ESC normal permet d'annuler le script.
2. Nous y pensons, ce n'est pas encore possible, sauf en tant que JSL qui enveloppe les appels Python JSL.
3. Nous y pensons, mais vous pouvez appeler le code de la boîte de dialogue JSL via jmp.run_jsl(). L'un des exemples JMP 18, celui qui effectue le hachage MD5 d'un répertoire et crée une table de données SQLite, fait exactement cela : il appelle JSL pour une boîte de dialogue de sélection de répertoire depuis le script Python afin de fournir le chemin d'accès au répertoire.