是否存在一种容易使用的解决方案,可以对n元树的所有叶节点求和,并将其总和一直分配给其父节点,直到根为止?
让我解释一下。我每周收到几份报告。这是一个财务文档,本质上是一个不平衡的分层数据集,最多可扩展到9个级别。仅在最后一级分配值,但每个父级都有其子级的总和(即,只有1个边沿)。
它看起来像:
root:
sectionA:
sectionB:
sectionC:
sectionD:
subtotal sectionE = sum of x
leaf-1 = x_1
leaf-2 = x_2
leaf-n = x_n
我正在努力对此数据集进行自动验证。我需要对每片叶子求和,并确定它是否与 parent-subtotal 一直匹配到 root-total 。
此外,我还有第二张表列出所有叶子元素及其父关系。像这样:
root:sectionA:sectionB:sectionC:sectionD:sectionE:leaf
我认为k元树可以代表从表#2生成的正确报告结构。然后使用树与每周报告进行比较。我喜欢这个方向,因为第二个表具有这种形式的结构数据(完整的父路径)。接下来,当我的脚本完成时,我将需要概括该解决方案。
是否存在可解决此问题的Python模块或通用算法?
这是示例解决方案Sum of all elements of N-ary Tree。但是此解决方案假定每个节点都有唯一的值,并且边仅是关系。
答案 0 :(得分:0)
在对鼓励的激动人心的回应之后,我在NetworkX中实施了一个解决方案。
研究文档和其他各种资源后,我了解了我的具体求和树问题(根“数量”值是每个子代的“数量”属性的总和)在野外并不常见-显而易见。
对于以后发现此问题的任何人,这是概述中的解决方案。我用Pandas构造了图,如下所示。
有关使用NetworkX通过各种输入创建树的两个有用提示
为什么G不是树?几种推荐的图形检查方法(nx.is_connected(G)
,nx.connected_component_subgraphs(G)
)导致此错误:NetworkXNotImplemented: not implemented for directed type
。 (步骤10需要有向图)。另一种方法(list(nx.isolates(G))
)不会产生错误,但始终会产生一个空列表。
此树的最终图形生成解决方案使用两种技术来确保该图是一棵树:
最后一点不是从该数据创建树的必要条件,因为输入数据已经具有树结构。但是,必须调试结果量中的节点标签。更新DF对于该图不是必需的,但事实证明对以后的调试和识别标签异常值很有用。
所有例外情况在源数据中都是不一致的名称。源数据会发生变化,因此在寻找将来的解决方案时,这将仍然是一个问题。