折腾:
【未解决】用Python计算整个团队的当期业绩
期间,希望实现:

的树结构
且每个节点,带额外数据,以便于辅助计算
python tree
python tree库
好像也可以?
去看看
节点Node是否支持 传入特定的数据
还会支持:Visualization 画图出来
* Node: a simple tree node with at least a name attribute and any number of additional attributes.
Node中允许传入,任意的其他数据
然后去试试。
其中,感觉,先用,数据量不大的,简单的数据,去测试看看逻辑是否正确
如果没问题,再换用真实的大量的数据,不容易出错
且看到
中的:
descendants¶
All child nodes and all their child nodes.
好像就是方便后续计算业绩
算了,不用demo数据了,直接用真实数据吧。
现在问题转换为:
创建Node节点了。
先去安装库:
pipenv install anytree
log
master pipenv install anytree Courtesy Notice: Pipenv found itself running within a virtual environment, so it will automatically use that environment, instead of creating its own for any project. You can set PIPENV_IGNORE_VIRTUALENVS=1 to force pipenv to ignore that environment and create its own instead. You can set PIPENV_VERBOSITY=-1 to suppress this warning. Installing anytree... Adding anytree to Pipfile's [packages]... ✔ Installation Succeeded Pipfile.lock (6415b7) out of date, updating to (bed629)... Locking [dev-packages] dependencies... Locking [packages] dependencies... Building requirements... Resolving dependencies... ✔ Success! Updated Pipfile.lock (bed629)! Installing dependencies from Pipfile.lock (bed629)... 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
再去写代码
另外,为了图形化显示,还是去安装库:
>>> # graphviz needs to be installed for the next line!
不过先去文字形式显示
先去调试代码

可以从导入的Node中看到,有哪些函数和属性


此处面对特殊情况:
【已解决】anytree创建节点期间如何定位查找某个节点
写了代码,调试半天,结果是:
此处数据,生成后,竟然还有93个根节点。。。

而不是希望的:只有一个根节点
本来,打算放弃用这个tree的
后来想到:可以加个虚拟的,不用的 空节点
比如id即name是:fakeroot0000
那去加上试试:
【已解决】anytree中打印出Tree树的结构文字版和图片版
然后可以继续处理,给Node加上money了。
【总结】
最后用代码:
for curParentId, curChildIdList in recommandRelationDict.items():
print("curParentId=%s, curChildIdList=%s" % (curParentId, curChildIdList))
# curParentId=a12341234123, curChildIdList=['a12341234121']
existedParentNode = findNode(curParentId)
curRootNode = None
if existedParentNode:
curParentNode = existedParentNode
curRootNode = curParentNode
else:
# curParentNode = Node(curParentId)
curParentNode = createNode(curParentId)
curRootNode = curParentNode.root
if not curRootNode:
curRootNode = curParentNode
gRootNodeList.append(curRootNode)
print("curParentNode=%s" % curParentNode)
# curParentNode=Node('/a12341234123')
for eachChildId in curChildIdList:
existedChildNode = findNode(eachChildId)
if existedChildNode:
if not existedChildNode.parent:
existedChildNode.parent = curParentNode
curChildNode = existedChildNode
else:
# curChildNode = Node(eachChildId, parent=curParentNode)
curChildNode = createNode(eachChildId, nodeParent=curParentNode)
print("curChildNode=%s" % curChildNode)
# Node('/a12341234123/a12341234121', personalSaleMoney=17226.72636907)
# curChildNode=Node('/aa1234512333/aa1234512334')
updateRootNodeList(curChildNode)
# # for debug
# for pre, fill, node in RenderTree(curRootNode):
# # print("pre=%s,fill=%s,node=%s" % (pre, fill, node))
# print("%s%s" % (pre, node.name))
# print("gRootNodeList=%s" % gRootNodeList)
print("curRootNode=%s" % curRootNode)去生成各个节点
由于有很多top的节点,所以加了个假的根节点
### add topest fake root node
# fakeRootNode = Node(FakeRootNodeId)
fakeRootNode = createNode(FakeRootNodeId)
for eachFinalRootNode in gRootNodeList:
if eachFinalRootNode.parent:
print("eachFinalRootNode=%s" % eachFinalRootNode)
else:
eachFinalRootNode.parent = fakeRootNode后续去调试:
def dbgPrintTopNodeList():
global gRootNodeList
# for debug
print("Output each top node relation to image ...")
for curTopNode in gRootNodeList:
# # for debug
curNodeRealtionFile = "Relation_%s_%s.png" % (curTopNode.name, gCurDateStr)
curNodeRealtionImg = os.path.join(gCurOutputFolder, curNodeRealtionFile)
# 'output/20210615/Relation_aaaaaaaa5522_20210615.png'
print("generating %s" % curNodeRealtionImg)
DotExporter(curTopNode).to_picture(curNodeRealtionImg)
def dbgPrintTreeToJson(curNode, outputFilename=None):
# for debug
print("Output all node relation to json...")
if not outputFilename:
outputFilename = "RelationAll_%s.json" % gCurDateStr
curOutputJson = os.path.join(gCurOutputFolder, outputFilename)
jsonExporter = JsonExporter(indent=2, sort_keys=True)
treeJsonStr = jsonExporter.export(curNode)
treeJson = json.loads(treeJsonStr)
saveJsonToFile(curOutputJson, treeJson)
def dbgPrintTree(curNode):
# for debug
for pre, fill, node in RenderTree(curNode):
# print("pre=%s,fill=%s,node=%s" % (pre, fill, node))
print("%s%s" % (pre, node.name))
dbgPrintTreeToJson(curNode)
# # for debug
print("Output all node relation to single image ...")
outputImgFile = "RelationAll_%s.png" % gCurDateStr
curOutputImg = os.path.join(gCurOutputFolder, outputImgFile)
DotExporter(curNode).to_picture(curOutputImg)
gRootNode = fakeRootNode
dbgPrintTree(gRootNode)
dbgPrintTopNodeList()
# dbgPrintTreeToJson(gRootNode)即可输出树状结构:


由此,构建出了,需要的,带字段属性的tree。
用于后续其他计算。