Questa presentazione delinea i nuovi e significativi aggiornamenti al supporto di JMP 18 per Python, che fornisce un'integrazione molto più stretta con Python e un'esperienza utente incentrata su Python significativamente migliore. In JMP 18 sarai in grado di:
Queste funzionalità JMP esposte a Python si espanderanno nel tempo, ma l'attenzione attuale è rivolta alle funzionalità critiche e al supporto dei dati in memoria. In questa presentazione potrai ascoltare in prima persona le modifiche e le motivazioni che ne stanno alla base, nonché osservare le nuove funzionalità fornite agli utenti JMP. Vengono discusse l'estensibilità e la capacità di importazione dei dati attraverso l'uso di pacchetti Python esterni e viene dimostrato l'accesso alle GPU tramite l'interfaccia Python utilizzando pacchetti esterni.
Ciao, sono Paul Nelson. Sono qui per parlare di JMP, Python e del nostro prossimo passo. Dopo una delle presentazioni precedenti dell'anno scorso, abbiamo deciso che potevamo migliorare il nostro gioco. JMP, Python aveva margini di miglioramento, ed è di questo che parlerò qui.
Le sfide più grandi che i clienti hanno dovuto affrontare riguardavano JMP da 14 a 17 semplicemente facendo funzionare il supporto Python. Se funzionasse. Ha funzionato bene. Troppo spesso non è stato così. Con numerose distribuzioni Python e ambienti diversi che ci hanno reso difficili i test.
Anaconda potrebbe essere fatto funzionare su Windows a volte e gli ambienti virtuali Python potrebbero essere fatti funzionare a volte. L'ambiente, poiché ognuno aveva Python diversi, uno script non poteva nemmeno dipendere da una versione Python comune nell'ambiente dell'utente.
La modifica del codice Python nell'editor JSON è stata difficile e spiacevole. Un linguaggio in cui i blocchi di codice sono delimitati da spazi. Quando devi incollarlo come stringa in JSL, diventa difficile. La segnalazione degli errori insufficiente nelle vecchie versioni di JMP di Python rendeva difficile il debug degli script Python.
Infine, i trasferimenti della tabella dati e della matrice sono stati eseguiti tramite il file system e con una tabella dati è stato eseguito come file CSV, il che è lento se si dispone di dati di grandi dimensioni. La classe grande funziona bene, ma i dati più grandi sono lenti.
La visione che abbiamo avuto è quella di assicurarci che l'integrazione di Python funzioni. Nessuna configurazione necessaria. A tal fine, abbiamo sepolto una versione Python 3.115 e JMP 18.0 ed è installato come parte di JMP. È un ambiente comune e tutti gli utenti avranno la stessa versione di Python con la stessa versione di JMP.
Siamo andati oltre e ci siamo assicurati che il flusso di dati tra JSL e Python avvenga tramite trasferimenti in memoria e senza accesso in copia alla memoria. Lo abbiamo reso un ambiente invitante e produttivo per i programmatori Python. Ora disponiamo anche di un editor di script Python in cui è presente la colorazione del codice e l'evidenziazione della sintassi.
Puoi eseguire script Python puri direttamente dall'editor di script e dall'interno dell'ambiente Python, puoi ottenere l'accesso diretto ai dati JMP, al registro, puoi chiamare JSL e accedere ai dati da Python. Abbiamo notevolmente migliorato la segnalazione degli errori nel registro JMP e nel registro incorporato.
Poiché è un ambiente comune ora possiamo testarlo e verificarlo. Il nostro ambiente è lo stesso che dovresti vedere. Abbiamo aggiunto un'intera categoria Python nello Scripting Index per corrispondere... per spiegare e mostrare esempi di ciò che è ora disponibile con il pacchetto import JMP e un paio di altri pacchetti di utilità.
L'altro lato di ciò è che questo ci dà la possibilità di estendere le capacità di JMP attraverso la vasta libreria di pacchetti di Python. Non stiamo tentando di creare un JSL alternativo uno a uno. Stiamo invece cercando di fornire un ambiente familiare e produttivo per la programmazione Python all'interno di JMP.
Questa è modernizzazione, rinnovamento e revisione. Alcune delle decisioni di progettazione originali per l'integrazione Python di JMP prevedevano limitazioni. Abbiamo fatto ogni sforzo per ridurre al minimo le rotture dovute al cambiamento, fornendo allo stesso tempo una base forte e stabile per il futuro.
Ci sono tutte le aspettative che la rottura sia limitata a questa transizione a JMP. L'aspetto chiave è che ora supportiamo solo la versione Python fornita con JMP. Consideralo come un ambiente virtuale JMP privato.
L'altra cosa che accadrà negli script è che abbiamo cambiato il modo in cui funziona l'invio di una tabella di dati da parte di Python. Ora crea un JMP con l'oggetto tabella dati. Questo è l'accesso in tempo reale alla tabella dati JMP. La copia in memoria, è possibile modificare e modificare la tabella esistente. Non è più una copia.
JMP da 14 a 17, ha creato un oggetto DataFrame panda copiando i dati tramite un file CSV temporaneo nel file system. Per dati di grandi dimensioni. L'esportazione in CSV esplode, diventa molto grande e lenta. Hai anche il problema della potenziale perdita di precisione perché stai passando da un formato binario a un formato di testo e torni dal testo a un formato binario.
Se hai davvero bisogno della stessa funzionalità, abbiamo fornito un DT a Pandas Python nei file di esempio che fornisce una funzione per due panda. Funziona come prima funzionava internamente. Crea un file CSV temporaneo e dice ai panda di importare il file CSV.
C'è anche un esempio da JMP a Panda che mostra come creare un DataFrame Panda in memoria da un oggetto JMP Data Table che sta costruendo una colonna in Panda con una colonna dalla colonna JMP alla volta.
Python Send Matrix era un altro utilizzato per scrivere attraverso il file system. Scriverebbe un file di double per fare in modo che NumPy legga il file. Ciò ora avviene internamente attraverso la memoria ed è un riferimento vivo alla matrice anziché una copia.
La maggior parte dell'API Python JSL rimane intatta. Le modifiche coinvolte riguardavano principalmente la rimozione di argomenti e funzioni obsoleti utilizzati per configurare il supporto Python originale per scegliere una versione di Python.
L'unica rimozione dell'API è stata la funzione grafica di recupero di Python, che recuperava un'immagine da Matplotlib e nel nostro indice di scripting abbiamo un esempio che mostra esattamente come fare la stessa cosa che JMP faceva internamente solo con codice JSL e Python. Mostralo già. Vediamo. Usciamo dalla demo.
Qui abbiamo JMP. Una delle cose che voglio mostrare è che vedrai le icone Python nelle barre degli strumenti e nel menu file nuovo abbiamo lo script JSON, ma ora abbiamo un nuovo script Python. Faremo apparire l'editor di script Python.
Possiamo usare show the embedded log. Abbiamo un pacchetto di importazione JMP. Importa JMP. Abbiamo fatto del nostro meglio per assicurarci di inserire stringhe di documenti Python in modo che tu possa eseguire, aiutare JMP Python. Possiamo eseguire quello script. Vedrai che abbiamo documentato gli oggetti e le funzioni all'interno di questo pacchetto di importazione JMP di livello superiore.
Ci sono un sacco di costanti. Sono rappresentate la maggior parte delle directory speciali. Quindi possiamo farlo. E ora lo faccio da Python. JMP aperto. JMP, beh, non posso scrivere oggi, JMP. DATI CAMPIONE. Più. Grande capo. E proprio come in JSL, possiamo selezionare la riga di codice ed eseguirla nello script. E abbiamo una grande lezione.
Ora, questa non è una copia. Possiamo ottenere quell'oggetto. Avremmo potuto aprire TT uguale a JMP e avremmo un riferimento. Ma possiamo anche dire che TT è uguale a JMP.current. Questo ci darà un riferimento alla tabella dati corrente.
Bene, possiamo fare cose come stampare TT. Questo ci dice che è una grande classe. Sono cinque per 40 colonne. Ma anche. Più divertimento puoi fare. TT. Nome. E possiamo usare gli operatori di sezione Python. Gli sto dicendo di darci tutti gli altri nomi nella colonna dei nomi che iniziano con zero.
Indicizziamo in Python proprio come Python dovremmo indicizzare iniziando da zero. Il nostro indice della tabella dati è colonna per riga. Dal momento che siamo una colonna, il tipo di formato principale e se stampiamo. Ogni altro. Nome, prendiamo Katie. Jane. Lilly. James, Barbara, Susan, Joe e David.
Questo è un accesso live, quindi possiamo fare cose come... e possiamo fare cose come TT, e possiamo usare il nome o l'indice della colonna. Colonna che stampiamo. Questo ci dà, scegli. Ecco il tuo... ne ho scelto uno, giusto, Lewis. Scusa. Zerozero. È Katie. Poiché la tabella dati è attiva. Puoi fare Katie
Aspettare. Minuscolo. Caso misto. Ora vediamo l'output nel nostro registro incorporato. Lo noterai. Lo abbiamo modificato nella tabella dei dati. Ciò ti dà la possibilità di modificare le tabelle di dati, accedere alle tabelle di dati in modo Python e puoi creare tabelle di dati da Python. Abbiamo dato gli sforzi.
Ora abbiamo l'indice di scripting. Mostrerò il... qui, come ho detto, ottenere la grafica è deprecato. In realtà non è più una funzione valida in JMP, ma l'esempio nell'indice degli script mostra come passare da ciò che avevi in passato a come lo abbiamo effettivamente fatto internamente in JMP per salvare la figura, aprire l'immagine e creare una nuova finestra con l'immagine.
Una delle nuove interessanti funzionalità dell'ambiente incentrato su Python che si trovano nella categoria Python è una categoria tutta a sé. Il pacchetto di importazione JMP contiene oggetti tabella dati. Sono disponibili esempi per ognuno di essi in cui possiamo creare nuove colonne, aggiungere righe e salvare la tabella. Le proprietà su di esso, come ottenere i nomi delle tabelle. Tutto questo.
Questo creerebbe una nuova tabella dati basata su Python. Abbiamo anche un'utilità JMP. Dove puoi entrare, oppure possiamo usarlo per eseguire il pip JMP perché ha creato il proprio ambiente isolato. Quando installiamo i pacchetti, devono trovarsi nell'ambiente isolato di JMP
Si spera che non dovresti riscontrare problemi con i pacchetti che hai in JMP in conflitto con altre cose o altre installazioni di Python. L'abbiamo tenuto isolato. E quindi in questo caso, quindi se devi... abbiamo create jpip creerà uno script che avvolgerà lo script pip Python per consentirti l'installazione, oppure puoi effettivamente eseguirlo dalla classe utils JMP da gem.
Qui mostreremo l'elenco dei comandi list pip e questo verrà visualizzato. Chiama pip e restituisce l'elenco dei pacchetti che ho installato nel mio ambiente Python. Un altro esempio qui puoi effettivamente installare i pacchetti. E tutto ciò avverrà direttamente da JMP.
Ci sono un paio di avvertenze, motivo per cui esiste create jpip. Se un pacchetto viene caricato in memoria come NumPy, poiché ha una libreria condivisa. Windows e potrebbe impedirti di aggiornare quel pacchetto. Ci sono alcuni pacchetti che richiedono la compilazione. Potrebbe essere necessario eseguirli dalla riga di comando.
Alcuni di essi potrebbero funzionare, ma potrebbe essere necessario eseguirli dalla riga di comando. Ecco perché ti consigliamo di creare uno script wrapper jpip. Una volta eseguito, verrà visualizzato e ti fornirà una directory in cui scrivere il file, quindi seleziona la cartella e scriverà uno script wrapper jpip eseguibile dalla riga di comando.
Lì quando lo esegui, vuoi utilizzare il flag utente meno meno dopo l'installazione. Lo facciamo automaticamente per te quando viene chiamato da qui. C'è anche una funzione JSL che eseguirà anche l'installazione. I pacchetti di installazione di Python sono ancora più semplici. Puoi semplicemente eseguire lo script JSL e chiamerà pip in background, impostando correttamente tutte le variabili di ambiente necessarie per inserire il pacchetto nell'ambiente isolato di JMP.
Andiamo. Poi potremo continuare a mostrarvi altre demo. Queste sono le cose semplici e basilari. Ma quello che facevamo anche... parte dell'intero processo era rendere JMP più amichevole per Python e molto più semplice estendere le funzionalità di JMP attraverso pacchetti Python aggiuntivi.
Uno dei nostri frequenti percorsi di supporto che le persone desiderano è poter importare file di parquet. Questa demo prende ed estrae una tabella dal mio disco. Uno che ho scaricato da internet. Corretto. Quindi stampa la forma del file parquet e crea una tabella dati JMP colonna per colonna dai dati nel file parquet. Cancelleremo i registri. In realtà guardami mentre lo faccio.
Non ho eseguito lo script. Devo aver messo in evidenza alcune cose. Eccoci qua. Questo era un fascicolo sul parquet. Che abbiamo realizzato il parquet Pyrrow poiché PQ lo ha importato. Le proprietà dei file Parquet. Sono mille righe. La forma è di 13 colonne per mille righe. Lo schema mostra al principe lo schema con i nomi delle colonne.
Qui in fondo possiamo mostrare che una delle altre cose è che non abbiamo ancora finito con le cose che vogliamo migliorare sul lato Python, ma finché non arriviamo a questo puoi eseguire JSL da Python.
Anche se il codice Python non supporta ancora cose come l'impostazione, la larghezza di visualizzazione o persino la modifica dei tipi di colonna. Puoi creare una nuova colonna, ma non puoi modificarne il tipo da Python. Queste sono le cose a cui vogliamo arrivare, ma in questo momento hai una soluzione alternativa per poter eseguire script JSL da Python, proprio come sei riuscito a eseguire Python da JSL.
Ora, con questo ambiente migliorato, puoi effettuare chiamate avanti e indietro tra i due. Python può eseguire script JSL. Quale chiamata in Python può quindi essere eseguita nuovamente nell'ambiente JSL, in modo da poter annidare le chiamate per ottenere cose che altrimenti non sarebbero possibili. Si tratta di trasferire un file parquet di tipo dati che JMP non gestisce in modo nativo. Ma lo abbiamo fatto importando un pacchetto Python per supportarlo.
Una delle altre cose che mi stanno a cuore. Non sono un grande statistico, ma sono grafico e altra matematica. Qui utilizziamo Open Compute Language o OpenCL. Abbiamo importato il pacchetto OpenCL. Creare un frattale di Mandelbrot. Ti mostriamo prima la CPU. Farlo con la CPU. In realtà ci vorranno circa 16 secondi per essere eseguito.
Questo è doloroso e noterai che JMP stesso è lento. Non reattivo perché Python ha il controllo a questo punto. Se metti una cella in corsa in attesa all'interno di circuiti stretti, sarai in grado di riprendere il controllo. Questo sta usando la CPU per generare questo frattale.
Ora cambiamolo in modo che venga eseguita la GPU ed eseguiamo lo script. Boom. Ci vuole una frazione di secondo per generare l'immagine, salvarla e aprirla in uno script e vedere cosa diciamo. Ci sono voluti 16 secondi usando le GPU rispetto a... ma ogni volta torniamo abbastanza indietro. In realtà ci sono voluti 32 secondi mentre ero qui a presentare per farlo sulla CPU.
Questo si apre se desideri utilizzare la GPU con JMP, ora puoi farlo tramite Python. Abbiamo provato sia PyOpenCL che PyCuda, quindi se hai una scheda Nvidia e stai lavorando con Cuda. Puoi portare PyCuda o il più generico OpenCL. Migliora ulteriormente la capacità di elaborazione di JMP senza lasciare inutilizzata la potenza del tuo desktop.
Possiamo anche connetterci a SaaS tramite Python. SaaS ha un SaaS y. Package, e lo abbiamo installato in... e questo è parte di questo lavoro, roba che uno dei miei colleghi ha messo insieme. Cancellamo i log. In realtà vediamo quello che ho e possiamo eseguire lo script.
Lo sta raccogliendo come dovrebbe essere. Eccoci qui. Questo in realtà utilizza JSL per cercare di assicurarsi che tutti i pacchetti Python siano già installati che potrebbero essere necessari per eseguire lo script e puoi configurarlo. Fa parte di ciò che vedi qui nel registro che dice che sono già soddisfatti. Ecco tutti i risultati ottenuti dall'esecuzione dello script connesso a SaaS. Utilizzando il pacchetto SaaS Py, torneremo indietro nel registro.
Lo script viene visualizzato nel registro. Come ho detto qui. Abbiamo informazioni sulla connessione in cui si connette a SaaS, eseguendo i prodotti. La nostra logistica. Quindi restituendo i valori di output e la fine della sessione SaaS.
Abbiamo sentito che TensorFlow potrebbe essere una cosa a cui le persone sono interessate. Eccone una davvero semplice. Sbagliato, ancora una volta ho installato TensorFlow e questo viene eseguito da JSL, ma avremmo potuto facilmente eseguire questo codice qui da Python.
Esegue il flusso tensore e crea questa somma. Sono sicuro che ti verranno in mente usi molto più complicati di quelli che devo dimostrare. Py digest è un altro. È lo schermo. Ecco un esempio che ho creato per mostrare, uno era mostrare molte delle cose, inclusa l'esecuzione di JSL in cui mi consente di utilizzare per selezionare una directory utilizzando la directory di selezione di JMP, la directory di selezione di JSL e utilizzarla in uno script Python. Questo è tutto puro script Python. Mi permette di scegliere una directory.
Crea un checksum di ogni file nella directory. Lo inserisce in un database SQLite e quindi crea una tabella dati JMP dal database. Ti dà un po' di programmazione del database, dà un po' di JMP creando una tabella dati JMP da Python ed eseguendo JSL da Python.
Directory da scegliere. Ho molti dati qui, quindi scegliamo semplicemente la presentazione nella cartella del parquet o selezioniamo la cartella. Ora abbiamo una tabella di checksum. Hanno creato il... controlla ogni file nella directory, mi hanno fornito i nomi dei percorsi e un checksum MD5 del contenuto del file. Costruito il database. Crea la tabella dati JMP da Python e utilizza anche JSL per impostare le larghezze delle colonne.
Ancora una volta, è qualcosa che non abbiamo ancora implementato, ma è qualcosa sulla lista a cui prestare attenzione. Ma puoi fare cose da... puoi fare cose JSL dal tuo Python, se lo desideri.
Alcune persone potrebbero volerci R. Bene, in questo caso, ho creato una connessione utilizzando il nostro servizio sulla mia macchina e nel nostro ambiente. È stato semplicemente più semplice eseguire il nostro servizio da un sistema Windows per l'ambiente WSL Linux.
Ho un demone R-Serve che corre qui. E utilizzando il client riservato. Sto facendo solo un piccolo dettaglio, creando un vettore R sul server, sommando i risultati ed eseguendo questo script. Ci siamo connessi al nostro server. Otteniamo il vettore e sommiamo tutti gli elementi per ottenerne sei. Il nostro py2. Ci sono anche alcuni esempi di ciò che abbiamo. Se vuoi qualcosa di veramente semplice che funzioni dalla riga di comando, c'è un esempio su come utilizzare alcuni processi per sborsare ed eseguire R dalla riga di comando.
Infine, quella statistica in cui Jon Saul lo ha aiutato. Crea un esempio che utilizza il pacchetto Python per la scansione HDB. Una cosa da notare con Matplotlib. Matplotlib su Windows non ha un backend grafico, quindi se vuoi vedere qualche output, abbiamo scoperto che PyQt5 funziona meglio.
Come il back-end e. Sul Mac se usi Matplotlib, lo forzeremo ad essere AGG, il back-end non grafico se non lo hai installato. Uno dei PyQt5 o PySide. Poiché Matplotlib sul Mac utilizza automaticamente il backend Cocoa e c'è un bug che quando chiudi l'ultima finestra in Matplotlib sul Mac, causerà la chiusura di JMP.
Per proteggerci da ciò in cui stiamo forzando, se troviamo Matplotlib sul tuo sistema, se c'è un back-end, caricheremo Matplotlib e lo forzeremo a utilizzare il back-end Qt. Altrimenti, ci assicuriamo che sia un backend non grafico. Siamo arrivati al back-end. Ho PyQt5 sulla mia macchina. Con questo esempio eseguiamo alcuni clustering sulla scansione HDB.
Ora mostriamo il registro incorporato. Eseguiremo lo script. Ciò che otteniamo è una figura generata nella tabella Matplotlib dei dati. Qui puoi vedere che abbiamo aperto un JMP e abbiamo preso il riferimento DT. Questi sono i campioni che ho. Credere.
Riporterò la presentazione. Le nostre priorità per il prossimo futuro. Continui perfezionamenti e miglioramenti. Aumentare l'interoperabilità dei dati tra JMP e Python. Al momento, la limitazione all'interno della modifica delle colonne è che puoi creare colonne di qualsiasi tipo, ma puoi modificare e ottenere valori solo per colonne numeriche e di caratteri, colonne di espressioni o colonne di stato. La creazione di tabelle collegate verrà eseguita in futuro.
Sebbene l'editor di script Python supporti la colorazione del codice e l'evidenziazione della sintassi, non supporta ancora il rientro automatico. Cercheremo anche questo.
L'obiettivo della modernizzazione era far sì che l'integrazione di JMP Python funzionasse immediatamente. Dovresti essere in grado di essere produttivo con JMP e Python senza alcuna configurazione. Cioè, se non avesse funzionato sarebbe stato molto impegnativo. Perché non si riduce il tempo necessario ai programmatori Python per essere produttivi all'interno di JMP e creare JMP? Migliora l'abilità dei JMP. Diventa un hub analitico grazie alla facile espansione di JMP utilizzando pacchetti Python esterni.
Migliora la nostra capacità di caricare diversi formati di dati scritti da altre persone che hanno trascorso del tempo a scrivere come il formato parquet in cui noi, hdf5, abbiamo testato anche quello. Ci sono molti formati là fuori, più formati di quanti un team di sviluppo possa avere il tempo di scrivere internamente, ma in questo modo puoi inserire il pacchetto Python e puoi trasformarlo in una tabella dati JMP da quei dati e avere quella potenza all'interno di JMP.
Apprezzo il tuo tempo. Spero che quello che abbiamo fatto ti sia piaciuto e che tu sia molto interessato al feedback. Grazie.