Die neueste Version von JMP baut auf der in JMP 18 eingeführten Python-Integrationsunterstützung auf und konzentriert sich auf einen grundlegenden Teil des Workflows: den Datenzugriff. Durch die Erweiterung der Datentabellenoperationen und der Python-JSL-Interoperabilität wird der Datenzugriff einfach und bequem.
Bevorzugen Sie ein Video? Sehen Sie es sich hier an.
Datentabellenvorgänge
Die Funktion jmp.from_dataframe() bietet eine effiziente Möglichkeit, externe Datenrahmen in JMP-Datentabellen zu konvertieren. Das Datenrahmenprotokoll ermöglicht die Konvertierung zwischen Datenrahmen im Speicher. Alle Datenrahmenobjekte, die das Datenrahmenaustauschprotokoll unterstützen, können zwischen Datenrahmen im Speicher konvertieren. Bemerkenswerte Beispiele sind Pandas, Polars und Ibis.
Das folgende Beispiel zeigt die Umwandlung eines Pandas-Datenrahmens in eine JMP-Datentabelle.

Ebenso einfach ist es, JMP-Datentabellen in einen anderen unterstützten Datenrahmenbibliothekstyp zu konvertieren. Zum Beispiel von JMP zu Pandas:

In JMP 18 bot jmp.DataTable nur vollständige Unterstützung für numerische und Zeichenspalten. Jetzt werden alle JMP-Spaltendatentypen von Python unterstützt. Zusätzliche Objekte bieten Unterstützung für Ausdrücke und Zeilenstatus.
Das jmp.DataTable-Objekt fügt die Eigenschaft row_states hinzu, um die Zeilenzustände der Tabelle über Python festlegen zu können. Dies vereinfacht das Kopieren der Zeilenzustände in eine Spalte oder das Festlegen der Tabellenzeilenzustände aus einer Spalte.

Auf das Spaltenformat einer Tabelle kann jetzt je nach Anwendungsfall über col.format mit einer Zeichenfolge oder einem Tupel zugegriffen werden. JMP 19 führt eine ordnungsgemäße Zuordnung zwischen der Datums-/Uhrzeitdarstellung von JMP und der Datums-/Uhrzeitdarstellung von Python durch: JMP-Daten in der Datentabelle, Datums-/Uhrzeitobjekte von Python aus Python-Code.

Ebenso unterstützt Python Get()/Python Send() jetzt die nahtlose Übertragung von Datums- und Uhrzeitwerten zwischen Python und JSL.
Zusätzlich zur Möglichkeit, Spalten zu formatieren, können Spalten auch Formeln hinzufügen, indem col.formula mit jmp.Expressions verwendet wird.

JMP 19 ermöglicht auch das Festlegen von jmp.Images als Ausdrucksspaltenwerte.
Andere nicht hervorgehobene Datentabellenvorgänge finden Sie im Skriptindex unter der Kategorie Python.
Python-JSL-Interoperabilität
Viele Workflows benötigen weiterhin JSL-Unterstützung, um bestimmte Aufgaben in JMP auszuführen. Um den sprachübergreifenden Workflow zu verbessern, wurde Unterstützung für das Hinzufügen, Lesen und Ändern von JSL-Variablen aus Python hinzugefügt. Derzeit wird dies nur über die Namespaces „Global“ und „Here“ unterstützt. Das folgende Beispiel zeigt, wie Python die JSL-Variable „e“ aus Python setzt, dann JSL verwendet, um die Variable „here::pi“ zu setzen und den Variablensatz „globals::e“ aus Python auszudrucken, und schließlich den Variablensatz „here::pi“ aus JSL aus Python ausdruckt.

R-Integration
JMP 19 führt eine erste Unterstützung für R über Python mit rpy2 ein. JMP bietet ein neues Modul, jmpex , zur Unterstützung von Erweiterungen. R ist die einzige Erweiterung, die jmpex derzeit unterstützt. Diese Unterstützung besteht aus einer Python-API ähnlich der JSL R-API. Das Paket jmpex ist eine Schnittstellenschicht zwischen JMP und rpy2, das wiederum von R abhängt. Eine vom Benutzer installierte Version von R muss bereits auf dem System vorhanden sein, und die Umgebungsvariable R_HOME muss auf den R-Speicherort gesetzt sein. Diese müssen aufgrund der jmpex-Paketanforderungen vorhanden sein, bevor jmpex installiert wird oder R Init() zum ersten Mal aufgerufen wird.
Die JSL-Unterstützung für R wurde in JMP 19 durch interne Verwendung des jmpex-Pakets wiederhergestellt.
Das folgende Beispiel veranschaulicht die neue Python-API für R, die von jmpex bereitgestellt wird.

