L'ultima versione di JMP si basa sul supporto all'integrazione con Python introdotto in JMP 18, concentrandosi su una parte fondamentale del flusso di lavoro: l'accesso ai dati. Ampliando le operazioni sulle tabelle dati e l'interoperabilità Python-JSL, l'accesso ai dati diventa semplice e pratico.
Preferisci il video? Guardalo qui.
Operazioni sulla tabella dati
La funzione jmp.from_dataframe() fornisce un modo efficiente per convertire data frame esterni in tabelle dati JMP. Il protocollo data frame fornisce il meccanismo per la conversione tra data frame in memoria. Tutti gli oggetti data frame che supportano il protocollo di scambio data frame possono convertire tra data frame in memoria. Esempi degni di nota sono pandas, polars e ibis.
L'esempio seguente mostra la trasformazione di un data frame pandas in una tabella dati JMP.

Allo stesso modo, è altrettanto semplice trasformare le tabelle dati JMP in un altro tipo di libreria di data frame supportata. Ad esempio, da JMP a pandas:

In JMP 18, jmp.DataTable forniva supporto completo solo per le colonne Numeric e Character. Ora, tutti i tipi di dati delle colonne JMP sono supportati da Python. Ulteriori oggetti forniscono supporto per Expression e Row State.
L'oggetto jmp.DataTable aggiunge una proprietà row_states per consentire l'impostazione degli stati di riga della tabella da Python. Semplifica la possibilità di copiare l'insieme degli stati di riga in una colonna o di impostare gli stati di riga della tabella da una colonna.

Il formato delle colonne di una tabella è ora accessibile tramite col.format con una stringa o una tupla, a seconda del caso d'uso. JMP 19 esegue correttamente il marshalling tra la rappresentazione data-ora di JMP e la rappresentazione data-ora di Python: date JMP nella tabella dati, oggetti data-ora Python dal codice Python.

Allo stesso modo, Python Get()/Python Send() ora supporta il trasferimento senza interruzioni di valori di data e ora tra Python e JSL.
Oltre alla possibilità di formattare le colonne, Columns può anche aggiungere formule, utilizzando col.formula con jmp.Expressions.

JMP 19 consente inoltre di impostare jmp.Images come valori della colonna di espressione.
Altre operazioni sulle tabelle dati non evidenziate possono essere trovate utilizzando l'indice di scripting nella categoria Python.
Interoperabilità Python-JSL
Molti flussi di lavoro richiedono ancora il supporto JSL per eseguire attività specifiche in JMP. Per migliorare il flusso di lavoro multilinguaggio, è stato aggiunto il supporto per l'aggiunta, la lettura e la modifica di variabili JSL da Python. Attualmente, è supportato solo tramite gli spazi dei nomi Global e Here. L'esempio seguente mostra Python che imposta la variabile JSL 'e' da Python, quindi utilizza JSL per impostare la variabile here::pi e stampare il set di variabili globals ::e da Python, e infine stampa da Python il set di variabili here::pi da JSL.

Integrazione R
JMP 19 introduce un supporto iniziale per R tramite Python utilizzando rpy2. JMP fornisce un nuovo modulo, jmpex , per supportare le estensioni. R è l'unica estensione attualmente supportata da jmpex. Questo supporto consiste in un'API Python simile all'API JSL di R. Il pacchetto jmpex è un livello di interfaccia tra JMP e rpy2, che a sua volta dipende da R. Una versione di R installata dall'utente deve essere già presente sul sistema e la variabile d'ambiente R_HOME deve essere impostata sulla posizione di R. Queste devono essere presenti prima dell'installazione di jmpex o prima che R Init() venga chiamato per la prima volta a causa dei requisiti del pacchetto jmpex.
Il supporto JSL per R è stato ripristinato in JMP 19 utilizzando internamente il pacchetto jmpex.
L'esempio seguente illustra la nuova API Python per R fornita da jmpex.

