JMP Liveは、増え続けるデータセットを分析・可視化するための強力なプラットフォームであり、特に接続されたデータウェアハウスからテーブルを更新する機能を備えています。しかし、新製品開発においては、こうしたパイプラインが不完全な場合が多く、複数のユーザーや拠点にまたがるデータ収集はロジスティクス上の課題となります。
皆さん、こんにちは。プレゼンテーションへようこそ。私の名前はティモシー・ウェットストーンです。共同プレゼンターのセージ・ダーリングと一緒にここにいます。私たちは二人ともIDEXX Laboratoriesに勤務しており、今回のプレゼンテーションではJMP Liveをデータウェアハウスとして活用する方法についてお話します。
過去1年間、JMP Liveをかなり活用してきました。収集元からウェアハウス、そしてJMP Liveへと堅牢なパイプラインを構築することで、既存の様々なデータウェアハウスにテーブルを自動更新できるのが本当に素晴らしいと思っています。まさにこのユースケースに最適です。
JMP Live を使い込んでいくうちに、JMP Live で実現したい潜在的なユースケースがいくつか見つかりましたが、JMP Live にはそれらを簡単に実現する機能が備わっていません。これは主に、クラウドサービスや大規模なデータウェアハウスに送られないデータソースやデータ生成ソースがある場合に当てはまります。つまり、ファイルやデータを取得するだけで、それらは基本的にローカルでしか利用できないということです。特に、表示しようとしているデータと同じデータセットに属するデータが、時間の経過とともに一時的に取得され続けるようなケースです。この作業を進める中で、多くの縦断的研究を念頭に置いていました。
こういった手動ファイルがあります。基本的に全てを同じ場所でまとめて追跡できるようにしたいのです。JMP Live は通常、そのための最適な場所ですが、テーブルをダウンロードして連結し、手動で再アップロードするよりも、より自動化された方法が必要です。
JMPのスタッフと話していたところ、このコードの一部をいただきました。これは私たちの作業において非常に重要な部分で、スクリプトを使ってJMP Liveからテーブルをダウンロードして開く方法です。このコードを入手してから、私たちはそれをどのように活用できるかについて多くのアイデアを思いつきました。これは基本的にHTTPリクエストです。これは以前から存在し、他のウェブサイトからデータを取得するために使われていますが、これを機能させるための真の鍵は、JMP LiveテーブルのURLをどのように組み立てて構築するかにあります。この点については後ほど詳しく説明します。Sageさん、少しバトンタッチします。
ティモシーがJMPからファイルのダウンロードについて説明していた例と私のユースケースを入手し、すぐに実行してみることにしました。まずは、JMP Liveからテーブルをそれぞれのフォルダに取得し、ローカルで連結して、特定の場所にプッシュし直す方法を構築することにしました。これを実現するには、JMP Liveに接続し、JMP Liveから情報を取得できるようにするために、いくつか解決すべき点があります。そこで、私のコードでは、初期化時に使用する連想配列を作成しました。
これは、この情報を取得するアドイン内に配置したコードの例です。私のスクリプトも同様の機能を実行します。JMP Liveでユーザーがアクセスできるものを確認し、アクセスできるフォルダの場所を取得します。そして、フォルダ内にあるフォルダを探し続け、JMPが「子」と呼ぶものをそのフォルダの場所に追加していきます。
この場合、このコードを使って連想配列を動的に構築します。こうすることで、アップロードを実行するためにアクセス権のあるフォルダを確認する際に、スクリプトの先頭でその情報を検索するコードが作成されます。こうすることで、アクセス権のあるすべてのフォルダを確認できるので、任意のフォルダからファイルを取り出して連結し、好きな場所に配置することができます。
これはほんの一部に過ぎません。この連想配列はこのように構築されます。最終的に、このアドインから、私が構築したものの中から基本的に3つのオプションが提供されます。
最初のオプションは、連結元のJMP Liveフォルダを選択できるようにすることです。連想配列で初期化すると、アクセス可能なすべてのフォルダが取得され、アクセス可能なすべてのフォルダのリストが表示されます。これにより、連結元のフォルダを選択し、同じ連想配列リストから保存先のフォルダを選択できます。次に、更新するテーブルを選択します。
ここに入力された情報に基づいて、最終的にLiveフォルダ内にある連結元のすべてのファイルが連結され、このフォルダ(保存先フォルダ)に保存されます。そして、そのフォルダ内に選択されたテーブルとして保存されます。これらはすべて、前の画面で示した連想配列にマッピングされています。この連想配列は、ユーザー固有のJMP Live接続に基づいてJMP Liveから情報を取得するコードです。
これらすべてを実現するには、これは作業の頭脳の一部に過ぎません。連想配列はアクセスできる情報を取得しますが、その情報を取得して再度取得できなければなりません。JMP Liveの非常に便利な機能の一つは、HTTPリクエストに基づいて取得するためのURLを作成できることです。これは、そのURLを作成するために使用している例で、基本的にファイルをローカルにダウンロードします。
例えば、JMP Live で使用するベース URL があります。ここに HTTPS の JMP Live の会社名の例があります。私たちの場合は IDEXX です。この URL を JMP Live へのリンクに使用できます。そこから、固定された URL の部分を実行する必要があります。API パッケージなど、これは JMP Live に関連する URL の固定された部分です。
次に、Live ID があることがわかります。先ほど少しお話しした連想配列から取得される情報の一つは、フォルダ、そしてデータテーブルにリンクする Live ID です。このように、この URL は、作成時に連想配列に基づいて動的に構築されます。次に、静的なデータと、それに続く JMP Live データテーブル名があります。この URL からデータを取得し、コンテンツをダウンロードします。これは「.JMPLive/contents」です。
繰り返しますが、これは魔法の一部に過ぎません。次に必要なのは、JMP Live テーブルを置き換えることです。すべてのファイルをフォルダにまとめ、ローカルの JMP インスタンス内で連結したら、それをどこかに保存する必要があります。これは、JMP Live テーブルを置き換えるために使用するコードの例です。
新しい接続を作成し、その連想配列に基づいて、アップロード先のテーブルを選択した情報が新しいJMP Liveコンテンツとして配信され、JMP Liveにプッシュバックされてデータを更新します。これにより、フォルダー内の連結されたテーブルに基づいて動的な更新が可能になります。
私のユースケースは何だったのでしょうか?これは、いろいろ試しているうちに、社内で使えたら面白いかもしれないと思ったものです。実際にこれを活用できた例の一つは、安定性の傾向分析です。ここでは、私が書いたコードとその機能の例を示します。冒頭から、このコードの実行内容を示す開始ウィンドウがあり、数枚前のスライドで示した3つの入力項目が表示されています。まず、フォルダーを選択します。次に、データを取得するフォルダーを選択します。今回の場合は、安定性の生データです。技術者がさらにデータを処理するたびに、この生データフォルダーの特定の場所に保存されます。これが、連結元フォルダーとして選択されるものです。
そこから、このファイルをトレンドデータに追加したいと考えました。このファイルに連結を続けたいからです。次に、保存先のJMP Liveフォルダを選択します。今回の場合は、安定性トレンドデータになります。
次に、安定性傾向データテーブルが1つしかないため、次に「安定性傾向データテーブル」を選択します。ただし、これは私が最初に作成したテーブルです。任意の名前を付けることができます。ただし、連想配列はそれをその場所に取得します。この場合、最初にテーブルを作成しました。この場合、これまで使用してきたのは、テーブルがJMP Liveに既に存在している必要があるというものです。しかし、将来的には、これは非常に便利な機能になるでしょう。これは難しい問題ですが、将来的には、動的な機能として追加し続けることができれば素晴らしいと思います。つまり、データは変更される可能性があるため、連結した新しいデータテーブルを作成して特定の場所に保存できるような機能です。
JMP Live側から見るとどう見えるでしょうか?JMP Live側では、開始フォルダが表示されます。他のユーザーがアップロードした私の独立した時点を確認できます。この場合は、私のものです。技術者も、ここに情報を入力できるアクセス権があれば、ここからアップロードできます。これらのテーブルが連結されます。以下は、生データとは別のフォルダにある安定性傾向のフォルダに例を示しています。このフォルダには、私がデータを変更しているデータテーブルが表示されています。
実際にこれが実行されると、バックエンドではどのように見えるでしょうか?連結の様子を観察できると、魔法が起こります。このコードを実際に実行すると、JMP Liveがデータテーブルの更新が完了したことを実際に確認できます。これは、JMP Liveがリアルタイムで更新を行うためです。左側のケースでは、開始時のデータテーブルには時点0と1しかありません。前のテーブルで見たように、時点3まで進んだものもありました。コードを実行すると、これらのテーブルに連結される3つ目の時点があることがわかります。
この結論に達し、このデータを使い続けた後、私はティモシーと協力して「このコードがあります。この講演であなたがやっていることを考えると、役に立つかもしれません」と言いました。するとティモシーはそれを受け取り、さらに力を入れました。
Sage、ありがとう。Sageが行った作業の多くをJMP Liveで活用していたのですが、JMP Liveにある複数のファイルをまとめて新しいテーブルに連結し、それをJMP Liveに取り込めるのは本当に便利だと思いました。私のユースケースでは、ローカルにしか存在しないデータがあり、それをJMP Liveに取り込むだけでなく、既存のデータと連結する適切な方法が必要でした。これは、必ずしも同じ場所にいる必要はなく、同じデータセットにそれぞれが独立してデータを追加できるような、他の人と共有して共同作業を行いたいと考えていました。手動で操作を多く行うのは避けたかったのです。
そこで、もしツールがあれば、基本的にそのツールを使って特定のテーブルに接続できるのではないか、と考えました。それだけでなく、あらゆるデータのETLも実行できる機能も欲しいと思っています。新しい列を追加したり、サマリーテーブルを作成してアップロードしたりしたい場合、JMPワークフロースクリプトを作成し、それを特定のテーブルやプロジェクトにアタッチして、他のユーザーと共有できるような方法があれば本当に助かります。そうすれば、全員が同じ作業を実行し、同じテーブルを更新して、結果をリアルタイムで確認できるようになります。
これはツールウィンドウのほんの始まりを示しています。数秒後にライブウォークスルーを行います。まずはコードについてもう少し詳しく説明したいと思います。スクリプトに関しては、Sage が行っていることに加え、これらすべてをまとめてパッケージ化しています。これを使用する際には、連想配列を多用しています。プロジェクト固有の情報や特別なスクリプトの多くは、連想配列に保存しています。
前のウィンドウでご覧になったかもしれませんが、スクリプト編集ウィンドウがあります。これを実現する魔法は、Eval Parse関数を使うことです。この関数を、空の関数でラップしています。こうすることで、ユーザーはこのウィンドウにスクリプトを貼り付けるだけで済みます。実行すると、テーブルを解析し、結合してJMP Liveにあるものと連結する処理が完璧に実行されます。ここで少しプレゼンテーションを中断して、簡単な例をいくつかお見せします。
まず、ここにJMP Liveのスペースがあり、次に実行中のツールがあります。ツールを初めて開いたとき、このように見えます。一番上のペインには設定セクションがあります。ここで設定を保存しておくと、アドインを実行するたびに、ここで設定した内容が反映されます。JMP Live接続の名前、JMP LiveのベースURL、そしてツールにテーブルのリストを事前に入力するかどうかを指定します。そのテーブルのリストは、この下のセクションです。
これは、スクリプトを追跡し、関連付けたいテーブルを決定する方法です。これは、Sage の新機能の一部を取り入れた例で、新しいテーブルを追加できるようになっています。これについては後ほど説明します。コラボレーションにおいて重要な点の一つは、プロジェクトリストの読み込み機能です。プロジェクトリストを他のユーザーと共有すれば、共有したユーザーはリストを読み込むことができます。
先に進んで、事前に作成したプロジェクトリストを読み込むと、このプロジェクトリストには2つのテーブルが含まれています。「Not my Cat」テーブルと「Weekly Weather Data」テーブルです。スクリプト部分を見ると、これらのテーブルのサイズが少し異なることがわかります。「Not my Cat」テーブルには、実行するとユーザーに開くファイルを選択するよう促し、ファイルを開いた後にそのファイルを返すという基本的なスクリプトがあります。つまり、このファイルが返されると、ここにリストされているテーブルと連結されることになります。
この別の例では、ファイルが開いているだけでなく、他の2つの列の平均を計算する列も追加しています。これを実行する例として、先に進んでください。ここにある「Weekly Weather Data」テーブルがあります。これはすでにかなり大きなテーブルです。124行あり、複数の週にまたがっています。これは1週目から10週目だと思います。テーブルをスクロールしてみましょう。
このツールを実行すると、テーブルを選択するように求められます。ここに、これらのテーブルがいくつか入ったフォルダがあります。新しいテーブルを選択して「開く」ボタンをクリックします。少し待つと、いくつかのテーブルが表示されて消えます。その後、JMP Live でデータが更新されているのが確認できます。テーブルを再読み込みすると、行数は 393 行になっています。
少し戻って、ここにもう一つテーブルを追加したいのですが、JMP Live を見ると、「Class Measurements」という2つ目のテーブルがあり、それに付随するレポートがあります。レポートをクリックします。このレポートでは、いくつかの測定値を追跡していることがわかります。これは、複数の異なる人々の3つの時点にわたって記録されています。まだリストには表示されていませんが、追加できます。Sage が開発した、JMP Live や皆さんがアクセスできるものを検索するためのスクリプトを使用すると、非常によく似たポップアップウィンドウが表示されます。ここからサンプルフォルダを見つけて、「Class Measurement」テーブルを選択し、このプロジェクトリストに追加できます。
これをプロジェクトリストに追加すると、他の項目を切り替えることができます。また、ウィンドウに基本的なスクリプトが事前に入力されているので、これを実行して連結するファイルを選択するだけです。今すぐ実行してみます。このテーブルのタイムポイント3に移動すると、タイムポイント4のファイルがあります。「開く」ボタンをクリックするとファイルがポップアップ表示され、その後消えます。JMP Liveでこのレポートが再生成され、タイムポイント4が追加されていることがわかります。このテーブルにアクセスできる人は誰でも、このツールを使用して、このプロジェクトのデータでこれらのJMP Liveテーブルを更新できます。ただし、JMP Liveでアクセス権を付与する必要があります。
過去に戻ることができます。クラス測定テーブルも更新されているのがわかります。このテーブルはレポートにリンクされており、タイムポイント4のデータもそこにあります。5番目のタイムポイントのデータもあります。もう一度実行して、これも追加してみましょう。すると、再び尾が現れて消え、このテーブルの更新バージョンが完成します。「RELOAD」をクリックすると、追加データがテーブルに追加されたことがわかります。さらに過去に戻ると、チャートも更新されていることがわかります。
これは、特定のプロジェクトにおけるコラボレーションにおいて、私たちにとって非常に刺激的なことです。特に、ワークフロービルダーの使い方やフローの自動化方法をまだ学んでいる人たちにとって、ワークフローを標準化し、スクリプトを共有できるようになることは、特に私たちにとって大きなメリットです。このようなツールを提供することで、複数拠点にまたがるプロジェクトで発生する特定の問題を回避できるのは、非常に大きなメリットです。