안녕하세요 여러분,
(JMP 17 Pro 사용자) 특히 Application Builder를 사용하는 동안 데이터 테이블 객체를 Python에 전달하고 JSL로 다시 검색하려고 할 때 이상한 문제가 발생합니다.
Application Builder를 처음 사용했기 때문에 표준 JSL 스크립트를 통해 앱에서 원하는 동작의 대략적인 초안을 작성했습니다. (컨텍스트의 목표는 사용자가 디렉터리/파일을 선택할 수 있는 애플리케이션입니다. 그런 다음 JMP가 분석용 그래프를 생성하도록 합니다. 이 동작은 표준 JSL 스크립트에서는 작동하지만 Application Builder에서는 작동하지 않습니다.
다음은 독립형(Application Builder가 아닌) 스크립트입니다.
// Initialize Python within JMP
PyConnect = Python Connect();
Names Default to Here( 1 );
// Allow user to manually pick directory and file
directory = Pick Directory ("Select a directory.");
chosen_file = Pick File("Select a file", directory);
// Open the selected file, then send to Python
dt1 = Open(chosen_file, Table Contains Column Headers(0));
Python Send(dt1);
// Close the dirty data table to save space/resources
Close(dt1, NoSave);
show(dt1, "first");
// Clean the table by removing all references to "#"
Python Submit("\[
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
]\");
// Retrieve the processed table from Python and open in JMP
// Terminate Python connection
dt1 = Python Get(dt1);
Python Term();
show(dt1, "second");이 스크립트의 출력은 다음과 같습니다.
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
dt1 = DataTable("dt1");
"second";(작동하지 않음) 내 Application Builder 스크립트는 다음과 같습니다.
executePress=Function({thisBox}, {Default Local},
// This function is called when the button is pressed
py = Python Connect();
dt1 = Open(::file, Table Contains Column Headers(0));
Close(dt1, NoSave);
show(dt1, "first");
// Clean the table by removing all references to "#"
Python Submit("\[
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
]\");
dt1 = Python Get(dt1);
Python Term();
show(dt1, "second");
);그리고 문제가 되는 결과는 다음과 같습니다.
dt1 = DataTable("D424TUZ0.Inspec Meas 01");
"first";
/**********/
dt1 = dt1[~dt1["Column 1"].str.contains("#")]
/**********/
dt1 = .;
"second";TLDR: 독립형 스크립트에서 dt1 = Python Get(dt1);을 통해 Python 정리에서 데이터 테이블을 다시 검색한 후; , dt1 = DataTable("dt1"); 로 객체를 돌려받습니다. . 그러나 JMP Application Builder 스크립트에서는 dt1 = .; (이것은 개체가 존재하지 않음을 나타냅니다.)
나는 dt1 << New Data Window;를 사용하려고 시도했을 때 이것을 처음으로 인식했습니다. 그리고 이 스레드를 읽으면서 제가 개체를 전혀 사용하지 않을 가능성이 높다는 것을 깨닫게 되었습니다: https://community.jmp.com/t5/Discussions/Error-in-running-script-Send-Expects-Scriptable-Object-in -access/td-p/718245
긴 게시물에 대해 사과드립니다. 이상한 오류입니다. 이 문제에 대해 도움을 주신 모든 분들께 미리 감사드립니다!
Application Builder 스크립트에 Python Send(dt1);가 표시되지 않습니다.
또한 JMP 18에서는 Python Send(dt)에서 발생하는 일이 변경되었습니다. JMP 18 이상에서는 pandas.DataFrame 대신 jmp.DataTable 객체를 얻습니다. 그리고 해당 DataTable 개체는 더 이상 데이터의 복사본이 아니라 데이터 테이블에 대한 실시간 액세스이므로 실시간 테이블에서 직접 Python으로 처리할 수 있습니다. import jmp 패키지를 통해 지원되는 Python API의 예는 JMP 18의 스크립팅 인덱스를 참조하세요.
jmp.DataTable에서 pandas.DataFrame으로 이동해야 하는 경우 $SAMPLE_SCRIPTS/Python 디렉터리에 몇 가지 예가 있습니다. dt2pandas.py는 JMP 14-17이 수행한 작업을 정확하게 수행합니다. DataTable을 디스크에 임시 CSV 파일로 저장하고 팬더에게 파일에서 read_csv()를 지시합니다. JMP2pandas.py는 jmp.DataTable 객체의 기능을 사용하고 메모리에 pandas.DataFrame을 생성하는 방법을 보여주는 예제 스크립트입니다.
Python Get( dt )은 새로운 jmp.DataTable 객체를 인식하는 반면 Python Get( df )는 DataFrame을 인식하고 JMP 14-17과 마찬가지로 CSV를 사용하여 가져옵니다.
상세한 해결방법을 알려주셔서 정말 감사드립니다. 많은 도움이 되었습니다. 제가 그렇게 작은 것을 놓쳤다니 믿을 수가 없어요.