Transmettre une table de données JMP à Python en tant que dataframe PandasDans les versions précédentes de JMP (avant JMP 18), lorsque vous transmettiez une table de données JMP à Python, il s'agissait par défaut d'une trame de données Pandas (très sympa). Malheureusement, il semble que cette fonctionnalité ait été supprimée dans JMP 18 où, après avoir transmis la table de données à Python avec PythonSend(), vous devez ensuite parcourir chaque colonne et la convertir en un tableau Numpy en faisant quelque chose comme ceci :
df = pd.DataFrame()
for i in range( len(cols) ):
df[ cols[i].name ] = np.array( cols[i] )
Et cela prend du temps pour les grandes tables de données. J'ai reçu ce retour négatif d'un client (NVIDIA) qui utilise beaucoup JMP et Python.
Existe-t-il un moyen de transmettre des tables de données à Python en tant que trame de données Pandas sans avoir à effectuer cette conversion ? Ou mieux encore, pouvons-nous ramener la fonctionnalité JMP 17 de PythonSend() qui fait cela par défaut ?
Merci,
Marque
Re : Passer une table de données JMP à Python en tant que dataframe PandasDans JMP 18, voici une façon de procéder
import pandas as pd
import jmp
# open the JMP data table
tablepath=<PATHNAME string="">dt=jmp.open(tablepath) # vous pouvez également utiliser dt=jmp.current() ou dt=jmp.table(<'tablename'>) # définir une fonction pour convertir la table JMP en bloc de données pandas def jmpTableToDataFrame(dt) : # Création directe d'une trame de données Pandas à partir d'un DataTable JMP. df = pd.DataFrame() pour idx in range( len(dt) ) : print(dt[idx].name) if dt[idx].dtype == jmp.DataType.Numeric : # crée une colonne numérique directement à l'aide du tampon de Python Protocole col = np.array( dt[idx] ) df[ dt[idx].name ] = col.tolist() # en fait une liste pour les pandas. elif dt[idx].dtype == jmp.DataType.Character: # crée une liste en parcourant les valeurs col = list() pour i dans la plage ( dt.nrows :(</img> col.append(dt[idx][i]) # Construire une colonne de caractères à partir de la liste df[ dt[idx].name ] = col else: print( dt[idx].dtype ) return df #convertir la table JMP en bloc de données pandas df = jmpTableToDataFrame(dt); imprimer(df)</PATHNAME>
Re : Passer une table de données JMP à Python en tant que dataframe PandasJe veux juste souligner que la boucle dans les colonnes est plusieurs fois plus rapide que le comportement de JMP 17. Tout cela se passe en mémoire. JMP 14-17 écrit une table de données JMP sur le disque en tant que fichier CSV temporaire, avant de relire le fichier depuis pandas en tant que fichier CSV. Un client disposait d'un fichier .jmp de 200 M qui s'est transformé en CSV 3G au cours du processus de transfert prenant 15 minutes. L'ancienne méthode présentait également un risque de perte de précision des données puisqu'elle convertissait le binaire en texte, puis le texte à nouveau en binaire.
Si vous souhaitez vraiment utiliser l'ancienne méthode, elle est incluse dans SAMPLE_SCRIPTS/Python/dt2pandas.py en tant que fonction to_pandas(dt). Prendre un objet jmp.DataTable et renvoyer un pandas.DataFrame.
Nous ne ferons pas en sorte que Python Send(dt) envoie par défaut un pandas.DataFrame. L'objet jmp.DataTable donne au code Python la possibilité de manipuler et de gérer les tables de données JMP en direct à partir de Python, ce qui n'est pas le cas des pandas.
Ce sera le changement le plus important auquel les utilisateurs qui utilisaient Python de JMP 14-17 devront s'adapter. Mais au pire, c'est 1 instruction d'importation supplémentaire import dt2pandas et pd = to_pandas(dt) dans le code après l'envoi, si vous voulez le faire à l'ancienne. Ou de manière équivalente, enveloppez le code en boucle sur les colonnes dans une fonction et appelez-la pour créer une trame de données pandas en mémoire à partir de l'objet jmp.DataTable.
Re : Passer une table de données JMP à Python en tant que dataframe PandasReportez-vous également à mon article de blog.
https://community.jmp.com/t5/JMPer-Cable/New-in-JMP-18-Python-jmp-DataTable-and-pandas-DataFrame/ba-p/744680
Re : Passer une table de données JMP à Python en tant que dataframe PandasMerci pour la bonne explication Paul! Je ne pense pas que l'utilisateur ait prêté attention à la différence de performances, mais a simplement remarqué la différence de comportement de PythonSend(). Lorsque ce sujet sera abordé (il le sera), il est important de souligner cette amélioration des performances afin qu'elle soit perçue comme une fonctionnalité et non comme un bug. Je partagerai votre excellent article de blog avec Nvidia sur le sujet.
Re : Passer une table de données JMP à Python en tant que dataframe PandasSalut Sam/Paul,
Cette fonction que vous avez partagée est-elle considérée comme la méthode la plus connue pour convertir les tables de données JMP en trames de données Pandas ? C'est quelque chose qui sera universellement utilisé par tout utilisateur JMP/Python. À tel point que je pense que cela justifie de l'inclure dans la bibliothèque Python JMP ?