You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Pandas归属表DataFrame生成电网故障模式表格?

解决方案

核心思路

故障模式本质是最小击中集:即一组线路,所有路径(行)都至少包含其中一条线路,且该组的任何子集都不满足这个条件。按集合大小(故障阶数)从小到大查找:

  1. 一阶故障:所有路径都包含的单条线路(即所有行值为True的列)。
  2. 高阶故障:排除一阶故障线路后,依次查找大小为2、3...的最小击中集,确保该集合的任何子集都不是击中集。

实现代码

import pandas as pd
from itertools import combinations

def generate_failure_modes(belonging_df):
    # 将归属表转换为路径集合列表:每个元素是该行中值为True的线路集合
    paths = []
    for _, row in belonging_df.iterrows():
        path = set(row[row].index)
        paths.append(path)
    
    if not paths:
        return pd.DataFrame(columns=['Failure Modes', 'Order of Failure'])
    
    failure_modes = []
    
    # 1. 查找一阶故障(大小为1的最小击中集)
    first_order = set.intersection(*paths)
    for line in sorted(first_order):
        failure_modes.append((line, 1))
    
    # 移除一阶故障线路,生成剩余线路和简化路径
    remaining_columns = set(belonging_df.columns) - first_order
    reduced_paths = [path - first_order for path in paths]
    
    # 2. 查找高阶故障(从大小2开始)
    max_k = len(remaining_columns)
    for k in range(2, max_k + 1):
        current_modes = []
        # 生成所有k条线路的组合
        for combo in combinations(sorted(remaining_columns), k):
            # 检查该组合是否是击中集(所有路径都包含至少一条组合中的线路)
            is_hitting = all(any(line in path for line in combo) for path in reduced_paths)
            if not is_hitting:
                continue
            
            # 检查是否为最小击中集:任何k-1大小的子集都不是击中集
            is_minimal = True
            for sub_combo in combinations(combo, k-1):
                if all(any(line in path for line in sub_combo) for path in reduced_paths):
                    is_minimal = False
                    break
            
            if is_minimal:
                mode_str = ' // '.join(combo)
                current_modes.append((mode_str, k))
        
        failure_modes.extend(current_modes)
    
    # 转换为DataFrame并排序
    result_df = pd.DataFrame(failure_modes, columns=['Failure Modes', 'Order of Failure'])
    result_df = result_df.sort_values(by=['Order of Failure', 'Failure Modes']).reset_index(drop=True)
    return result_df

# 测试示例
if __name__ == "__main__":
    # 构造示例归属表
    belonging_example = pd.DataFrame({
        'A': [False, False, True, True],
        'B': [False, False, True, True],
        'C': [True, True, False, False],
        'D': [False, True, False, True],
        'E': [True, False, True, False],
        'F': [True, True, True, True]
    })
    
    # 生成故障模式表
    result = generate_failure_modes(belonging_example)
    print(result)

代码说明

  1. 路径转换:将归属表的每一行转换为线路集合,方便后续击中集检查。
  2. 一阶故障查找:通过求所有路径集合的交集,得到所有路径都包含的线路。
  3. 简化路径:移除一阶故障线路,避免后续重复检查。
  4. 高阶故障查找:
    • 生成指定大小的线路组合。
    • 检查组合是否为击中集:所有简化路径都包含至少一条组合中的线路。
    • 检查最小性:确保该组合的任何子集都不是击中集(避免冗余的高阶故障)。
  5. 结果整理:将故障模式按阶数和名称排序,生成最终DataFrame。

测试输出

运行代码后,输出与示例完全一致:

Failure Modes  Order of Failure
0             F                 1
1        A // C                 2
2        B // C                 2
3        D // E                 2

内容的提问来源于stack exchange,提问作者Ruan Carlo Weiers Britzke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:54:57