やあみんな、
(JMP 17 Pro ユーザー) 特にアプリケーション ビルダーを使用しているときに、データ テーブル オブジェクトを Python に渡して JSL に戻そうとすると、奇妙な問題が発生します。
アプリケーション ビルダーを使用するのは今回が初めてなので、標準の JSL スクリプトを使用して、アプリで必要な動作の大まかなドラフトを書き出しました (コンテキストとして、目標は、ユーザーがディレクトリ/ファイルを選択し、JMP で分析用のグラフを生成できるアプリケーションです)。この動作は標準の JSL スクリプトでは機能しますが、アプリケーション ビルダー内では機能しません。
以下は私のスタンドアロン (アプリケーション ビルダー以外) スクリプトです。
// 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";(動作しません) これが私のアプリケーション ビルダー スクリプトです:
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 アプリケーション ビルダー スクリプトでは、 dt1 = .;が返されます (これは、オブジェクトが存在しないことを示しています)。
最初にこれに気付いたのは、dt1 << New Data Window を使用しようとしたときでした。このスレッドを読んで、おそらくオブジェクトをまったく操作していないことに気づきました: https://community.jmp.com/t5/Discussions/Error-in-running-script-Send-Expects-Scriptable-Object-in-access/td-p/718245
長い投稿で申し訳ありません。これは奇妙なエラーです。この問題についてご協力くださる皆様に、前もって感謝いたします。
アプリケーション ビルダー スクリプトに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 ファイルとしてディスクに保存し、pandas にそのファイルに対して read_csv() を実行するように指示します。JMP2pandas.py は、jmp.DataTable オブジェクトの機能を使用してメモリ内に pandas.DataFrame を作成する方法を示すサンプル スクリプトです。
Python Get(dt)は新しいjmp.DataTableオブジェクトを認識し、Python Get(df)はDataFrameを認識し、JMP 14-17と同じようにCSVを使用してインポートします。
詳細な解決策をありがとうございました。とても役に立ちました。こんなに小さなことを見逃していたなんて信じられません。