ウェブサイトから取得したJSONをdeedleデータフレームに変換し、JSONエントリをデータフレームの個別の列に展開しようとしています。私はこの議論を見つけましたが、提案された解決策を私のために機能させることができません。JSONとdeedleの両方に慣れていないので、ばかげた間違いをしている可能性があります。私は以下を試しています(主に引用された議論からコピーされました):
let rec expander key value =
seq {
match value with
| JsonValue.String (s) -> yield key,typeof<string>,box s
| JsonValue.Boolean (b) -> yield key,typeof<bool>,box b
| JsonValue.Float (f) -> yield key,typeof<float>,box f
| JsonValue.Null (_) -> yield key,typeof<obj>,box ()
| JsonValue.Number (n) -> yield key,typeof<decimal>,box n
| JsonValue.Record (r) -> yield! r |> Seq.collect ((<||)expander)
| JsonValue.Array (a) ->
yield! a
|> Seq.collect (expander "arrayItem")
}
Frame.CustomExpanders.Add(typeof<JsonDocument>,
fun o -> (o :?> JsonDocument).JsonValue |> expander "root")
Frame.CustomExpanders.Add(typeof<JsonValue>,
fun o -> o :?> JsonValue |> expander "root")
let info =
JsonValue.Parse(""" { "name": "Tomas", "born": 1985 } """)
let df =
[ series ["It" => info] ]
|> Frame.ofRowsOrdinal
let dfexpanded = Frame.expandAllCols 2 df
これは私に解釈の仕方がわからない何かを与えますが、望ましい結果ではありません:
It.properties It.Tag It.IsString It.IsNumber It.IsFloat It.IsRecord It.IsArray It.IsBoolean It.IsNull It._Print
0 -> System.Tuple`2[System.String,FSharp.Data.JsonValue][] 3 False False False True False False False { "name": "Tomas", "born": 1985 }
私はどんな入力にも感謝しています!
問題はIt
、データフレーム内の型がではなくJsonValue
、識別された共用体の個々のケースを表すためにコンパイラによって生成されたサブクラスの1つであるようJsonValue+Record
です。この特定のケースでは、という名前のネストされた型です。
Deedleは完全に一致する型を探します(そして基本クラスのエクスパンダーを見つけようとはしません)ので、回避策はネストされたクラスごとにエクスパンダーを登録することです。
for t in typeof<JsonValue>.GetNestedTypes() do
Frame.CustomExpanders.Add(t, fun o -> o :?> JsonValue |> expander "root")
これを実行した後、コードは期待される結果をもたらします。
val dfexpanded : Frame<int,string> =
It.name It.born
0 -> Tomas 1985
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加