Python 整合取得列屬性你好,
如果我使用 df = jmp.current() 作為已開啟的 JMP 資料表的引用,是否有辦法在 Python 中取得 JMP 資料表中的列屬性(例如「設計角色」和「因子變更」)?
我知道可以使用 df[0].dtype 和 df[0].mtype 來取得資料類型和建模類型屬性,但我希望用 Python 列出 DoE 產生的表中的因子和回應。
謝謝!
自動化和腳本編寫實驗設計回覆:Python 整合取得列屬性如果某些功能尚未實現,您可以始終回退到 run_jsl。
回覆:Python 整合取得列屬性當然可以,但是以下程式碼:
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
傳回以下錯誤:名稱未解析:在存取或評估“df”時出現“df”錯誤,df/*###*/
有什麼想法嗎?
回覆:Python 整合取得列屬性除非你「分享」它們,否則 JMP 端無法辨識你的 Python 資料框變數。我不知道哪種方法比較好,但你可以使用 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'))
或者你可以使用 JMP 端的 Python Get 方法。
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'))
回覆:Python 整合取得列屬性非常有用,謝謝。不過運行的時候:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
儘管我的表中顯然有一些列,但輸出結果卻是“None”。
另外,如果使用腳本並設定“Names Default To Here(1)”,我的 JMP 會崩潰…
回覆:Python 整合取得列屬性你收到 None 是因為沒有存取 here 命名空間的權限。你可以使用 Python 的 Send 函數。
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']
回覆:Python 整合取得列屬性非常感謝jthi!
這之所以有效,不僅是因為使用了 Python Send(因為我之前試過),還因為 cname 指定了「字串」類型。
回覆:Python 整合取得列屬性還有一個問題/願望:如何遍歷所有列,檢查它們是否具有“設計角色”或“因素變化”屬性,並僅列出這些列?
回覆:Python 整合取得列屬性如果列中存在這些屬性之一,您是否希望將結果以 Python 清單的形式傳回?
回覆:Python 整合取得列屬性是的
回覆:Python 整合取得列屬性根據需要修改邏輯,使其更容易理解
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']
回覆:Python 整合取得列屬性雖然 Python 和 JSL 都可以存取資料表,但上面腳本中的 `df` 是 Python 環境中的變量,它保存著指向該資料表的指標。除非你在 JSL 中執行 `Get(df)`,否則 JSL 對變數 `df` 一無所知。 `Get(df)` 會建立一個 JSL 變量,該變數引用與 `df` 指向的同一個資料表。雖然 Python 端沒有 `GetColumnNames()` 函數,但你需要用 Python 的思考方式來思考,而不是用 JSL 的思考方式。表中的每一列都有 `name` 屬性,請參閱腳本索引。
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)
JMP 資料表以列列表的形式存在,而列又以行列表的形式存在。腳本索引的 Python 類別中包含大量相關資訊。上述支援自 18.0.0 版本起就已存在。
Python 支援的設計原則是按照 Python 程式設計師的期望行事,並且提供了豐富的支持,尤其是在 jmp.DataTable 物件中,可以以「Pythonic」的方式做事。
回覆:Python 整合取得列屬性關於:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
上述腳本存在一些問題。變數 cname 不在 here 命名空間中,而是在 global 命名空間中,因為 jmp.run_jsl() 腳本中沒有設定 Names Default to Here(1);,所以它預設使用 globals 命名空間。其次,你需要將 "Strings" 參數傳遞給 << Get Column Names("Strings"),以便能夠像其他回應中提到的那樣,使用 Python 的 Send(cname) 將正確的清單傳遞給 Python。將 cname 作為字串清單獲取,也允許在 JMP 19 及更高版本中使用 here 或 globals 存取器從 Python 端獲取它。如果不將列表轉換為字串列表,你將得到一個包含不透明內部物件的列表,而不是字串列表。
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'))