Passa un datatable JMP a Python come dataframe PandasNelle versioni precedenti di JMP (pre-JMP 18), quando si passava un datatable JMP a Python, era un frame di dati Panda per impostazione predefinita (molto carino). Sfortunatamente sembra che questa funzionalità sia stata eliminata in JMP 18 dove dopo aver passato la tabella dati a Python con PythonSend(), è quindi necessario scorrere ogni colonna e convertirla in un array Numpy facendo qualcosa del genere:
df = pd.DataFrame()
for i in range( len(cols) ):
df[ cols[i].name ] = np.array( cols[i] )
E questo richiede molto tempo per tabelle di dati di grandi dimensioni. Ho ricevuto questo feedback negativo da un cliente (NVIDIA) che utilizza molto JMP e Python.
Esiste un modo per passare le tabelle di dati a Python come frame di dati Pandas senza dover eseguire questa conversione? O meglio ancora, possiamo ripristinare la funzionalità JMP 17 di PythonSend() che lo fa per impostazione predefinita?
Grazie,
Segno
Ri: Passa un datatable JMP a Python come dataframe PandasIn JMP 18, ecco un modo per farlo
import pandas as pd
import jmp
# open the JMP data table
tablepath=<PATHNAME string="">dt=jmp.open(tablepath) # puoi anche usare dt=jmp.current() o dt=jmp.table(<'tablename'>) # definisce la funzione per convertire la tabella JMP nel data frame panda def jmpTableToDataFrame(dt) : # Creazione diretta di un dataframe Pandas da un DataTable JMP. df = pd.DataFrame() for idx in range( len(dt) :(</img> print(dt[idx].name) if dt[idx].dtype == jmp.DataType.Numeric: # crea una colonna numerica direttamente utilizzando il buffer di Python Protocollo col = np.array( dt[idx] ) df[ dt[idx].name ] = col.tolist() # crea un elenco per i panda. elif dt[idx].dtype == jmp.DataType.Character: # crea una lista scorrendo i valori col = list() for i nell'intervallo ( dt.nrows :(</img> col.append(dt[idx][i]) # Crea una colonna di caratteri dall'elenco df[ dt[idx].name ] = col else: print( dt[idx].dtype ) return df #converti la tabella JMP nel frame di dati panda df = jmpTableToDataFrame(dt); stampa(df)</PATHNAME>
Ri: Passa un datatable JMP a Python come dataframe PandasVoglio solo sottolineare che il ciclo tra le colonne è ordini di grandezza più veloce del comportamento di JMP 17. Tutto questo accade nella memoria. JMP 14-17 scrive una tabella di dati JMP su disco come file CSV temporaneo, prima di rileggere il file da Panda come file CSV. Un cliente aveva un file .jmp da 200 milioni che si gonfiava in CSV 3G durante il processo di trasferimento che impiegava 15 minuti. Il vecchio metodo presentava anche il potenziale di perdita di precisione dei dati poiché converteva il binario in testo, quindi il testo nuovamente in binario.
Se vuoi davvero utilizzare il vecchio metodo, è incluso in SAMPLE_SCRIPTS/Python/dt2pandas.py come funzione to_pandas(dt). Accettando un oggetto jmp.DataTable e restituendo un pandas.DataFrame.
Non imposteremo Python Send(dt) come predefinito per l'invio di un pandas.DataFrame. L'oggetto jmp.DataTable fornisce al codice Python la capacità di manipolare e gestire le tabelle di dati JMP in tempo reale da Python, i panda no.
Questo sarà il cambiamento più grande a cui gli utenti che utilizzavano Python di JMP 14-17 dovranno adattarsi. Ma nel peggiore dei casi è 1 istruzione di importazione aggiuntiva import dt2pandas e pd = to_pandas(dt) nel codice dopo l'invio, se vuoi farlo alla vecchia maniera. Oppure, in modo equivalente, avvolgi il codice in loop sulle colonne in una funzione e chiamala per creare un frame di dati panda in memoria dall'oggetto jmp.DataTable.
Ri: Passa un datatable JMP a Python come dataframe PandasFare riferimento anche al post del mio blog.
https://community.jmp.com/t5/JMPer-Cable/New-in-JMP-18-Python-jmp-DataTable-and-pandas-DataFrame/ba-p/744680
Ri: Passa un datatable JMP a Python come dataframe PandasGrazie per l'ottima spiegazione Paolo! Non penso che l'utente abbia prestato attenzione alla differenza di prestazioni, ma piuttosto abbia semplicemente notato la differenza nel comportamento di PythonSend(). Quando questo argomento verrà affrontato (lo farà), è importante sottolineare questo miglioramento delle prestazioni in modo che venga percepito come una funzionalità e non un bug. Condividerò il tuo fantastico post sul blog con Nvidia sull'argomento.
Ri: Passa un datatable JMP a Python come dataframe PandasCiao Sam/Paul,
Questa funzione che hai condiviso è considerata il metodo più conosciuto per convertire le tabelle di dati JMP in frame di dati Pandas? Questo è qualcosa che verrà utilizzato universalmente da qualsiasi utente JMP/Python. Tanto che penserei che meriti di includerlo nella libreria Python di JMP?