Intégration Python pour obtenir les propriétés des colonnesSalut,
Existe-t-il un moyen d'obtenir les propriétés des colonnes d'une table de données JMP (telles que « Rôle de conception » et « Modifications des facteurs ») en Python, si j'utilise `df = jmp.current()` comme référence à la table de données JMP ouverte ?
Je connais df[0].dtype et df[0].mtype pour obtenir les propriétés de type de données et de type de modélisation, mais je voudrais lister les facteurs et les réponses en Python à partir d'un tableau généré par DoE.
Merci!
Automatisation et scriptageConception des expériencesRe: Intégration Python : obtenir les propriétés des colonnesVous pouvez toujours utiliser run_jsl si une fonctionnalité n'a pas encore été implémentée.
Re: Intégration Python : obtenir les propriétés des colonnesBien sûr, mais voici le code :
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
renvoie l'erreur suivante : Nom non résolu : df lors de l'accès ou de l'évaluation de 'df', df/*###*/
Des idées ?
Re: Intégration Python : obtenir les propriétés des colonnesCôté JMP, il n'a pas connaissance de vos variables Python df à moins que vous ne les « partagiez ». Je ne sais pas quelle est la méthode préférée, mais vous pouvez par exemple utiliser jmp.here.
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
jmp.here["dt"] = dt
jmp.run_jsl('''
Names Default To Here(1);
p = Column(dt, "name") << Get Property("Notes");
'''
);
print(jmp.here.get('p'))
Ou vous pouvez utiliser la fonction Get de Python côté JMP.
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
jmp.run_jsl('''
dtref = Python Get(dt);
p1 = Column(dtref, "name") << Get Property("Notes");
'''
);
print(jmp.here.get('p1'))
Re: Intégration Python : obtenir les propriétés des colonnesTrès utile, merci. Cependant, lors de l'exécution :
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
J'obtiens « Aucun » comme résultat, alors que ma table comporte manifestement des colonnes.
De plus, si j'utilise le script avec « Names Default To Here(1) », mon JMP plante...
Re: Intégration Python : obtenir les propriétés des colonnesVous obtenez None car vous n'avez pas accès à cet espace de noms. Vous pouvez utiliser la fonction Send de Python.
import jmp
jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
df = jmp.current()
jmp.run_jsl('''
dt = Python Get(df);
cname = dt << Get Column Names("string");
Python Send(cname);
''')
print(cname) # ['name', 'age', 'sex', 'height', 'weight']
Re: Intégration Python : obtenir les propriétés des colonnesMerci beaucoup jthi !
Cela fonctionne, non seulement grâce à l'utilisation de Python Send (car j'avais déjà essayé cela), mais aussi grâce à la spécification du type « chaîne » pour cname.
Re: Intégration Python : obtenir les propriétés des colonnesAutre question/souhait : comment faire défiler toutes les colonnes et vérifier si elles possèdent une propriété « Rôle de conception » ou « Modifications de facteurs », puis n’afficher que ces colonnes ?
Re: Intégration Python : obtenir les propriétés des colonnesSouhaitez-vous obtenir le résultat sous forme de liste Python si l'une de ces propriétés est trouvée pour les colonnes ?
Re: Intégration Python : obtenir les propriétés des colonnesOui
Re: Intégration Python : obtenir les propriétés des colonnesModifiez la logique au besoin pour la rendre plus facile à comprendre.
import jmp
# demo setup
jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
jmp.run_jsl('''
Data Table("Big Class"):weight << Set Property("Design Role", Design Role("Continuous"));
Data Table("Big Class"):name << Set Property("Factor Changes", Easy);
''')
df = jmp.current()
jmp.run_jsl('''
dt = Python Get(df);
colnames = dt << Get Column Names("string");
res = Filter Each({colname}, colnames,
!Is Empty(Column(dt, colname) << Get Property("Design Role")) | !Is Empty(Column(dt, colname) << Get Property("Factor Changes"));
);
Python Send(res);
''')
print(res) # ['name', 'weight']
Re: Intégration Python : obtenir les propriétés des colonnesBien qu'une table de données soit accessible depuis Python et JSL, `df` dans le script ci-dessus est la variable de l'environnement Python qui contient un pointeur vers cette table. JSL ignore tout de la variable `df`, sauf si vous effectuez un appel à `Get(df);` depuis JSL. Cette opération crée une variable JSL qui référence la même table de données que `df`. Bien qu'il n'existe pas de fonction `GetColumnNames()` côté Python, vous devez raisonner en Python plutôt qu'en JSL. Chaque colonne de la table possède une propriété `name` (voir l'index des scripts).
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + "Big Class.jmp")
# print then set the first column's name from python
# note the column index is zero-based just like Python.
# You can also access the column by name: print(dt['age'])
print(dt[0].name)
dt[0].name = 'First Name'
# simple list comprehension to walk data table columns
# and build a list of names from the column's name property
names = [x.name for x in dt]
print(names)
Une table de données JMP se comporte comme une liste de colonnes, et les colonnes comme une liste de lignes. La catégorie Python de l'index des scripts contient de nombreuses informations. Cette fonctionnalité est disponible depuis la version 18.0.0.
Le principe de conception du support Python est de se comporter comme un programmeur Python s'y attendrait, et il existe un support riche, notamment dans l'objet jmp.DataTable, pour effectuer des opérations de manière « pythonique ».
Re: Intégration Python : obtenir les propriétés des colonnesConcernant:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
Le script ci-dessus présente quelques problèmes. La variable `cname` n'appartient pas à l'espace de noms `here`, mais à l'espace de noms global, car le script `jmp.run_jsl()` ne contient pas `Names Default to Here(1);`. Par conséquent, elle utilise l'espace de noms global par défaut. De plus, le paramètre « Strings » de la fonction `<< Get Column Names("Strings")` est nécessaire pour transmettre la liste correcte à Python via `Python Send(cname)`, comme indiqué dans d'autres réponses. Obtenir `cname` sous forme de liste de chaînes de caractères permet également de l'accéder depuis Python via les accesseurs `here` ou `globals` dans JMP 19 et versions ultérieures. Sans cette conversion, la liste obtenue contient des objets internes opaques.
import jmp
dt = jmp.open(jmp.SAMPLE_DATA + "Big Class.jmp")
print(dt[0].name)
dt[0].name = 'First Name'
# do it in a python way
names = [x.name for x in dt]
print(names)
# using JSL
jmp.run_jsl('''
Names default to here(1);
dt = Python Get( dt );
jname = dt << Get Column Names("String");
''')
print(jmp.here['jname'])
print(jmp.here.get('jname'))