代码之家  ›  专栏  ›  技术社区  ›  sebhofer

将JSON扩展到deedle数据框架的列

  •  1
  • sebhofer  · 技术社区  · 7 年前

    我试图将从网站获得的JSON转换为deedle数据框架,将JSON条目扩展到数据框架的各个列。我发现 this discussion ,但我无法使建议的解决方案对我有效。由于我对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 } 
    

    我非常感谢您的任何意见!

    1 回复  |  直到 5 年前
        1
  •  1
  •   Tomas Petricek    7 年前

    问题似乎是 It 在数据框中不是 JsonValue ,但编译器生成的子类之一,用于表示区分并集的个别情况,在这种情况下,是一个名为 JsonValue+Record .

    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