Allgemeine Änderungen
Der Wechsel von Python 3.11 in JMP 18 zu Python 3.13 in JMP 19 bietet Sicherheitsupdates während des gesamten Lebenszyklus von JMP 19. JMP 19 bietet außerdem eine bequeme Möglichkeit, die gemeinsam genutzte Python-Umgebung über jmp.reset() zurückzusetzen. Es gibt auch Verbesserungen bei jmputils:
- jmputils.__version__
- jmputils.is_installed('Paket')
- jmputils.packages()
- jmputils.package_version('Paket')
Um die skriptbasierte Installation von Paketen besser zu unterstützen, gibt jmputils.jpip() jetzt das Python-Objekt subprocess.CompletedProcess zurück. Informationen zum CompletedProcess-Objekt finden Sie in der Python-Dokumentation.
Veraltete Funktionen
- Python Init()
- Python Term()
- Python-Steuerung()ENTFERNT.
- Python Get Graphics() ENTFERNT.
- R Term()
- R Grafiken abrufen()Veraltet, hat keine Wirkung.
- R-Steuerung(Echo (bool))ParameterAsync( ),UndUnterbrechen( )
Wie geht es weiter?
Bei JMP 18 ging es darum, eine neue Grundlage für einen nativen Python-Workflow innerhalb von JMP zu schaffen. Diese Grundlage begann mit der Behebung der größten Herausforderungen bei der Integration von JMP und Python.
JMP 19 baut auf dieser Grundlage auf und konzentriert sich auf die Verfeinerung und bietet deutlich erweiterte Datentabellenunterstützung. Unser Ziel ist es, die gleichen Möglichkeiten zum Arbeiten mit Datentabellen in Python bereitzustellen wie in JSL. Alle Spaltentypen werden nun in Python unterstützt. Spaltenformatierung und Zeilenstatus sind über Python-Skripte zugänglich und änderbar.
Die Fertigstellung der Spaltentypunterstützung ermöglichte die Unterstützung des portablen Datenrahmenprotokolls. Die einfache Konvertierung zwischen portablen Datenrahmen, einschließlich Pandas und einem jmp.DataTable-Objekt, wurde wiederhergestellt, wodurch die Arbeit im Arbeitsspeicher erhalten bleibt, ohne dass auf eine CSV-Kopie im Dateisystem zurückgegriffen werden muss.
Darüber hinaus lag der Fokus auf Produktivitätsverbesserungen und der Bereinigung des Objektverhaltens, sodass es sich wie ein Python-Programmierer verhalten würde. Schließlich behebt die neue Version einige Probleme, die in JMP 18 übersehen wurden oder für die vor der Veröffentlichung keine Entwicklungszeit mehr zur Verfügung stand.
Die Zukunft der Python-Integration ist vielversprechend. Innerhalb von JMP bauen wir auf unseren eigenen Python-Funktionen auf: Wiederherstellung der SAS-Konnektivität, Wiederherstellung der JSL R-Unterstützung, eine neue Python-API für R und Datenkonnektoren, die alle auf der Python-Integration aufbauen.
Der Blick in die Zukunft ist immer spekulativ, aber es gibt ein paar Dinge, die wir für eine mögliche Aufnahme in zukünftige Versionen untersuchen:
- Kontinuierliche Verbesserungen der Skript-Editor-Unterstützung.
- JMP-Unterstützung für virtuelle Python-Umgebungen.
- Zusätzliche Verbesserungen bei der Paketverarbeitungsunterstützung, darunter:
- Konfigurationsoptionen zum Herstellen einer Verbindung mit Unternehmens- oder internen Repositories.
- Vereinfachte Möglichkeiten zum Erstellen validierter und gesperrter Site-Pakete durch einen Site-Administrator.
- Unterstützung für das Erstellen von Dialogen und Fenstern aus Python, die das Erstellen von Grafiken und Berichten aus Python ermöglichen.
Wir freuen uns über Ihre Vorschläge, da wir uns auf die Bereiche konzentrieren möchten, die Ihren Arbeitsablauf am meisten verbessern.
Mitverfasser des Blogs: @Paul_Nelson .
Das ist fantastisch. JMP und Python sind natürliche Begleiter, und wir haben es in JMP v18 ausgiebig genutzt. Die Implementierung ist aus Benutzersicht erstaunlich sauber, und ich konnte sie fast sofort nutzen. Die JMP v19-Updates sehen fantastisch aus, insbesondere Zeilenzustände, Formeln und Datums-/Uhrzeitverarbeitung.
Einige Kommentare/Vorschläge:
- Anhalten. Wenn beim Ausführen von Python-Skripten in JMP (v18+) ein Skript eine Endlosschleife wie „while True: pass“ enthält, reagiert die gesamte JMP-Sitzung nicht mehr und muss zwangsweise beendet werden. Es wäre äußerst hilfreich, wenn JMP eine Möglichkeit bieten würde, ein laufendes Python-Skript zu unterbrechen oder anzuhalten – beispielsweise über eine Stopp-Schaltfläche oder einen Timeout-Mechanismus –, ohne die gesamte Anwendung zu beenden.
- Einbettung. Es wäre hilfreich, wenn JMP das Einbetten von Python-Skripten in eine Datentabelle ermöglichen würde (es sei denn, dies ist bereits irgendwie möglich?).
- Benutzereingaben abrufen. Es wäre auch hilfreich, wenn Python JMP auffordern könnte, einen modalen Dialog auszugeben, um Eingaben vom Benutzer zu erhalten.
Natürlich wären auch Python-basierte Spaltenformeln unglaublich, aber ich gehe davon aus, dass das eine große Herausforderung ist.
Ein großes Lob an Sie und Ihr Team, tolle Arbeit!!
In Bezug auf
1. Anhalten. Es besteht bereits die Möglichkeit, den Prozess abzubrechen. Dazu muss jmp.run_jsl('Wait(0);') in die Hot-Loop eingefügt werden. Durch die regelmäßige Rückgabe der Kontrolle an JMP ermöglicht der normale ESC-Mechanismus den Abbruch des Skripts.
2. Wir denken, dass dies noch nicht möglich ist, außer als JSL, das die JSL-Python-Aufrufe umschließt.
3. Wir denken darüber nach, aber Sie können den JSL-Dialogcode über jmp.run_jsl() aufrufen. Eines der JMP 18-Beispiele, das einen MD5-Hash eines Verzeichnisses erstellt und eine SQLite-Datentabelle erstellt, tut genau das: Es ruft jsl für einen Verzeichnisauswahldialog aus dem Python-Skript auf, um den Verzeichnispfad zum Python-Skript bereitzustellen.