weiruikui 2024-06-06 15:00 采纳率: 11.1%
浏览 43
已结题

在BOM清单查询多层BOM,返回指定产品查询结果

查询BOM是一个Dataframe

img


查找指定Series[A,B]返回结果是一个Dataframe如下图

img


前行与后行有父子关系的要放在一起,如上图第一行找到的是第二行,第二行找到的是第三行直至没有下层BOM,层级分别是1、2、3,q然后第四行是是找到第二层的第二个物料,如此循环
因为BOM清单有数十万行,所以需要考虑代码的运行速度。

  • 写回答

25条回答 默认 最新

  • 阿里嘎多学长 2024-06-06 15:01
    关注
    获得0.15元问题酬金

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    要解决这个问题,我们可以使用Python中的Pandas库来处理和分析BOM清单数据。以下是一个可能的解决方案,包括代码示例和一些性能优化的考虑。

    解决方案概述

    1. 数据加载:首先,我们需要将BOM清单数据加载到一个Pandas DataFrame中。
    2. 数据预处理:确保数据格式正确,没有缺失值或错误。
    3. 查询构建:构建一个函数来查询指定的产品系列(如A和B)。
    4. 层级构建:使用递归或循环来构建每个子物料的层级。
    5. 性能优化:考虑使用向量化操作和适当的数据类型来提高性能。

    示例代码

    假设我们已经有了一个DataFrame bom_df,其中包含了BOM清单的数据。

    import pandas as pd
    
    # 假设bom_df是已经加载好的BOM数据
    # bom_df.columns = ['父物料', '子物料', '层级']
    
    def query_bom(bom_df, series):
        # 创建一个空的DataFrame来存储结果
        result_df = pd.DataFrame(columns=['父物料', '子物料', '层级'])
        
        # 对于指定的系列,查询其所有子物料
        for item in series:
            # 查询顶层物料
            top_materials = bom_df[bom_df['子物料'] == item]
            
            # 递归查询所有子物料
            def recursive_query(material, level):
                children = bom_df[bom_df['父物料'] == material]
                if not children.empty:
                    # 将当前物料及其子物料添加到结果中
                    result_df = result_df.append({
                        '父物料': material,
                        '子物料': children['子物料'].iloc[0],
                        '层级': level
                    }, ignore_index=True)
                    # 递归查询子物料的子物料
                    recursive_query(children['子物料'].iloc[0], level + 1)
            
            # 从顶层物料开始递归查询
            for _, top in top_materials.iterrows():
                recursive_query(top['子物料'], 1)
        
        return result_df
    
    # 查询指定系列[A, B]
    series_to_query = ['A', 'B']
    result = query_bom(bom_df, series_to_query)
    print(result)
    

    性能优化

    • 避免循环:在可能的情况下,尽量使用Pandas的向量化操作来替代循环,这可以显著提高性能。
    • 使用适当的数据类型:确保DataFrame中的数据类型是最优的,例如,对于分类数据使用category类型。
    • 索引:为DataFrame设置适当的索引,可以加快查询速度。
    • 并行处理:如果数据量非常大,可以考虑使用并行处理技术,如Dask或Spark。

    参考资料

    请注意,这个解决方案是一个起点,可能需要根据实际数据结构和需求进行调整。如果BOM数据非常庞大,可能需要考虑使用更高级的数据处理框架或数据库系统来处理数据。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月14日
  • 创建了问题 6月6日