Cambiamenti generali
Il passaggio da Python 3.11 in JMP 18 a Python 3.13 in JMP 19 fornisce aggiornamenti di sicurezza per l'intero ciclo di vita di JMP 19. JMP 19 offre anche un modo pratico per reimpostare l'ambiente Python condiviso tramite jmp.reset(). Sono stati apportati anche miglioramenti a jmputils:
- jmputils.__versione__
- jmputils.is_installed('pacchetto')
- jmputils.packages()
- jmputils.package_version('pacchetto')
Per supportare meglio l'installazione tramite script dei pacchetti, jmputils.jpip() ora restituisce l'oggetto Python subprocess.CompletedProcess. Consultare la documentazione Python per informazioni sull'oggetto CompletedProcess.
Deprecazioni
- Python Init()
- Python Term()
- Controllo Python()RIMOSSO.
- Python Ottieni grafica() RIMOSSO.
- R Termine()
- R Ottieni grafica()Obsoleto, non ha alcun effetto.
- Controllo R (Echo (bool))ParametriAsincrono( ),EInterrompere( )
Cosa succederà adesso?
JMP 18 si è concentrato sulla creazione di una nuova base per supportare un flusso di lavoro Python nativo all'interno di JMP. Questa base è iniziata risolvendo i problemi più complessi dell'integrazione tra JMP e Python.
JMP 19 continua a basarsi su queste basi, concentrandosi sul perfezionamento e fornendo un significativo supporto aggiuntivo per le tabelle dati. Il nostro obiettivo è fornire la stessa capacità di lavorare con una tabella dati in Python disponibile in JSL. Tutti i tipi di colonna sono ora supportati da Python. La formattazione delle colonne e gli stati delle righe sono accessibili e modificabili tramite script Python.
Il completamento del supporto per i tipi di colonna ha consentito il supporto del protocollo dei data frame portatili. È stata ripristinata la facile conversione tra data frame portatili, inclusi pandas e un oggetto jmp.DataTable, che preserva il funzionamento in memoria, senza dover ricorrere a una copia CSV nel file system.
Inoltre, l'attenzione si è concentrata sul miglioramento della produttività, ripulendo il comportamento dei nostri oggetti in modo che si comportino come un programmatore Python si aspetterebbe. Infine, la nuova release risolve alcuni problemi che erano stati trascurati in JMP 18 o che non erano stati affrontati prima del rilascio.
Il futuro dell'integrazione con Python è solido. All'interno di JMP stiamo sviluppando ulteriormente le nostre capacità Python: il ripristino della connettività SAS, il ripristino del supporto JSL per R, una nuova API Python per R e connettori dati, tutti basati sull'integrazione Python.
Guardare al futuro è sempre speculativo, ma ci sono alcune cose che stiamo studiando per una possibile inclusione nelle versioni future:
- Miglioramenti continui al supporto dell'editor di script.
- Supporto JMP per ambienti virtuali Python.
- Ulteriori miglioramenti al supporto per la gestione dei pacchi, tra cui:
- Opzioni di configurazione per connettersi a repository aziendali o interni.
- Metodi semplificati per creare pacchetti di siti convalidati e bloccati da parte di un amministratore del sito.
- Supporto per la creazione di finestre e dialoghi da Python che consentono di creare grafici e report da Python.
I tuoi suggerimenti sono molto apprezzati, poiché vogliamo concentrarci sulle aree che miglioreranno maggiormente il tuo flusso di lavoro.
Blog scritto in collaborazione con @Paul_Nelson .
È fantastico, JMP e Python sono compagni naturali e li abbiamo usati ampiamente in JMP v18. L'implementazione è incredibilmente pulita dal punto di vista dell'utente e sono stato in grado di utilizzarla quasi immediatamente. Gli aggiornamenti di JMP v19 sono fantastici, soprattutto per quanto riguarda gli stati delle righe, le formule e la gestione di data/ora.
Alcuni commenti/suggerimenti:
- Arresto. Quando si eseguono script Python in JMP (v18+), se uno script contiene un ciclo infinito come "while True: pass", l'intera sessione JMP non risponde più e deve essere forzata la chiusura. Sarebbe estremamente utile se JMP fornisse un modo per interrompere o bloccare uno script Python in esecuzione, ad esempio tramite un pulsante di arresto o un meccanismo di timeout, senza terminare l'intera applicazione.
- Incorporamento. Sarebbe utile se JMP consentisse di incorporare gli script Python in una tabella dati (a meno che ciò non sia già possibile in qualche modo?).
- Ottenere l'input dell'utente. Sarebbe anche utile se Python potesse richiedere a JMP di aprire una finestra di dialogo modale per ottenere l'input dell'utente.
Ovviamente anche le formule di colonna basate su Python sarebbero incredibili, ma immagino che sia un compito arduo.
Complimenti a te e al tuo team, ottimo lavoro!!
Riguardo a
1. Arresto. Esiste già una possibilità per interrompere il processo. Dipende dall'inserimento di jmp.run_jsl('Wait(0);') all'interno del ciclo attivo. Passando periodicamente il controllo a JMP, il normale meccanismo ESC darà la possibilità di annullare lo script.
2. Pensiamo che non sia ancora possibile, se non come JSL che racchiude le chiamate JSL Python.
3. È nelle nostre menti, ma è possibile richiamare il codice della finestra di dialogo JSL tramite jmp.run_jsl(). Uno degli esempi di JMP 18, quello che esegue un hash md5 di una directory e crea una tabella dati sqlite, fa esattamente questo: richiama jsl per una finestra di dialogo di selezione directory dallo script Python per fornire il percorso della directory allo script Python.