JSON からデータ テーブルへ: NULL 列が自動的に削除されないようにする方法は?こんにちは、みんな、
私は JMP 15 を使用しており、Http Request() 経由で JSON ペイロードを取得し、それを Char から Blob() に実行して、データ テーブル内で open() する JSL を使用しています。 JSON ペイロードのコンテンツは動的ですが、常に表形式 (行と列) にマッピングできます。
問題: JSON 内のキーにすべて NULL 値がある場合、それらはデータ テーブルに含まれません (つまり、これらのキーに対して列は作成されません)。 すべての値が NULL かどうかに関係なく、JSON 内のすべてのキーをデータ テーブルの列として表示したいので、これには問題があります。
ペイロードをローカル ファイルに保存し、Open() を使用して直接開くと、望ましい結果が得られます。つまり、すべてのキーが列に変換され、すべての NULL 値が NULL として表示されるデータ テーブルが得られます。 ただし、これは私のユースケースでは機能しません。
以下は、問題を再現する基本的な JSL です。 Http Request() の代わりに、Load Text File() を使用してデータを取得すると、同じ結果が得られます。 「data.json」というファイルが添付されています。
dt1 = Open("/Users/abc/data.json", JSON ); // works as desired
raw = Load Text File("/Users/abc/data.json");
jsonblob = Char To Blob( raw );
dt2 = open(jsonblob, "JSON", Guess("wide")); // does not work as desired -- drops all-NULL columns変数内の JSON をすべて NULL キーを保持するデータ テーブルに変換する方法を誰かが提案できますか?
ありがとう!
アンディ
結果の共有と伝達Re: JSON からデータ テーブルへ: NULL 列が自動的に削除されるのを回避するにはどうすればよいですか?要素を持たない JSON 配列は、JMP にとって問題になります。1 つのオプションは、空の配列を少なくとも 1 つの子を持つ配列に置き換えることです。その子を null にするか、欠損値文字 [.] を使用できます。これは、有効な JSON がもう存在しないことを意味すると思いますが、JMP 16 は引き続き JSON を読み取ります。現時点では、その動作を壊す計画はありません。null を使用すると文字列が作成され、欠損値を使用すると数値列が作成されます。JSON に [] を含む文字列データがないことがわかっている場合は、この変更を行うだけで済みます。
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
JSON 文字列内の [] の置換を防ぎたい場合は、文字列をスキップするためにさらに数行の jsl が必要になりますが、それでもそれほど難しくはありません。
Re: JSON からデータ テーブルへ: NULL 列が自動的に削除されるのを回避するにはどうすればよいですか?ご指摘ありがとうございます。 @Craige_Hales 。箇条書き 1 に記載されている欠陥については、JMP の将来のリリースでの検討のために開発チームに報告しました。
実際のところ、これらは JMP 14.3 では null 列を削除しないようです。
raw = Load Text File( "$DOWNLOADS/data.json" );
jsonblob = Char To Blob( raw );
dt2 = Open( jsonblob, "JSON", Guess( "wide" ) );
JSON To Data Table( raw, Guess( "wide" ) );
Re: JSON からデータ テーブルへ: NULL 列が自動的に削除されるのを回避するにはどうすればよいですか?json のソースを制御でき、それを実際の pandas 形式として取得できる場合は、
orient='table' (in python code)
良い選択かもしれません。 JMP のインポートでは、そのメタデータの一部を使用できます。 JMP は他の方向も読み取ることができます。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Re: JSON からデータ テーブルへ: NULL 列が自動的に削除されるのを回避するにはどうすればよいですか?- OK、ワイド オプションが使用する正しいオプションだと思います。すべて欠落している列がインポートから削除されるのはバグです。@ウェンディ・マーフリーそれは確かに物事を複雑にします。
- 考えられるすべての列がわかっていて、サブセットのみが JSON に含まれる場合は、JSON 設定ですべての列をリストできます。 最初に簡単なテストを実行し、必要なとおりに動作するかどうかを確認します (列の完全なセットが取得できるか、JSON に表示されるサブセットのみが取得できるかはわかりません)。
- 以前のバージョンの JSON インポート コードには引き続きアクセスできます。 JSON を (JSON SETTINGS または Guess パラメーターなしで) 指定すると、希望どおりの結果が得られる可能性があります。
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- JSON は、どの pandas 形式ともまったく似ていません。 ただし、pandas オプションを使用すると、必要な列名を取得できるようです。他に何も機能しない場合は、実際にデータを取得するための 2 回目のインポートのためにオンザフライで JSON 設定を作成するための開始点となる可能性があります。
- 私が知っている限り、JSON 設定に関する具体的なドキュメントはありません。これはウィザードによって書かれることを目的としており、人間が読める形式になっています。 これはウィザード ダイアログの値と一致しており、そこにドキュメントが存在します。
- ImportSettings は CSV インポートで使用されていると確信していますが、おそらく他の何かでも使用されていると思います。 これらは JSON ウィザードでは使用されません。
(更新: いくつかの小さな編集)
Re: JSON からデータ テーブルへ: NULL 列が自動的に削除されるのを回避するにはどうすればよいですか?提案してくれてありがとう、クレイジ。 試してみましたが、いくつか追加の質問があります。
1. Guess を「wide」から「pandas」に変更すると、データ テーブルに NULL 列が正常に含まれます。残念ながら、新しい問題が発生します。JSON データの最後の「行」がデータ テーブルのすべての行で繰り返されます (添付の「pandas.png」を参照 -- ロット番号 21055 が 2 回繰り返されており、ロット番号 21054 は含まれていません。 これと同じ動作をより大きなデータセットで再現しました)。
これを修正できる可能性のある他の Open() パラメータまたは設定はありますか?
2. ウィザードを使用して、NULL 列を含む data.json ファイルを正常にインポートできました。ただし、生成されたスクリプトは data.json のペイロードに固有のものです (添付の「script_view.png」を参照)。 私の使用例はより一般的です。JSL が受け取るペイロードの列数と列ラベルは異なります。 ウィザードの出力を使用して、より汎用的な構成オプションを作成する方法はありますか? それとも、手動でペイロードを反復処理してデータテーブルを列ごとに構築する唯一のオプションですか?
2b. これに関連して -- Open() で「JSON 設定」パラメータを使用するためのドキュメントを教えていただけますか? 構文リファレンスやスクリプト索引には何も見つかりませんでした (そして、「JMP JSL "JSON settings"」をグーグルで検索すると、トップにヒットしたのは、このフォーラムでの私の以前の質問です)。
3. Open() に空の列を数値として強制的にインポートさせる方法はありますか? インポート設定で「空の列を数値として扱う (1)」を試してみたところ、data.json ファイルが単一の行/レコードとして扱われるようになりました (添付の「pandas_numeric.png」を参照)。何かが間違っています。
ありがとう!
アンディ
Re: JSON からデータ テーブルへ: NULL 列が自動的に削除されるのを回避するにはどうすればよいですか?役立つかもしれない答えを以下に書きましたが、最初に試してみるべき簡単な答えがあることに気付きました。 データはパンダ形式の一つのようですので、「wide」を「pandas」に変更します。
それが間違っていることがわかったら、試してみてください...
ウィザードを使用して列を明示的に選択し、そのスクリプトを使用します。
You'll probably want the stack option too.You'll probably want the stack option too.おそらくスタック オプションも必要になるでしょう。
また、行ジェネレーターをルートからアイテムに変更しました。これは、もう少し正確であるためです。 おそらく、実質的な違いは生じないでしょう。
「行」に選択された項目により、その項目が出現するたびに新しい行がデータテーブルに書き込まれます。 統計をオンにすると、アイテムが 2 回繰り返されることがわかります。