JMP Live è una potente piattaforma per l'analisi e la visualizzazione di set di dati in continua crescita, soprattutto grazie alla sua capacità di aggiornare le tabelle da data warehouse connessi. Tuttavia, durante lo sviluppo di nuovi prodotti, queste pipeline risultano spesso incomplete e la raccolta di dati da più utenti o siti diventa una sfida logistica.
Ciao a tutti. Benvenuti alla mia presentazione. Mi chiamo Timothy Whetstone e sono qui con la mia co-relatrice, Sage Darling. Lavoriamo entrambi presso IDEXX Laboratories e questa presentazione verterà sull'utilizzo di JMP Live come data warehouse.
Abbiamo utilizzato JMP Live parecchio nell'ultimo anno. Pensiamo che sia davvero fantastico poter impostare tabelle con aggiornamento automatico per i nostri vari data warehouse già esistenti, quando disponiamo di pipeline robuste dalla sorgente della raccolta al warehouse e poi a JMP Live. È davvero fantastico per questo caso d'uso.
Dato che lo utilizziamo di più, abbiamo individuato alcuni potenziali casi d'uso che vorremmo che JMP Live fosse in grado di gestire, ma non ha le funzionalità necessarie per farlo in modo semplice e intuitivo. Questo accade soprattutto quando si dispone di una fonte dati o di una fonte di generazione dati che non si collega a un servizio cloud o a un grande data warehouse, dove si ottengono semplicemente file, dati e questi sono disponibili solo localmente. Soprattutto nei casi in cui si dispone di questo tipo di dati e si continuano a ottenere dati che appartengono effettivamente allo stesso set di dati finale per ciò che si sta cercando di mostrare, ma che si verificano temporaneamente nel tempo. Molti studi di tipo longitudinale sono aspetti a cui stavamo pensando mentre affrontavamo questo progetto.
Abbiamo questi file manuali. Vogliamo che siano tutti tracciati insieme, nello stesso posto. JMP Live è solitamente una buona soluzione, ma abbiamo bisogno di un modo più automatizzato per farlo, anziché continuare a scaricare, concatenare e ricaricare le tabelle manualmente.
Parlando con lo staff di JMP, mi hanno fornito parte di questo codice. È stato davvero fondamentale per il lavoro che abbiamo svolto. Si tratta di come utilizzare uno script per scaricare e aprire una tabella da JMP Live. È stato dopo aver ottenuto questo codice che abbiamo avuto molte idee su come utilizzarlo. Si tratta praticamente solo di una richiesta HTTP. È qualcosa che esisteva e viene utilizzato per ottenere dati da altri siti web, ma la vera chiave per far funzionare tutto questo è in realtà come si assembla e si costruisce l'URL per le tabelle di JMP Live, e ne parleremo tra poco. Sage, ti passo la parola per un secondo.
Ho preso l'esempio che Timothy stava descrivendo da JMP in termini di download di file e, dato il mio caso d'uso, ero pronto a metterlo in pratica. Ho deciso di iniziare semplicemente creando un modo per prendere le tabelle da JMP Live nella loro cartella e concatenarle localmente, per poi riportarle in una posizione specifica. Per fare ciò, ci sono alcuni aspetti che bisogna essere in grado di elaborare in termini di capacità di connessione a JMP Live e di ottenimento delle informazioni da JMP Live. È qui che, con il mio codice, ho creato un array associativo che utilizzo all'avvio.
Questo è un esempio del codice che abbiamo individuato nel componente aggiuntivo che estrae queste informazioni. Il mio script fa qualcosa di simile. Esamina gli elementi a cui l'utente ha accesso in JMP Live, ne estrae i percorsi delle cartelle a cui ha accesso e continua a cercare cartelle all'interno di altre cartelle per aggiungere ciò che JMP chiama gli elementi figlio a quella posizione.
In questo caso, con questo codice, costruiamo dinamicamente quell'array associativo. In questo modo, quando vado a vedere le cartelle a cui hai accesso per poter effettuare il caricamento, questo è il codice che finirà per cercare quelle informazioni all'inizio dello script. In questo modo, puoi vedere tutto ciò a cui hai accesso, così puoi estrarre file da qualsiasi cartella per concatenarli e poi posizionarli nella posizione che preferisci.
Questa è solo una piccola parte. Questo array associativo viene costruito in questo modo. Quello che alla fine facciamo è che da questo componente aggiuntivo si ottengono essenzialmente tre opzioni tra quelle che ho costruito.
La prima opzione è che devi poter selezionare una cartella JMP Live da cui concatenare. Qui, all'avvio con l'array associativo, estraggo tutte le cartelle a cui hai accesso, ottenendo un elenco di tutte le cartelle a cui hai accesso. In questo modo, puoi selezionare la cartella da cui concatenare e poi puoi scegliere una cartella in cui salvare, che proviene dallo stesso elenco di array associativi. Il passaggio successivo è selezionare una tabella da aggiornare.
In base alle informazioni inserite qui, ciò che accade è che tutti i file che si trovano nella cartella Live da cui effettuare la concatenazione vengono concatenati e poi salvati in questa cartella, ovvero "Salva nella cartella", e quindi salvati come tabella selezionata all'interno di quella cartella. Tutti questi file vengono mappati agli array associativi che vi ho appena mostrato nella schermata precedente per il codice che estrae tali informazioni da JMP Live in base alla connessione JMP Live specifica per voi.
Per fare tutto questo, questa è solo una parte del cervello del lavoro. L'array associativo estrae ciò a cui si ha accesso, ma bisogna essere in grado di estrarre le informazioni e poi rimetterle in memoria. Una delle cose davvero interessanti di JMP Live è che c'è un URL che si può effettivamente costruire per estrarre i dati in base a quella richiesta HTTP. Questo è un esempio di ciò che usiamo per creare quell'URL, che essenzialmente scarica quei file localmente.
Ad esempio, c'è un URL di base che finiamo per usare per JMP Live. Ecco un esempio del nome dell'azienda HTTPS JMP Live. Nel nostro caso, è IDEXX. Possiamo usarlo per collegarci al nostro JMP Live. Poi, da lì, ci sono posizioni che devi usare che sono stagnanti. Come i pacchetti API, questa è una parte stagnante dell'URL relativa a JMP Live.
Quindi sappiamo di avere un Live ID. Uno degli elementi che vengono estratti da quell'array associativo di cui ho appena parlato poco fa è il Live ID che collega alle cartelle e quindi alle tabelle dati. In questo modo, questo URL può essere costruito dinamicamente in base a quell'array associativo man mano che lo si crea. Poi c'è un altro elemento statico, i dati, seguito dal nome di una tabella dati JMP Live che verrà estratto da questo URL e di cui verrà scaricato il contenuto, ovvero ".JMPLive/contents".
Di nuovo, solo una parte della magia. La prossima cosa da fare è riuscire a sostituire la tabella JMP Live. Una volta che tutti i file sono nella cartella e concatenati all'interno dell'istanza JMP locale, bisogna posizionarli da qualche parte. Questo è l'esempio del codice che usiamo per sostituire la tabella JMP Live.
Ciò che accade è che creiamo una nuova connessione e, in base a quell'array associativo, in cui sono presenti le informazioni selezionate, la tabella in cui si desidera caricare i dati. Questa viene quindi consegnata come nuovo contenuto JMP Live, che viene poi reinviato a JMP Live per aggiornare i dati. In questo modo, è possibile effettuare aggiornamenti dinamici in base alle tabelle concatenate nella cartella.
Qual era il mio caso d'uso? Perché si trattava di qualcosa che, mentre sperimentavamo, ci siamo resi conto che sarebbe stato interessante usare nei nostri progetti locali. Uno degli scopi per cui siamo riusciti a usarlo era proprio il trend di stabilità. In questo caso, ecco un esempio del codice che ho scritto e di cosa fa. Potete vedere dall'inizio, c'è la finestra iniziale di ciò che fa questo codice, che mostra tre input che vi ho appena mostrato un paio di slide prima. Ovvero, dovete selezionare la cartella. Poi il passo successivo è selezionare la cartella da cui estrarre i dati. In questo caso, ho dati grezzi di stabilità. Ogni volta che i tecnici elaborano altri dati, questi vengono inseriti in questa posizione specifica, in questa cartella di dati grezzi. Questa è la cartella da cui viene selezionata la mia cartella iniziale da cui effettuare la concatenazione.
Da lì, so che voglio aggiungerlo ai miei dati di tendenza perché voglio continuare a concatenare i dati su quel file. Questa è la mia selezione successiva, in cui seleziono una cartella JMP Live in cui salvarlo. In questo caso, diventa il mio trend di stabilità.
Quindi, poiché la mia tabella dati di tendenza della stabilità ne contiene solo una, la mia selezione successiva è la tabella dati di tendenza della stabilità. Tuttavia, questa è quella che ho iniziato. Può essere chiamata come si desidera. L'array associativo la estrarrà, tuttavia, in quella posizione. In questo caso, ho creato prima la tabella. In questo caso, quello che ho usato finora è che la tabella deve esistere già in JMP Live, ma questa sarebbe una grande funzionalità in futuro, ovvero poter... è difficile dirlo, una funzionalità in futuro. Sarebbe un'ottima cosa continuare ad aggiungerla come elemento dinamico, dove è possibile creare nuove tabelle dati concatenate per salvarle in posizioni, perché i dati potrebbero cambiare.
Come appare questo dal lato JMP Live? Sul lato JMP Live, quello che vedete è la Cartella di Partenza. Potreste vedere i miei punti temporali indipendenti che gli altri hanno caricato. In questo caso, sono io. Anche i tecnici potranno caricare dati da questa posizione, se hanno accesso per poter inserire informazioni qui. Queste sono le tabelle che verrebbero concatenate. Potete vedere qui sotto, ho un esempio nella mia cartella del mio trend di stabilità, che è una cartella separata dai miei dati grezzi, e potete vedere la tabella dati da cui sto modificando i dati.
Come appare questo nel back-end una volta che ciò avviene effettivamente? Quando puoi osservare la concatenazione, la magia accade. Puoi effettivamente vedere fisicamente JMP Live dire che la tabella dati ha completato gli aggiornamenti quando esegui questo codice, perché ciò che fa è aggiornarla in tempo reale. Nel caso a sinistra, puoi vedere che la mia tabella dati iniziale ha solo i punti temporali 0 e 1. Come hai visto nella tabella precedente, c'erano punti temporali che arrivavano anche al numero 3. Ora, dopo aver eseguito il codice, puoi vedere che ora c'è un terzo punto temporale che viene concatenato a queste tabelle.
Conclusa questa discussione e continuando a utilizzare questi dati, ho collaborato con Timothy e gli ho detto: "Ehi, ho questo codice. Potrebbe esserti utile, visto il tuo ruolo in questa presentazione". È stato allora che Timothy lo ha preso e lo ha portato al massimo livello.
Grazie, Sage. Avevo già preso gran parte del lavoro svolto da Sage e ho pensato: "Beh, è davvero bello poter prendere un gruppo di file presenti su JMP Live, concatenarli in una nuova tabella e rimetterla su JMP Live". Nel mio caso d'uso, avevo dati che esistevano solo localmente e avevo bisogno di un buon modo per prenderli e inserirli in JMP Live, ma anche per concatenarli con un gruppo di dati già presenti. Volevo condividere questa possibilità con altre persone e collaborare con loro, non necessariamente nella stessa posizione, dove potevamo entrambi aggiungere dati in modo indipendente allo stesso set di dati. Non volevo che le persone facessero troppe manipolazioni manuali.
Ho pensato: "E se avessi uno strumento e potessi usarlo per connettermi a tabelle specifiche?" Non solo, ma vorrei anche poter eseguire qualsiasi ETL sui dati. Se voglio aggiungere nuove colonne, se voglio creare tabelle di riepilogo e caricarle, vorrei davvero un modo per creare uno script di flusso di lavoro JMP e poi collegarlo a determinate tabelle e progetti, per poi poterlo condividere con altre persone in modo che tutti possano eseguire la stessa cosa, aggiornare le stesse tabelle e vedere i risultati in tempo reale.
Questo mostra solo l'inizio di una finestra degli strumenti. Tra pochi secondi faremo una dimostrazione pratica. Vorrei solo dare un'occhiata più da vicino al codice. Inoltre, a livello di script, Sage ha semplicemente preso tutto questo e lo ha impacchettato insieme. Quando lo usiamo, utilizzo anche molti array associativi. È così che memorizzo e salvo molte informazioni specifiche del progetto e gli script speciali.
Come avrete notato nella finestra precedente, abbiamo una finestra di modifica degli script. La magia per farla funzionare è semplicemente usare la funzione Eval Parse, che inserisco in una funzione altrimenti vuota. In questo modo permettiamo agli utenti di incollare gli script in quella finestra. Quindi, quando la eseguono, tutto funziona perfettamente per analizzare le tabelle, unirle e concatenarle con ciò che abbiamo su JMP Live. Usciamo da questa presentazione per un attimo solo per mostrare alcuni esempi rapidi.
Innanzitutto, qui ho uno spazio JMP Live, e poi qui ho il mio strumento in esecuzione. Ecco come appare lo strumento quando lo si apre per la prima volta. Nel riquadro in alto, abbiamo questa sezione delle impostazioni. Queste sono impostazioni che è possibile salvare e, ogni volta che si esegue il componente aggiuntivo, tutte le impostazioni presenti qui verranno popolate. Si tratta del nome della connessione JMP Live, dell'URL di base per JMP Live e poi se si desidera o meno che un elenco di tabelle venga prepopolato nello strumento. L'elenco di tabelle è la sezione qui sotto.
Ecco come decidiamo quali tabelle monitorare e a cui associare gli script. Questo è un esempio in cui ho effettivamente preso spunto da ciò che Sage aveva già fatto per quanto riguarda la possibilità di aggiungere nuove tabelle, cosa che faremo tra un secondo. Uno degli aspetti importanti per la collaborazione è la possibilità di caricare elenchi di progetti. Se si condividono elenchi di progetti con altre persone, queste possono caricarli.
Se vado avanti e carico un elenco di progetti che ho creato in precedenza, vedremo che ho questo elenco di progetti e contiene due tabelle. Ha questa tabella "Not my Cat" e questa tabella "Weekly Weather Data". Noterete nella parte inferiore dello script che hanno dimensioni leggermente diverse. Per questa tabella "Not my Cat", ho solo uno script di base che, quando viene eseguito, chiede all'utente di selezionare un file da aprire e poi restituisce quel file dopo averlo aperto. Quindi, nel caso specifico, il significato è che, una volta restituito, questo è il file che verrà concatenato con la tabella elencata qui.
In quest'altro esempio, non solo il file è aperto, ma sto anche aggiungendo una colonna che calcola la media di altre due colonne. Un esempio di questa esecuzione: posso andare avanti e trovare questa tabella dei dati meteorologici settimanali che ho qui. È già una tabella piuttosto grande. Sono a 124 righe e sto analizzando diverse settimane. Credo che queste siano le settimane dalla 1 alla 10. Posso scorrere la tabella.
Quando eseguo questo strumento, mi viene chiesto di selezionare una tabella. Ho una cartella con un sacco di queste tabelle qui, e posso prendere la nuova tabella, cliccare sul pulsante Apri e aspettare un secondo. Vedrete alcune tabelle apparire e poi scomparire, e poi noterete nel mio JMP Live che questi dati sono stati aggiornati, e posso ricaricare la tabella, e ora sono a 393 righe.
Tornando un po' indietro, se volessi aggiungere un'altra tabella qui, come noterete in JMP Live, ho una seconda tabella chiamata Class Measurements, e ho un report che la accompagna. Faccio clic sul report. Vedo qui in questo report che sto monitorando alcune misurazioni, che si estendono su tre punti temporali per diverse persone. Non ce l'ho ancora nel mio elenco, ma posso aggiungerlo. Utilizzando lo stesso script sviluppato da Sage per la ricerca in JMP Live o in altri strumenti a cui avete accesso, si apre una finestra pop-up molto simile. Posso andare qui, trovare la mia cartella di esempio, quindi selezionare la mia tabella Class Measurement e aggiungerla a questo elenco di progetti.
Aggiungendo questo all'elenco dei progetti, vedrete che posso ancora passare da un elemento all'altro, e che lo script di base precompilato nella finestra mi permette di eseguirlo e selezionare un file da concatenare. Lo farò subito. Vedo che vado al punto temporale 3 in questa tabella e che ho il file per il punto temporale 4. Quando clicco sul pulsante Apri, il file si apre, poi scompare e possiamo vedere in JMP Live che questo report si sta rigenerando e che il punto temporale 4 è stato aggiunto. Chiunque abbia accesso a questa tabella può utilizzare questo strumento per aggiornare queste tabelle di JMP Live con i dati in suo possesso per questo progetto, a condizione che io gli consenta l'accesso in JMP Live.
Possiamo tornare indietro. Possiamo vedere che, sì, anche la tabella "Misurazioni di Classe" è stata aggiornata, poiché è collegata a quel report, e vedremo che i dati del punto temporale 4 sono presenti. Ho un quinto dato del punto temporale. Potrei anche eseguirlo di nuovo per aggiungerlo. Ancora una volta, appare una coda, scompare e quindi è pronta una versione aggiornata di questa tabella. Posso premere "RICARICA" e vedo che i dati extra sono stati aggiunti alla tabella. Posso tornare indietro di nuovo e vedo che anche il mio grafico è stato aggiornato.
Per noi è stato molto entusiasmante collaborare su alcuni progetti e far sì che le persone avessero un flusso di lavoro un po' più standardizzato, potendo condividere script, soprattutto per chi sta ancora imparando a usare il generatore di flussi di lavoro e ad automatizzare alcuni di questi flussi. Può essere davvero utile fornire loro strumenti come questo, per evitare determinati problemi su alcuni di questi progetti multi-sito che a volte ci troviamo ad affrontare.