JMPの最新リリースは、JMP 18で導入されたPython統合サポートを基盤として、ワークフローの根幹であるデータアクセスに重点を置きました。データテーブル操作とPython-JSL相互運用性の拡張により、データへのアクセスがシンプルかつ便利になりました。
動画をご希望ですか? こちらからご覧ください。
データテーブル操作
jmp.from_dataframe() 関数は、外部データフレームをJMPデータテーブルに効率的に変換する方法を提供します。データフレームプロトコルは、メモリ内でデータフレーム間の変換を行うメカニズムを提供します。データフレーム交換プロトコルをサポートするすべてのデータフレームオブジェクトは、メモリ内でデータフレーム間の変換が可能です。代表的な例としては、pandas、polars、ibisなどがあります。
以下の例は、pandas データ フレームを JMP データ テーブルに変換する方法を示しています。

同様に、JMPデータテーブルをサポートされている他のデータフレームライブラリ形式に変換することも簡単です。例えば、JMPからPandasに変換するには次のようにします。

JMP 18では、jmp.DataTableは数値列と文字列のみを完全にサポートしていました。現在では、PythonからすべてのJMP列データ型がサポートされています。追加のオブジェクトにより、式と行の状態がサポートされています。
jmp.DataTable オブジェクトに row_states プロパティが追加され、Python からテーブルの行状態を設定できるようになりました。これにより、行状態のセットを列にコピーしたり、列からテーブルの行状態を設定したりすることが簡単になります。

テーブルの列形式は、ユースケースに応じて、文字列またはタプルを指定したcol.formatを使用してアクセスできるようになりました。JMP 19は、JMPの日付時刻表現とPythonの日付時刻表現を適切にマーシャリングします。データテーブル内のJMPの日付と、PythonコードからのPython日付時刻オブジェクトです。

同様に、Python Get()/Python Send() は、Python と JSL 間での日付と時刻値のシームレスな転送をサポートするようになりました。
列をフォーマットする機能に加えて、Columns では、col.formula と jmp.Expressions を使用して数式を追加することもできます。

JMP 19 では、jmp.Images を式列の値として設定する機能も使用できます。
ハイライトされていないその他のデータ テーブル操作については、Python カテゴリのスクリプト インデックスを参照してください。
Python-JSL 相互運用性
多くのワークフローでは、JMPで特定のタスクを実行するために依然としてJSLのサポートが必要です。言語間ワークフローを強化するために、PythonからJSL変数の追加、読み取り、および変更のサポートが追加されました。現在は、GlobalおよびHere名前空間を通じてのみサポートされています。以下の例は、PythonからJSL変数「e」を設定し、次にJSLを使用してhere::pi変数を設定し、Pythonから設定されたglobals ::e変数を出力し、最後にJSLから設定されたhere::pi変数をPythonから出力しています。

R統合
JMP 19では、rpy2を使用したPython経由のRの初期サポートが導入されました。JMPは拡張機能をサポートするための新しいモジュールjmpexを提供します。現在、jmpexがサポートする拡張機能はRのみです。このサポートは、JSL R APIに類似したPython APIで構成されています。jmpexパッケージは、JMPとrpy2間のインターフェースレイヤーであり、rpy2はRに依存しています。ユーザーがインストールしたRのバージョンがシステムに既に存在し、R_HOME環境変数がRの場所に設定されている必要があります。jmpexパッケージの要件により、jmpexがインストールされる前、またはR Init()が初めて呼び出される前に、これらが存在している必要があります。
JMP 19 では、jmpex パッケージを内部的に利用することで、R の JSL サポートが復元されました。
以下の例は、jmpex によって提供される R への新しい Python API を示しています。

