このプレゼンテーションでは、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コードを編集するのは難しく、不快でした。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カテゴリをまるごと追加しました。これは、import JMPパッケージと他のいくつかのユーティリティパッケージで現在利用できる機能の説明とサンプルを示すためです。
もう一つ重要な点は、これによりPythonの豊富なパッケージライブラリを通じてJMPの機能を拡張できるということです。私たちはJSLと全く同じ代替言語を作ろうとしているわけではありません。そうではなく、JMP内でPythonプログラミングを行うための、使い慣れた生産性の高い環境を提供しようとしているのです。
これは近代化、刷新、そして全面的な見直しです。JMPのPython統合に関する当初の設計上の決定事項には、いくつかの制約がありました。私たちは、変更による影響を最小限に抑えつつ、将来に向けた強固で安定した基盤を提供するためにあらゆる努力を払いました。
今回の不具合はJMPへの移行に伴うものに限られると予想されます。重要な点は、現在JMPに同梱されているPythonバージョンのみをサポートしているということです。これは、JMP専用の仮想環境と考えてください。
スクリプトで行われるもう一つの変更点は、Pythonによるデータテーブルの送信方法を変更したことです。これにより、JMPデータテーブルオブジェクトが作成されます。これはJMPデータテーブルへのリアルタイムアクセスであり、メモリ上のコピーではなくなり、既存のテーブルを編集・変更できます。
JMP 14~17では、ファイルシステム内の一時的なCSVファイルを介してデータをコピーすることで、pandas DataFrameオブジェクトを作成しました。しかし、データ量が多い場合、CSVへのエクスポートは処理が複雑になり、非常に大きくて遅くなります。また、バイナリ形式からテキスト形式へ、そしてテキスト形式からバイナリ形式へと変換するため、精度が失われる可能性もあります。
どうしても同じ機能が必要な場合は、サンプルファイルにpandas Pythonへのデータトランスフォーマーを用意しており、2つのpandas関数を提供しています。これは内部的に以前と同じように動作します。一時的なCSVファイルを作成し、pandasにそのCSVファイルをインポートするように指示します。
また、JMPからpandasへのサンプルもあり、JMPデータテーブルオブジェクトからメモリ上にpandasデータフレームを作成する方法が示されています。このサンプルでは、JMPの列を一度に1つずつ使用してpandasの列を構築します。
PythonのSend Matrixも以前はファイルシステム経由で書き込んでいました。NumPyが読み込むために、double型のデータをファイルに書き込んでいたのです。現在は内部的にメモリ経由で処理されるようになり、コピーではなく行列へのライブ参照が使用されるようになりました。
JSL Python APIの大部分は変更されていません。主な変更点は、元のPythonサポートでPythonのバージョンを選択するために使用されていた、非推奨の引数と関数を削除したことです。
削除されたAPIは、Matplotlibから画像を取得するPythonのgetgraphics関数だけでした。スクリプトインデックスには、JMPが内部で行っていたことと全く同じことをJSLとPythonコードだけで行う方法を示すサンプルがあります。さあ、見せてください。見てみましょう。デモを終了しましょう。
ここにJMPがあります。ここで紹介したいことの一つは、ツールバーにPythonアイコンが表示されていることです。また、「ファイル」メニューの「新規」にはJSONスクリプトがありますが、今は新しいPythonスクリプトがあります。Pythonスクリプトエディタを開いてみましょう。
埋め込みログを表示できます。JMP インポート パッケージがあります。JMP をインポートします。Python ドキュメント文字列を配置するように努力しましたので、JMP Python のヘルプを実行できます。そのスクリプトを実行できます。このトップレベルの JMP インポート パッケージ内のオブジェクトと関数がドキュメント化されていることがわかります。
定数がたくさんあります。ほとんどの特殊ディレクトリが表現されています。だから、できます。そして今、Python から実行します。JMP open。JMP、ええと、今日は入力できません、JMP。SAMPLE DATA。プラス。ビッグボス。JSL と同じように、コード行を選択してスクリプトで実行できます。そして、大きなクラスがあります。
これはコピーではありません。そのオブジェクトを取得できます。TT = JMP open と入力すれば参照を取得できますが、TT = JMP.current と入力することもできます。そうすれば、現在のデータテーブルへの参照を取得できます。
ええと、例えば TT を出力することができます。これは、それが大きなクラスであることを示しています。5 列× 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 ユーティリティも用意されています。JMP は独自の隔離された環境を作成したため、pip JMP を実行するために使用できます。パッケージをインストールする際には、JMP の隔離された環境内にインストールする必要があります。
JMP のパッケージが他のものや他の Python のインストールと競合して問題が発生することはないはずです。分離してあります。そのため、この場合は、必要であれば、`create jpip` を実行すると、Python pip スクリプトをラップするスクリプトが作成され、インストールできるようになります。または、gem 内の JMP utils クラスから実行することもできます。
ここでは、list pip コマンド list を示します。これは出力されます。pip を呼び出すと、Python 環境にインストールされているパッケージのリストが返されます。別の例として、実際にパッケージをインストールすることもできます。これは JMP 内から直接実行されます。
いくつか注意点があります。そのため、jpip を作成する必要があるのです。NumPy のように共有ライブラリを持つパッケージがメモリにロードされている場合、Windows ではそのパッケージの更新が妨げられる可能性があります。コンパイルが必要なパッケージもあります。それらはコマンドラインから実行する必要があるかもしれません。
それらの中には動作するものもあるかもしれませんが、コマンドラインから実行する必要があるかもしれません。そのため、jpipラッパースクリプトを作成することをお勧めします。それを実行すると、ポップアップが表示され、ファイルを書き込むディレクトリが表示されます。フォルダを選択すると、コマンドラインから実行可能なjpipラッパースクリプトが作成されます。
そこで実行する際には、インストール後にマイナスマイナスユーザーフラグを使用する必要があります。ここから呼び出されると、自動的にその処理が行われます。インストールを実行するJSL関数もあります。Pythonパッケージのインストールはさらに簡単です。JSLスクリプトを実行するだけで、バックグラウンドでpipが呼び出され、パッケージをJMPの隔離された環境に配置するために必要なすべての環境変数が適切に設定されます。
さあ、始めましょう。その後、さらにいくつかのデモをお見せできます。これは簡単な基本事項です。しかし、このプロセス全体の一環として、JMP を Python にさらに対応させ、追加の Python パッケージを通じて JMP の機能をはるかに簡単に拡張できるようにしました。
お客様からよく寄せられるご要望の一つに、parquet ファイルのインポート機能があります。このデモでは、私のドライブからテーブルを取得します。インターネットからダウンロードしたテーブルです。そうです。次に、parquet ファイルの形状を出力し、parquet ファイル内のデータから列ごとに JMP データ テーブルを構築します。ログをクリアします。実際に私が操作する様子をご覧ください。
スクリプトは実行していません。何かがハイライトされていたのでしょう。はい、わかりました。これはパーケットファイルです。PQがインポートしたように、pyrow parquetを作成しました。パーケットファイルのプロパティです。1000行あります。形状は13列×1000行です。スキーマには、列名からスキーマのプリンシパルが表示されます。
一番下の部分で、Python側で改善したいことがまだまだたくさんあることをお見せできますが、それが実現するまでは、PythonからJSLを実行できます。
Pythonコードはまだ、表示幅の設定や列タイプの変更といった機能をサポートしていません。新しい列を作成することはできますが、Pythonからそのタイプを変更することはできません。これらは今後対応していく予定ですが、現状では、JSLスクリプトをPythonから実行できるという回避策があります。これは、以前JSLからPythonを実行できたのと同様です。
この強化された環境により、両者間で呼び出しを相互に行うことができます。Python は JSL スクリプトを実行できます。Python での呼び出しは、JSL 環境で再度実行できるため、呼び出しをネストして、従来は不可能だった処理を実現できます。例えば、JMP がネイティブに処理できないデータ型の Parquet ファイルを JMP に渡すことができます。しかし、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 digest もその 1 つです。画面です。ここに、私が作成したサンプルがあります。1 つは、JMP の pick directory を使用してディレクトリを選択できるようにする JSL の実行など、いくつかの機能を示すものでした。JSL pick directory を使用して、それを 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 を実行する方法のサンプルがあります。
最後に、統計に関するもので、ジョン・ソールが手伝ってくれました。HDB scan 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 の機能を向上させませんか?外部の Python パッケージを使用して JMP を簡単に拡張できるため、JMP は分析ハブになります。
他の人が時間をかけて作成したさまざまなデータ形式を読み込む機能を改善しました。例えば、私たちもテストしたHDF5形式のParquet形式などです。世の中にはたくさんの形式があり、どの開発チームも内部で作成する時間がないほどですが、この方法を使えばPythonパッケージを取り込んで、そのデータからJMPデータテーブルを作成し、JMP内でその機能を活用できます。
お時間をいただきありがとうございました。私たちの作品をお楽しみいただけたなら幸いです。ご意見・ご感想をお待ちしております。よろしくお願いいたします。