JMPデータテーブルをPandasデータフレームとしてPythonに渡す以前のバージョンの JMP (JMP 18 以前) では、JMP データ テーブルを Python に渡すと、デフォルトで Pandas データ フレームになりました (非常に便利です)。残念ながら、JMP 18 ではこの機能が削除されたようです。PythonSend() を使用してデータ テーブルを Python に渡した後、すべての列をループして、次のように Numpy 配列に変換する必要があります。
df = pd.DataFrame()
for i in range( len(cols) ):
df[ cols[i].name ] = np.array( cols[i] )
また、大規模なデータ テーブルの場合、これは時間がかかります。JMP と Python を多用している顧客 (NVIDIA) から、この否定的なフィードバックを受け取りました。
この変換を行わずに、データ テーブルを Pandas データ フレームとして Python に渡す方法はありますか? あるいは、これをデフォルトで実行する PythonSend() の JMP 17 機能を復活させることはできますか?
ありがとう、
マーク
Re: JMP データテーブルを Pandas データフレームとして Python に渡すJMP 18では、次のように実行できます。
import pandas as pd
import jmp
# open the JMP data table
tablepath=<PATHNAME string="">dt=jmp.open(tablepath) # dt=jmp.current() または dt=jmp.table(<'tablename'>) も使用できます。 # JMP テーブルを pandas データ フレームに変換する関数を定義します。 def jmpTableToDataFrame(dt) : # JMP DataTable から直接 Pandas データフレームを作成します。 df = pd.DataFrame() for idx in range( len(dt) :(</img> print(dt[idx].name) if dt[idx].dtype == jmp.DataType.Numeric: # Python のバッファー プロトコルを使用して数値列を直接作成します。 col = np.array( dt[idx] ) df[ dt[idx].name ] = col.tolist() # pandas のリストにします。 elif dt[idx].dtype == jmp.DataType.Character: # 値を反復処理してリストを作成します col = list() for i in range ( dt.nrows :(</img> col.append(dt[idx][i]) # リストから文字列を構築します df[ dt[idx].name ] = col else: print( dt[idx].dtype ) return df # JMP テーブルを pandas データ フレームに変換します df = jmpTableToDataFrame(dt); print(df)</PATHNAME>
Re: JMP データテーブルを Pandas データフレームとして Python に渡す列のループ処理は、JMP 17 の動作よりも桁違いに高速であることを指摘しておきます。これはすべてメモリ内で行われます。JMP 14-17 は、JMP データ テーブルを一時 CSV ファイルとしてディスクに書き込み、その後、ファイルを pandas から CSV ファイルとして読み込みます。ある顧客は、200 MB の .jmp ファイルを持っていましたが、転送プロセスで 15 分かかり、3 GB の CSV に膨れ上がりました。古い方法では、バイナリをテキストに変換し、その後テキストをバイナリに戻すため、データの精度が失われる可能性がありました。
本当に古い方法を使用したい場合は、SAMPLE_SCRIPTS/Python/dt2pandas.py に関数 to_pandas(dt) として含まれています。jmp.DataTable オブジェクトを受け取り、pandas.DataFrame を返します。
Python Send(dt) のデフォルトを pandas.DataFrame の送信にすることはしません。jmp.DataTable オブジェクトは、Python コードに JMP データ テーブルを Python からライブで操作および処理する機能を提供しますが、pandas にはこの機能がありません。
これは、JMP 14-17 の Python を使用していたユーザーが適応する必要がある最大の変更点です。ただし、従来の方法で実行する場合は、最悪の場合でも、送信後のコードにimport dt2pandasと pd = to_pandas(dt) というインポート ステートメントが 1 つ追加されるだけです。または、列をループするコードを関数にラップし、それを呼び出して、jmp.DataTable オブジェクトからメモリ内に pandas データ フレームを作成します。
Re: JMP データテーブルを Pandas データフレームとして Python に渡す私のブログ投稿も参照してください。
https://community.jmp.com/t5/JMPer-Cable/New-in-JMP-18-Python-jmp-DataTable-and-pandas-DataFrame/ba-p/744680
Re: JMP データテーブルを Pandas データフレームとして Python に渡す素晴らしい説明をありがとう、ポール! ユーザーはパフォーマンスの違いに注目したのではなく、PythonSend() の動作の違いに気づいただけだと思います。このトピックが話題になったとき(必ず話題になります)、このパフォーマンスの向上を指摘して、バグではなく機能として認識してもらうことが重要です。このトピックに関するあなたの素晴らしいブログ投稿を Nvidia と共有します。
Re: JMP データテーブルを Pandas データフレームとして Python に渡すこんにちは、サム/ポール、
あなたが共有したこの関数は、JMP データ テーブルを Pandas データ フレームに変換するための最もよく知られた方法だと思われますか? これは、すべての JMP/Python ユーザーが普遍的に使用するものになります。JMP Python ライブラリに含める価値があると思うほどです。