このプレゼンテーションでは、JMP 18 の Python サポートの新しく重要な更新について概説します。これにより、Python とのより緊密な統合と、Python 中心のユーザー エクスペリエンスが大幅に向上します。JMP 18 では、次のことが可能になります。
Python に公開されるこれらの JMP 機能は、今後拡張されますが、現在は重要な機能とメモリ内データのサポートに重点が置かれています。このプレゼンテーションでは、変更点とその背後にある理由について直接聞くとともに、JMP ユーザーに提供される新しい機能を確認します。外部 Python パッケージの使用による拡張性とデータ インポート機能について説明し、外部パッケージを使用した Python インターフェイス経由の GPU へのアクセスを実演します。
こんにちは、ポール・ネルソンです。JMP、Python、そして次のステップについてお話しします。昨年のプレゼンテーションの後、私たちはレベルアップできると判断しました。JMP、Python には改善の余地があり、その点についてここでお話しします。
顧客が抱えていた最大の課題は、JMP 14 から 17 で Python サポートを機能させることでした。機能すれば、問題なく動作します。しかし、多くの場合、そうはなりませんでした。多数の Python ディストリビューションとさまざまな環境により、テストが困難でした。
Anaconda は Windows 上で動作することがあり、Python 仮想環境も動作することがあります。環境は、各自が異なる Python を使用していたため、スクリプトはユーザーの環境内の共通の Python バージョンにさえ依存できませんでした。
JSON エディタで Python コードを編集するのは難しく、面倒でした。コード ブロックがスペースで区切られる言語です。それを JSL の文字列として貼り付ける必要がある場合、困難になります。JMP の古いバージョンでは Python からのエラー レポートが不十分で、Python スクリプトのデバッグが困難でした。
最後に、データ テーブルとマトリックスの転送はファイル システムを介して行われ、データ テーブルの場合は CSV ファイルとして行われましたが、実際に大きなデータがある場合は遅くなります。大きなクラスは問題なく動作しますが、データが大きくなると遅くなります。
私たちが抱いていたビジョンは、Python 統合が確実に機能するようにすることでした。設定は必要ありません。そのために、Python バージョン 3.115 と JMP 18.0 を組み込み、JMP の一部としてインストールしました。これは共通の環境であり、すべてのユーザーが同じバージョンの Python と同じバージョンの JMP を利用できます。
さらに、JSL と Python 間のデータ フローがメモリ内転送であり、メモリへのゼロ コピー アクセスであることを確認しました。Python プログラマーにとって魅力的で生産性の高い環境を実現しました。コードの色分けや構文の強調表示が可能な Python スクリプト エディターも用意しました。
純粋な Python スクリプトをスクリプト エディターから直接実行でき、Python 環境内から JMP データやログに直接アクセスしたり、JSL を呼び出して Python からデータにアクセスしたりできます。JMP ログと埋め込みログへのエラー レポートが大幅に強化されました。
今では共通の環境なので、テストして検証することができます。環境はご覧のとおりです。これに合わせて、スクリプト インデックスに Python カテゴリ全体を追加しました。インポート JMP パッケージとその他のユーティリティ パッケージで現在利用できる機能について説明し、サンプルを示します。
もう 1 つの利点は、Python の膨大なパッケージ ライブラリを通じて JMP の機能を拡張できることです。私たちは、JSL に 1 対 1 で代わるものを作ろうとしているわけではありません。その代わりに、JMP 内で Python プログラミングに使い慣れた生産性の高い環境を提供しようとしています。
これは近代化、刷新、そして全面的な見直しです。JMP の Python 統合に関する当初の設計上の決定には、制限がありました。私たちは、将来に向けて強力で安定した基盤を提供しながら、変更による破損を最小限に抑えるためにあらゆる努力をしてきました。
破損は JMP への移行に限定されると予想されます。重要な点は、現在 JMP に同梱されている Python バージョンのみをサポートしていることです。これはプライベートな JMP 仮想環境と考えてください。
スクリプトで行われるもう 1 つの変更は、Python がデータ テーブルを送信する方法が変更されたことです。これで、JMP のデータ テーブル オブジェクトが作成されます。これは、JMP データ テーブルへのライブ アクセスです。メモリ内のコピーでは、既存のテーブルを編集および変更できます。これはもはやコピーではありません。
JMP 14 から 17 では、ファイル システム内の一時 CSV ファイルを通じてデータをコピーして、pandas DataFrame オブジェクトを作成しました。大規模なデータの場合、CSV にエクスポートすると、サイズが非常に大きくなり、速度も遅くなります。また、バイナリからテキスト形式に変換し、テキストからバイナリ形式に戻すため、精度が失われる可能性があるという問題もあります。
本当に同じ機能が必要な場合は、サンプル ファイルで 2 つの pandas 関数を提供する pandas Python への DT を提供しています。これは、内部で以前行われていたのと同じように動作します。一時的な CSV ファイルを作成し、pandas に CSV ファイルをインポートするように指示します。
また、JMP から pandas へのサンプルもあり、JMP 列から 1 列ずつ pandas の列を構築する JMP データ テーブル オブジェクトからメモリ内に pandas DataFrame を作成する方法を示しています。
Python Send Matrix も、ファイル システムを介して書き込むために使用されていました。これは、NumPy にファイルを読み取らせるために double のファイルを書き込んでいました。これは現在、内部的にメモリを介して行われ、コピーではなくマトリックスへのライブ参照です。
JSL Python API の大部分はそのまま残っています。主な変更点は、Python のバージョンを選択するために元の Python サポートを構成するために使用されていた非推奨の引数と関数を削除することでした。
削除された唯一の API は、Matplotlib から画像を取得する Python の get graphics 関数です。スクリプト インデックスには、JMP が内部で実行したのと同じことを JSL と Python コードだけで正確に実行する方法を示したサンプルがあります。さあ、見せてください。見てみましょう。デモを終了しましょう。
ここに JMP があります。ここで紹介したいことの 1 つは、ツールバーに Python アイコンが表示され、ファイルの新規メニューに JSON スクリプトがあることです。ただし、新しい Python スクリプトがあります。Python スクリプト エディターを起動します。
埋め込みログを表示できます。JMP インポート パッケージがあります。JMP をインポートします。Python ドキュメント文字列を配置して、help JMP Python を実行できるようにしました。このスクリプトを実行できます。このトップ レベルの JMP インポート パッケージ内のオブジェクトと関数がドキュメント化されていることがわかります。
定数がたくさんあります。ほとんどの特別なディレクトリがすべて表されます。それで、Python から実行できます。JMP を開きます。JMP、まあ、今日は JMP と入力できません。サンプル データ。プラス。ビッグ ボス。JSL と同じように、コード行を選択してスクリプトで実行できます。そして、大きなクラスがあります。
さて、これはコピーではありません。そのオブジェクトを取得できます。TT equals JMP を開いて参照を取得することもできますが、TT equals JMP.current とすることもできます。これにより、現在のデータ テーブルへの参照が取得されます。
そうですね、TT を印刷するなどできます。これは大きなクラスであることを示しています。5 x 40 列です。しかし、さらに楽しいこともできます。TT。名前。そして、Python のスライス演算子を使用できます。名前列の 0 から始まる 1 つおきの名前を返すように指示しています。
Python では、ゼロからインデックスを開始する Python と同じようにインデックスを作成します。データ テーブルのインデックスは行ごとに行われます。列を優先する形式なので、印刷すると、名前ごとに、Katie、Jane、Lilly、James、Barbara、Susan、Joe、David が取得されます。
これはライブアクセスなので、TTのようなことができます。名前または列インデックスを使用できます。列を印刷します。これで、選択できます。これが... 1つ選択しましたね、ルイス。申し訳ありません。ゼロゼロです。ケイティです。データテーブルはライブなので、ケイティを行うことができます。
待ってください。小文字。大文字と小文字が混在しています。これで、埋め込みログに出力が表示されます。お気づきでしょう。データ テーブルで変更しました。これにより、データ テーブルを変更したり、Python の方法でデータ テーブルにアクセスしたり、Python からデータ テーブルを作成したりできるようになります。努力は報われました。
これでスクリプト インデックスができました。ここで、先ほど言ったように、get graphics は非推奨です。これは実際には JMP では有効な関数ではなくなりましたが、スクリプト インデックスのサンプルでは、以前の方法から、JMP 内で実際に内部的に実行して図を保存し、画像を開いて画像を含む新しいウィンドウを作成する方法を示しています。
Python 中心の環境のすばらしい新機能の 1 つは、Python カテゴリ自体がカテゴリであることです。JMP インポート パッケージにはデータ テーブル オブジェクトがあります。それぞれにサンプルがあり、新しい列を作成したり、行を追加したり、テーブルを保存したりできます。テーブル名の取得などのプロパティもあります。
これはPythonで動作する新しいデータテーブルを作成します。また、JMPユーティリティもあります。独自の隔離環境が作成されているため、pip JMPを実行するために使用できます。パッケージをインストールするときは、JMPの隔離環境にインストールする必要があります。
JMP 内のパッケージが他のものと競合したり、Python の他のインストールと競合したりして、問題が発生しないことを願っています。これは分離されています。この場合、必要な場合は、create jpip を実行して、Python pip スクリプトをラッパーにしてインストールできるようにするスクリプトを作成します。または、gem 内の JMP utils クラスから実行することもできます。
ここで、pip コマンド リストを表示し、これを実行します。pip を呼び出すと、Python 環境にインストールしたパッケージのリストが返されます。別の例では、実際にパッケージをインストールできます。これは、JMP 内から直接実行する必要があります。
注意点がいくつかあります。そのため、create jpip が存在します。NumPy のようにパッケージがメモリにロードされる場合、共有ライブラリがあるためです。Windows では、そのパッケージを更新できない場合があります。コンパイルが必要なパッケージもあります。それらは、コマンド ラインから実行する必要がある可能性があります。
いくつかは動作するかもしれませんが、それらはコマンド ラインから実行する必要があるかもしれません。そのため、jpip ラッパー スクリプトを作成する必要があります。これを実行すると、ポップアップが表示され、ファイルを書き込むディレクトリが表示されます。次にフォルダーを選択すると、コマンド ラインから実行可能な jpip ラッパー スクリプトが書き出されます。
実行するときに、インストール後にマイナスマイナスユーザーフラグを使用する必要があります。ここから呼び出されると、自動的に実行されます。インストールを実行する JSL 関数もあります。Python によるパッケージのインストールはさらに簡単です。JSL スクリプトを実行するだけで、バックグラウンドで pip が呼び出され、パッケージを JMP の分離された環境に配置するために必要なすべての環境変数が適切に設定されます。
さあ、始めましょう。その後、さらにデモをいくつか紹介します。これは簡単な基本的なものです。しかし、このプロセス全体の一部として、JMP を Python にとってより使いやすくし、追加の Python パッケージを通じて JMP の機能をより簡単に拡張できるようにすることも検討しました。
お客様が頻繁に要望するサポート トラックの 1 つは、parquet ファイルをインポートできるようにすることです。このデモは、私のドライブからテーブルを取得して取得します。これは、インターネットからダウンロードしたものです。正解です。次に、parquet ファイルの形状を出力し、parquet ファイルのデータから列ごとに JMP データ テーブルを構築します。ログはクリアします。実際に私がそれを行う様子をご覧ください。
スクリプトは実行しませんでした。何かハイライト表示されていたに違いありません。これで完了です。これは parquet ファイルです。PQ がインポートしたときに pyrrow parquet を実行しました。Parquet ファイルのプロパティ。1,000 行です。形状は 13 列 x 1,000 行です。スキーマは、列名からスキーマを表示します。
ここで一番下には、Python 側で改善したい点がまだ完全には終わっていないことを示すもう 1 つの点があります。ただし、そこに到達するまでは、Python から JSL を実行できます。
Python コードでは、設定、表示幅、列タイプの変更などがまだサポートされていません。新しい列を作成することはできますが、Python からそのタイプを変更することはできません。これらは私たちが実現したいことですが、現時点では、JSL 内から Python を実行できたのと同じように、Python 内から JSL スクリプトを実行できるようにすることで回避策を講じることができます。
この拡張環境により、2 つの環境間で呼び出しをやり取りできるようになりました。Python は JSL スクリプトを実行できます。Python での呼び出しは JSL 環境で実行できるため、呼び出しをネストして、他の方法では不可能なことを実現できます。つまり、JMP ではネイティブでは処理できないデータ型の parquet ファイルを取得することです。しかし、これをサポートする Python パッケージをインポートすることでこれを実現しました。
私にとって大切なものの 1 つです。私は統計学者ではありませんが、グラフィックスやその他の数学は得意です。ここでは Open Compute Language (OpenCL) を使用しています。OpenCL パッケージをインポートしました。マンデルブロ フラクタルを作成します。まず CPU を見てみましょう。CPU で実行します。これは実際に実行するのに約 16 秒かかります。
これは面倒で、JMP 自体が遅いことに気づくでしょう。この時点では Python が制御しているため、応答しません。実行中のセルをタイトなループの奥深くに待機させると、制御を取り戻すことができます。これは、CPU を使用してこのフラクタルを生成することです。
では、これを変更して GPU を実行し、スクリプトを実行してみましょう。 ブーーン。 画像を生成し、保存してスクリプトで開き、何を言っているかを確認するのに、ほんの一瞬しかかかりません。 GPU を使用した場合は 16 秒かかりましたが、十分に遡ると、CPU で実行した場合、私がここでプレゼンテーションしている間に 32 秒かかっています。
これにより、JMP で GPU を利用したい場合に、Python を通じてそれが可能になります。PyOpenCL と PyCuda の両方を試しました。Nvidia カードをお持ちで、Cuda で作業している場合は、PyCuda またはより汎用的な OpenCL を導入できます。デスクトップのパワーを無駄にすることなく、JMP の計算能力をさらに強化できます。
Python 経由で SaaS に接続することもできます。SaaS には SaaS y. パッケージがあり、それをインストールしました。これは、同僚の 1 人がまとめた作業の一部です。ログをクリアしてみましょう。実際に何があるか確認して、スクリプトを実行できます。
正しく収集されています。さあ、始めましょう。これは実際に JSL を使用して、スクリプトの実行に必要なすべての Python パッケージがすでにインストールされていることを確認し、設定することができます。ログで確認できる内容の一部は、それらがすでに満たされていることです。これが、SaaS に接続するスクリプトを実行して返されたすべての結果です。SaaS Py パッケージを使用して、ログを遡ってみます。
スクリプトはログにエコーされます。ここで述べたように、SaaS に接続して製品を実行している接続情報があります。ロジスティックです。次に、出力値を返して SaaS セッションを終了します。
TensorFlow は人々が興味を持つものかもしれないと聞いています。ここに非常に簡単な例があります。違います。ここでも TensorFlow をインストールし、これを JSL から実行していますが、このコードを Python から簡単に実行することもできます。
テンソルフローを実行して合計を作成します。デモで紹介したよりもはるかに複雑な使い方が思いつくと思います。Pyダイジェストもその1つです。これは画面です。これは私が作成したサンプルで、JSLの実行、JMPのディレクトリ選択、JSLのディレクトリ選択、そしてそれをPythonスクリプトで使用するなど、いくつかのことを紹介します。これはすべて純粋なPythonスクリプトです。ディレクトリを選択できます。
ディレクトリ内のすべてのファイルのチェックサムを作成します。それを SQLite データベースに格納し、データベースから JMP データ テーブルを作成します。これにより、データベース プログラミング、JMP の知識が少し得られ、Python から JMP データ テーブルを作成し、Python から JSL を実行できます。
選択するディレクトリ。ここにはたくさんのデータがあるので、プレゼンテーションの parquet フォルダまたは選択フォルダを選択しましょう。これでチェックサムのテーブルができました。ディレクトリ内のすべてのファイルをチェックし、パス名とファイルの内容の MD5 チェックサムを教えてくれるものを作成しました。データベースを構築しました。Python から JMP データ テーブルを構築し、JSL を使用して列幅も設定しました。
繰り返しますが、これはまだ実装されていませんが、検討すべきリストに載っています。ただし、必要に応じて、Python から JSL を実行することもできます。
R を使いたい人もいるかもしれません。この場合、私は自分のマシンと環境で私たちのサーバーを使用して接続を作成しました。Linux WSL 環境では、Windows システム内から私たちのサーバーを実行する方が簡単でした。
ここで R サーバー デーモンを実行しています。予約クライアントを使用しています。サーバー上に R ベクトルを作成し、結果を合計して、このスクリプトを実行するというちょっとした作業を行っています。サーバーに接続しました。ベクトルを取得し、すべての要素を合計して 6 を取得します。py2 です。その例もいくつかあります。コマンド ラインから機能する非常にシンプルなものが必要な場合は、シェルアウトしてコマンド ラインから R を実行するプロセスを使用する方法のサンプルがあります。
最後に、Jon Saul が協力してくれた統計です。HDB スキャン Python パッケージを使用したサンプルを作成します。Matplotlib に関して注意すべき点が 1 つあります。Windows 上の Matplotlib にはグラフィック バックエンドがないため、出力を確認したい場合は PyQt5 が最適であることがわかりました。
バックエンドとして。Mac で Matplotlib を使用する場合、インストールしていない場合は非グラフィック バックエンドである AGG に強制的に切り替えます。PyQt5 または PySide のいずれかです。Mac 上の Matplotlib は自動的に cocoa バックエンドを選択するため、Mac 上の Matplotlib の最後のウィンドウを閉じると JMP が終了するというバグがあります。
これを防ぐために、システムで Matplotlib が見つかった場合、バックエンドがあれば、Matplotlib をロードして、Qt バックエンドを使用するように強制します。それ以外の場合は、非グラフィック バックエンドであることを確認します。これをバックエンドにしました。私のマシンには PyQt5 があります。このサンプルでは、HDB スキャンでクラスタリングを実行します。
では、埋め込みログを表示しましょう。スクリプトを実行します。取得するものは、データの Matplotlib テーブルに生成された図です。ここで、JMP を開いて DT 参照を取得したことがわかります。これらは私が持っているサンプルです。信じてください。
プレゼンテーションを戻します。近い将来の優先事項は、継続的な改良と改善です。JMP と Python 間のデータの相互運用性の向上です。現在、列変更編集の制限は、任意のタイプの列を作成できますが、数値列と文字列、式列、または状態列の値のみを変更および取得できることです。リンク テーブルの作成はすべて将来的に行われます。
Python スクリプト エディターはコードの色付けや構文の強調表示をサポートしていますが、自動インデントのサポートはまだありません。この点についても検討します。
最新化の目標は、JMP の Python 統合をすぐに使えるようにすることでした。設定なしで JMP と Python を使って生産性を高めることができるはずです。それがうまくいかなかったら、非常に困難でした。Python プログラマーが JMP 内で生産性を高める時間を短縮して、JMP を作ってみませんか? JMP の機能を向上させましょう。外部 Python パッケージを使用して JMP を簡単に拡張できるため、分析ハブになります。
他の人が時間をかけて作成した、たとえば私たちがテストした parquet 形式や HDF5 などのさまざまなデータ形式をロードする機能が向上しました。世の中にはさまざまな形式があり、どの開発チームも社内で作成できる時間よりも多くの形式がありますが、この方法を使用すると、Python パッケージを取り込み、そのデータから JMP データ テーブルを作成し、JMP 内でその機能を利用できます。
お時間をいただきありがとうございます。私たちの取り組みを気に入っていただけたなら幸いです。また、フィードバックにも大変興味を持っていただければ幸いです。ありがとうございます。