python - 使用 Python 创建 D3 嵌套 JSON 数据

标签 python json d3.js

我正在尝试构建一个 Python 函数,它将数据格式化为供 D3 使用的 JSON 字符串。

我需要它的格式:

{
 "name": "flare",
 "children": [
  {
   "name": "analytics",
   "children": [
    {
     "name": "cluster",
     "children": [
      {"name": "AgglomerativeCluster", "size": 3938},
      {"name": "CommunityStructure", "size": 3812},
      {"name": "HierarchicalCluster", "size": 6714},
      {"name": "MergeEdge", "size": 743}
     ]
    },

根据http://bl.ocks.org/mbostock/4063550 对于此类型:http://johan.github.io/d3/ex/tree.html

到目前为止我想出的是这样的数据结构:

{'nlp':{'course':['course','range','topics','language','processing','word']}}

并且需要它的结果如下:

{
   "name":"Natural Language Processing",
   "children":[
      {
         "name":"course",
         "children":[
            {
               "name":"course",
               "size":700
            },
            {
               "name":"range",
               "size":700
            },
            {
               "name":"topics",
               "size":700
            },
            {
               "name":"language",
               "size":700
            },
            {
               "name":"processing",
               "size":700
            },
            {
               "name":"word",
               "size":700
            }
         ]
      }
   ]
}

并开始走上这条路

def format_d3_circle(data_input):
    d3_data = {};
    #root level
    d3_data['name'] = data_input[data_input.keys()[0]].keys()[0]
    sub_levels = data_input[data_input.keys()[0]]
    for level_one_key, level_one_data in sub_levels:
        d3_data['children'] = []
    return json.dumps(d3_data)

但我似乎没有正确解决问题,并且发现很难有效地可视化创建 JSON 节点的良好解决方案。

关于如何抽象这个问题,并从字典/列表/JSON 输入等构建我需要的任何嵌套 JSON 结构,有什么建议吗?

最佳答案

这是我一直在研究的一个解决方案,它适用于任意数量级别的一般情况的表格输入数据。

import pandas as pd
import json

def find_element(children_list,name):
    """
    Find element in children list
    if exists or return none
    """
    for i in children_list:
        if i["name"] == name:
            return i
    #If not found return None
    return None

def add_node(path,value,nest):
    """
    The path is a list.  Each element is a name that corresponds 
    to a level in the final nested dictionary.  
    """

    #Get first name from path
    this_name = path.pop(0)

    #Does the element exist already?
    element = find_element(nest["children"], this_name)

    #If the element exists, we can use it, otherwise we need to create a new one
    if element:

        if len(path)>0:
            add_node(path,value, element)

    #Else it does not exist so create it and return its children
    else:

        if len(path) == 0:
            nest["children"].append({"name": this_name, "value": value})
        else:
            #Add new element
            nest["children"].append({"name": this_name, "children":[]})

            #Get added element 
            element = nest["children"][-1]

            #Still elements of path left so recurse
            add_node(path,value, element)

这里是一个如何使用它的示例。您必须告诉它哪些列用作层次结构的级别以及哪些列存储值。

df = pd.read_json('{"l1":{"0":"a","1":"a","2":"a","3":"a","4":"b","5":"b","6":"b","7":"b"},"l2":{"0":"a1","1":"a1","2":"a2","3":"a2","4":"b1","5":"b1","6":"b2","7":"b3"},"l3":{"0":"a11","1":"a12","2":"a21","3":"a22","4":"b11","5":"b12","6":"b22","7":"b34"},"val":{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7,"7":8}}')


d = {"name": "root",
"children": []}

levels = ["l1","l2", "l3"]
for row in df.iterrows():
    r = row[1]
    path = list(r[levels])
    value = r["val"]
    add_node(path,value,d)

print json.dumps(d, sort_keys=False,
              indent=2)

关于python - 使用 Python 创建 D3 嵌套 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22777125/

相关文章:

python - 参数未通过部分传递

javascript - 如何使用 Canvas 在 d3 v4/v5 中平移滚动

jquery - 如何将 Json 数据导入 Jquery 移动应用程序

JavaScript、使用 CSV 的 D3 条形图错误

javascript - D3 - 仅显示轴上的中间和最后一个刻度线

python - Python 中相当基本的字符串扩展?

python - django slice filter用法的区别

Python,在 Windows 7 上使用 Flask 应用程序配置 mod_wsgi

javascript - 在 javascript 中创建一个 Json 对象

php - 使用 JSON 的实时搜索功能