一般的な変更
JMP 18のPython 3.11からJMP 19のPython 3.13への切り替えにより、JMP 19のライフサイクル全体にわたってセキュリティアップデートが提供されます。また、JMP 19では、jmp.reset()を使用して共有Python環境をリセットする便利な方法も提供されています。jmputilsにも以下の改善が加えられています。
- jmputils.__バージョン__
- jmputils.is_installed('パッケージ')
- jmputils.packages()
- jmputils.package_version('パッケージ')
パッケージのスクリプトインストールをより適切にサポートするため、jmputils.jpip() は Python の subprocess.CompletedProcess オブジェクトを返すようになりました。CompletedProcess オブジェクトに関する情報は、Python のドキュメントをご覧ください。
廃止予定
- Python の初期化()
- Python 用語()
- Python コントロール()削除されました。
- Python グラフィックスの取得() 削除されました。
- R 用語()
- R グラフィックスの取得()非推奨。効果はありません。
- R コントロール(エコー (bool) )パラメータ非同期( )、そして割り込み( )
次は何?
JMP 18は、JMP内でネイティブPythonワークフローをサポートするための新たな基盤を構築することに重点が置かれました。その基盤は、JMPとPythonの統合における最も困難な問題を解決することから始まりました。
JMP 19では、その基盤をさらに強化し、改良に注力するとともに、データテーブルのサポートを大幅に強化しました。JSLと同様に、Pythonからでもデータテーブルを操作できるようにしたいと考えています。すべての列タイプがPythonからサポートされるようになりました。列の書式設定と行の状態は、Pythonスクリプトからアクセスおよび変更できます。
列型のサポートが完了したことで、ポータブルデータフレームプロトコルのサポートが可能になりました。pandasやjmp.DataTableオブジェクトを含むポータブルデータフレーム間の容易な変換が復元され、ファイルシステム内のCSVコピーに頼ることなく、メモリ内での作業が維持されます。
さらに、生産性の向上にも重点的に取り組み、オブジェクトの動作を整理し、Pythonプログラマーが期待する動作を実現しました。最後に、新リリースでは、JMP 18で見落とされた問題や、リリース前に開発期間が不足していた問題がいくつか修正されています。
Python統合の将来は明るいです。JMPでは、SAS接続の復活、JSL Rサポートの復活、R用の新しいPython API、そしてPython統合を基盤としたデータコネクタなど、独自のPython機能を基盤として構築しています。
将来について考えるのは常に憶測ですが、将来のリリースに含める可能性のあるものについて調査しているものがいくつかあります。
- スクリプト エディターのサポートが継続的に改善されました。
- Python 仮想環境に対する JMP サポート。
- パッケージ処理サポートのさらなる改善には以下が含まれます:
- 企業または内部リポジトリに接続するための構成オプション。
- サイト管理者が検証しロックダウンしたサイト パッケージを構築する簡単な方法。
- Python からダイアログやウィンドウを表示するためのサポート。これにより、Python からグラフィックやレポートを作成できるようになります。
お客様のワークフローを最も改善できる領域に重点を置きたいと考えておりますので、皆様のご提案を心よりお待ちしております。
@Paul_Nelsonが共同執筆したブログ。
これは素晴らしいですね。JMPとPythonは相性抜群で、JMP v18ではPythonを多用しました。ユーザー視点で見ると、実装は驚くほどシンプルで、ほぼすぐに使い始めることができました。JMP v19のアップデートは、特に行の状態、計算式、日付/時刻の処理が素晴らしいです。
いくつかのコメント/提案:
- 停止。JMP (v18以降)内でPythonスクリプトを実行する際、スクリプトに「while True: pass」のような無限ループが含まれていると、 JMPセッション全体が応答しなくなり、強制終了が必要になります。JMPに、アプリケーション全体を終了させることなく、実行中のPythonスクリプトを中断または停止する手段(停止ボタンやタイムアウト機能など)があれば非常に助かります。
- 埋め込み。JMPで Python スクリプトをデータ テーブルに埋め込むことができれば便利です (すでに何らかの方法で可能になっている場合を除く)。
- ユーザー入力を取得します。Pythonが JMP にモーダルダイアログを発行してユーザーからの入力を取得できるようにすれば、さらに便利です。
当然、Python ベースの列式も素晴らしいのですが、それは難しいことだと思います。
あなたとあなたのチームに称賛を送ります、素晴らしい仕事です!!
に関して
1. 停止。プロセスを中止する機能は既に存在します。これは、ホットループ内にjmp.run_jsl('Wait(0);')を配置することで実現します。定期的に制御をJMPに戻すことで、通常のESCキーによる処理でスクリプトをキャンセルできるようになります。
2. JSL Python 呼び出しをラッパーする JSL 以外では、現時点では不可能だと考えています。
3. 念のためですが、JSLダイアログコードはjmp.run_jsl()経由で呼び出すことができます。JMP 18のサンプルコードの一つ、ディレクトリのMD5ハッシュを計算してSQLiteデータテーブルを構築するコードはまさにその通りで、Pythonスクリプトからディレクトリピッカーダイアログ用のjslを呼び出して、Pythonスクリプトへのディレクトリパスを提供します。