Python-Integration zum Abrufen von SpalteneigenschaftenHallo,
Gibt es eine Möglichkeit, Spalteneigenschaften aus einer JMP-Datentabelle (wie z. B. „Designrolle“ und „Faktoränderungen“) in Python zu erhalten, wenn ich df = jmp.current() als Referenz auf die geöffnete JMP-Datentabelle verwende?
Ich bin mir der Möglichkeiten von df[0].dtype und df[0].mtype bewusst, um Datentyp- und Modelltypeigenschaften zu erhalten, möchte aber die Faktoren und Antworten in Python aus einer DoE-generierten Tabelle auflisten.
Danke!
Automatisierung und SkripterstellungVersuchsplanungBetreff: Python-Integration zum Abrufen von SpalteneigenschaftenSie können jederzeit auf run_jsl zurückgreifen, falls eine bestimmte Funktion noch nicht implementiert wurde.
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenSicher, jedoch mit folgendem Code:
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
Gibt folgenden Fehler zurück: Name nicht aufgelöst: df beim Zugriff oder der Auswertung von 'df' , df/*###*/
Irgendwelche Ideen?
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenJMP kennt Ihre Python-Variablen des Dataframes nicht, es sei denn, Sie geben sie explizit frei. Ich weiß nicht, welche Methode bevorzugt wird, aber Sie können beispielsweise `jmp.here` verwenden.
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'))
Alternativ könnten Sie die Python-Get-Funktion von der JMP-Seite aus verwenden.
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'))
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenSehr hilfreich, danke. Allerdings beim Ausführen:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
Ich erhalte als Ausgabe "Keine", obwohl meine Tabelle offensichtlich einige Spalten enthält.
Wenn ich das Skript mit der Option "Names Default To Here(1)" verwende, stürzt mein JMP ab...
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenSie erhalten „None“, da Sie keinen Zugriff auf den Namespace „here“ haben. Sie können den Python-Befehl „Send“ verwenden.
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']
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenVielen Dank, jthi!
Dies funktioniert nicht nur aufgrund der Verwendung von Python Send (weil ich das vorher schon ausprobiert hatte), sondern auch aufgrund der Angabe des Typs "string" für cname.
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenEine weitere Frage/ein weiterer Wunsch: Wie kann man durch alle Spalten scrollen und prüfen, ob sie eine „Designrolle“ oder „Faktoränderungen“ besitzen, und nur diese Spalten auflisten?
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenSoll das Ergebnis als Python-Liste ausgegeben werden, wenn eine dieser Eigenschaften für die Spalten gefunden wird?
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenJa
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenPassen Sie die Logik nach Bedarf an, um das Verständnis zu erleichtern.
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']
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenEine Datentabelle ist sowohl von Python als auch von JSL aus zugänglich. Die Variable `df` im obigen Skript ist in der Python-Umgebung eine Variable, die einen Zeiger auf die Datentabelle enthält. JSL kennt die Variable `df` erst, wenn man in JSL `Get(df);` aufruft. Dadurch wird eine JSL-Variable erstellt, die auf dieselbe Datentabelle verweist wie `df`. Da es in Python keine Methode `GetColumnNames()` gibt, muss man in Python und nicht in JSL denken. Jede Spalte in der Tabelle hat eine `name`-Eigenschaft (siehe Skriptindex).
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)
Eine JMP-Datentabelle verhält sich wie eine Liste von Spalten, und die Spalten verhalten sich wie eine Liste von Zeilen. Im Python-Abschnitt des Skriptindex finden Sie zahlreiche Informationen. Die oben genannte Unterstützung ist seit Version 18.0.0 verfügbar.
Das Designprinzip der Python-Unterstützung besteht darin, sich so zu verhalten, wie es ein Python-Programmierer erwarten würde, und es gibt umfangreiche Unterstützung, insbesondere im jmp.DataTable-Objekt, um Dinge auf eine „pythonische“ Art und Weise zu tun.
Betreff: Python-Integration zum Abrufen von SpalteneigenschaftenHinsichtlich:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
Das obige Skript weist einige Probleme auf. Die Variable `cname` befindet sich nicht im `here`-Namensraum, sondern im `global`-Namensraum, da in `jmp.run_jsl()` keine Zeile `Names Default to Here(1);` existiert. Daher wird standardmäßig der `globals`-Namensraum verwendet. Zweitens benötigen Sie den Parameter `Strings` für `<< Get Column Names("Strings")`, um die korrekte Liste mit `Python Send(cname)` an Python zu übergeben, wie bereits in anderen Antworten erwähnt. Indem Sie `cname` als Liste von Strings übergeben, können Sie es in JMP 19 und höher auch von Python-Seite aus mit den `here`- oder `globals`-Zugriffsmethoden verwenden. Ohne die Liste als String-Liste zu deklarieren, erhalten Sie eine Liste von internen Opaque-Objekten anstelle von Strings.
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'))