Python 통합을 통해 열 속성 가져오기안녕,
파이썬에서 `df = jmp.current()`와 같이 열린 JMP 데이터 테이블을 참조로 사용할 경우, "설계 역할"이나 "요소 변경"과 같은 JMP 데이터 테이블의 열 속성을 가져오는 방법이 있을까요?
저는 데이터 유형 및 모델링 유형 속성을 얻기 위해 df[0].dtype 및 df[0].mtype을 알고 있지만, DoE에서 생성된 테이블에서 요인과 반응을 파이썬으로 나열하고 싶습니다.
감사해요!
자동화 및 스크립팅실험 설계제목: Python 통합을 통한 열 속성 가져오기아직 구현되지 않은 기능이 있는 경우 언제든지 run_jsl을 사용할 수 있습니다.
제목: Python 통합을 통한 열 속성 가져오기물론입니다만, 다음 코드는 다음과 같습니다.
df = jmp.current()
sc = jmp.run_jsl('df << Get Column Names();')
print(sc)
다음과 같은 오류가 발생합니다. 이름을 확인할 수 없습니다: 'df'에 대한 접근 또는 평가에서 df를 찾을 수 없습니다. df/*###*/
아이디어 있으신가요?
제목: Python 통합을 통한 열 속성 가져오기JMP 측에서는 사용자가 "공유"하지 않는 한 df 파이썬 변수에 대해 알지 못합니다. 어떤 방법이 더 바람직한지는 모르겠지만, 예를 들어 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'))
테이블에 분명히 열이 있는데도 불구하고 출력 결과로 "없음"이 나옵니다.
또한, "Names Default To Here(1)"를 사용하여 스크립트를 실행하면 JMP가 충돌합니다...
제목: 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']
제목: Python 통합을 통한 열 속성 가져오기jthi님, 정말 감사합니다!
이 방법이 효과가 있는 이유는 Python Send를 사용했기 때문만은 아니고 (이전에 시도해 봤기 때문입니다), cname에 "문자열" 유형을 지정했기 때문이기도 합니다.
제목: 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);`와 같은 Python 변수를 호출하지 않는 한 `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 버전부터 제공되고 있습니다.
파이썬 지원의 설계 원칙은 파이썬 프로그래머가 기대하는 방식으로 동작하는 것이며, 특히 jmp.DataTable 객체를 통해 '파이썬스러운' 방식으로 작업을 수행할 수 있도록 풍부한 지원을 제공합니다.
제목: 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` 네임스페이스를 사용하게 됩니다. 둘째, 다른 답변에서 언급된 것처럼 Python의 `Send(cname)` 함수를 사용하여 올바른 문자열 리스트를 전달하려면 `<< Get Column Names("Strings")`에 "Strings" 매개변수를 추가해야 합니다. cname을 문자열 리스트로 전달하면 JMP 19 이상 버전에서 `here` 또는 `globals` 접근자를 사용하여 Python 측에서도 cname을 가져올 수 있습니다. 리스트를 문자열 리스트로 만들지 않으면 문자열 대신 불투명한 내부 객체 리스트가 반환됩니다.
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'))