Python統合で列のプロパティを取得するこんにちは、
開いた JMP データ テーブルへの参照として df = jmp.current() を使用する場合、Python で JMP データ テーブルから列プロパティ (「設計ロール」や「要因の変更」など) を取得する方法はありますか?
データ型とモデリング型のプロパティを取得するためのdf[0].dtypeとdf[0].mtypeがあることは知っていますが、DoEで生成されたテーブルからPythonで因子と応答をリストしたいと思います。
ありがとう!
自動化とスクリプト実験計画法Re: Python統合で列のプロパティを取得するまだ実装されていない機能がある場合は、いつでもrun_jslにフォールバックできます。
Re: Python統合で列のプロパティを取得するはい、ただし次のコード:
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
次のエラーを返します: 名前が解決されていません: 'df' のアクセスまたは評価で df が見つかりました、df/*###*/
何かアイデアはありますか?
Re: Python統合で列のプロパティを取得するJMP側は、df 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'))
Re: Python統合で列のプロパティを取得するとても役に立ちました。ありがとうございます。ただし、実行中は:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
明らかにテーブルにいくつかの列があるにもかかわらず、出力として「なし」が返されます。
また、「Names Default To Here(1)」を含むスクリプトを使用すると、JMP がクラッシュします...
Re: Python統合で列のプロパティを取得するここの名前空間にアクセスできないため、Noneが返されます。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']
Re: Python統合で列のプロパティを取得するありがとう、jthi!
これは、Python Send を使用しているため (以前に試したため) だけでなく、cname に「文字列」タイプを指定しているためにも機能します。
Re: Python統合で列のプロパティを取得するもう 1 つの質問/希望: すべての列をスクロールして、「設計の役割」または「要因の変更」プロパティがあるかどうかを確認し、それらの列のみをリストするにはどうすればよいでしょうか。
Re: Python統合で列のプロパティを取得する列にこれらのプロパティの 1 つが見つかった場合、結果を Python リストで取得しますか?
Re: Python統合で列のプロパティを取得するはい
Re: 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']
Re: Python統合で列のプロパティを取得するデータテーブルはPythonとJSLの両方からアクセスできますが、上記のスクリプトのdfは、データテーブルへのポインタを保持するPython環境内の変数です。JSLは、JSLからPythonのGet(df);を実行しない限り、変数dfに関する情報を取得できません。Get(df);を実行すると、dfが参照するのと同じデータテーブルを参照するJSL変数が作成されます。Python側からGet Column Names()は実行できませんが、JSLではなくPythonで考える必要があります。テーブル内の各列には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' な方法で処理を実行するための豊富なサポートが提供されています。
Re: Python統合で列のプロパティを取得するに関して:
df = jmp.current()
jmp.run_jsl('''
dt = Python Get( df );
cname = dt << Get Column Names();
''')
print(jmp.here.get('cname'))
上記のスクリプトにはいくつか問題があります。変数 cname は、jmp.run_jsl( ) スクリプトに Names Default to Here(1); がないため、here 名前空間ではなくグローバル名前空間にあります。そのため、デフォルトで globals 名前空間が使用されます。次に、他のレスポンスで参照されている正しいリストを Python Send(cname) で Python に渡すには、 << Get Column Names("Strings") に "Strings" パラメータを指定する必要があります。cname を文字列リストとして取得することで、JMP 19 以降では here または globals アクセサを使用して Python 側から取得できるようになります。リストを文字列リストにしない場合、文字列ではなく Opaque 内部オブジェクトのリストが取得されます。
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'))