将 "size" 元素附加到朝阳图的最后 json 个子元素

Appending "size" element to last json child element for a sunburst diagram

我有一个有效的 python 脚本,它获取我的 csv 列数据并将其转换为 json 文件,以供我的 d3 sunburst 可视化读取。问题是在最终子元素中没有 "size" 正确填充旭日图所需的元素。

下面是我的脚本,它按照我需要的方式将 csv 读取为 json。我尝试使用 if else 循环修改脚本以查找没有子元素(最后一个元素)的位置,然后在该元素上附加 "size: 1" 但没有任何反应。

这是示例 csv 数据。该代码应该适用于任何东西。

能量、美容、脱落、可训练性、群体、品种

定期锻炼,每周刷牙 2-3 次,季节性,轻松训练,玩具组,Affenpinscher

import csv
from collections import defaultdict

def ctree():
return defaultdict(ctree)


def build_leaf(name, leaf):
res = {"name": name}

# add children node if the leaf actually has any children
if len(leaf.keys()) > 0:
    res["children"] = [build_leaf(k, v) for k, v in leaf.items()]

return res

def main():
tree = ctree()
# NOTE: you need to have test.csv file as neighbor to this file
with open('test.csv') as csvfile:
    reader = csv.reader(csvfile)
    for rid, row in enumerate(reader):
        if rid == 0:
            continue

        # usage of python magic to construct dynamic tree structure and
        # basically grouping csv values under their parents
        leaf = tree[row[0]]
        for cid in range(1, len(row)):
            leaf = leaf[row[cid]]

# building a custom tree structure
res = []
for name, leaf in tree.items():
    res.append(build_leaf(name, leaf))

# this is what I tried to append the size element
def parseTree(leaf):
   if len(leaf["children"]) == 0:
      return obj["size"] == 1
   else:
       for child in leaf["children"]:
           leaf['children'].append(parseTree(child))

# printing results into the terminal
import json
import uuid
from IPython.display import display_javascript, display_html, display
print(json.dumps(res, indent=2))

main()

最后的子元素需要这样读:

[
{
    "name": "Regular Exercise",
    "children": [
        {
            "name": "2-3 Times a Week Brushing",
            "children": [
                {
                    "name": "Seasonal",
                    "children": [
                        {
                            "name": "Easy Training",
                            "children": [
                                {
                                    "name": "Toy Group",
                                    "children": [
                                        {
                                            "name": "Affenpinscher",
                                            "size": 1
                                        }
                                    ]
                                }]}]}]}]}]}

要将 size 添加到最后一个条目:

import csv
from collections import defaultdict
import json
#import uuid
#from IPython.display import display_javascript, display_html, display


def ctree():
    return defaultdict(ctree)


def build_leaf(name, leaf):
    res = {"name": name}

    # add children node if the leaf actually has any children
    if leaf.keys():
        res["children"] = [build_leaf(k, v) for k, v in leaf.items()]
    else:
        res['size'] = 1

    return res


def main():
    tree = ctree()
    # NOTE: you need to have test.csv file as neighbor to this file
    with open('test.csv') as csvfile:
        reader = csv.reader(csvfile)
        header = next(reader)  # read the header row

        for row in reader:
            # usage of python magic to construct dynamic tree structure and
            # basically grouping csv values under their parents
            leaf = tree[row[0]]

            for value in row[1:]:
                leaf = leaf[value]

    # building a custom tree structure
    res = []

    for name, leaf in tree.items():
        res.append(build_leaf(name, leaf))

    # printing results into the terminal
    print(json.dumps(res, indent=2))


main()