对一棵树求和,叶节点中的值和父节点中的小计(直到根)

时间:2018-07-30 05:00:20

标签: python graph-theory

是否存在一种容易使用的解决方案,可以对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。但是此解决方案假定每个节点都有唯一的值,并且边仅是关系。

1 个答案:

答案 0 :(得分:0)

在对鼓励的激动人心的回应之后,我在NetworkX中实施了一个解决方案。

研究文档和其他各种资源后,我了解了我的具体求和树问题根“数量”值是每个子代的“数量”属性的总和)在野外并不常见-显而易见。

对于以后发现此问题的任何人,这是概述中的解决方案。我用Pandas构造了图,如下所示。

  1. 创建查询结果的DF。
  2. Munge DF(删除未使用的行,列)。
  3. 标题和DF列的基本文本规范化
  4. 在DF行中明确编辑节点标签异常。
  5. 用于父级,子级标签发现的条件DF。
  6. 从根到根的距离增加时,将DF分成多个块。
  7. 创建基本图。
  8. 更新基本图形;使用#6
  9. 添加父边缘和子边缘
  10. 使用节点值更新图形。
  11. 验证每个父节点的分配值与其子值之和recursively with a little help from my friends

final graph

有关使用NetworkX通过各种输入创建树的两个有用提示

为什么G不是树?几种推荐的图形检查方法(nx.is_connected(G)nx.connected_component_subgraphs(G))导致此错误:NetworkXNotImplemented: not implemented for directed type。 (步骤10需要有向图)。另一种方法(list(nx.isolates(G)))不会产生错误,但始终会产生一个空列表。

此树的最终图形生成解决方案使用两种技术来确保该图是一棵树:

  • 通过将节点添加到常见的静态定义的基础图来构建图。 Base tree

  • 利用更多的列数据将输入DF块化为从根开始递增的级别。

最后一点不是从该数据创建树的必要条件,因为输入数据已经具有树结构。但是,必须调试结果量中的节点标签。更新DF对于该图不是必需的,但事实证明对以后的调试和识别标签异常值很有用。

所有例外情况在源数据中都是不一致的名称。源数据会发生变化,因此在寻找将来的解决方案时,这将仍然是一个问题。

相关问题