如何基于Pandas归属表DataFrame生成电网故障模式表格?
解决方案
核心思路
故障模式本质是最小击中集:即一组线路,所有路径(行)都至少包含其中一条线路,且该组的任何子集都不满足这个条件。按集合大小(故障阶数)从小到大查找:
- 一阶故障:所有路径都包含的单条线路(即所有行值为True的列)。
- 高阶故障:排除一阶故障线路后,依次查找大小为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)
代码说明
- 路径转换:将归属表的每一行转换为线路集合,方便后续击中集检查。
- 一阶故障查找:通过求所有路径集合的交集,得到所有路径都包含的线路。
- 简化路径:移除一阶故障线路,避免后续重复检查。
- 高阶故障查找:
- 生成指定大小的线路组合。
- 检查组合是否为击中集:所有简化路径都包含至少一条组合中的线路。
- 检查最小性:确保该组合的任何子集都不是击中集(避免冗余的高阶故障)。
- 结果整理:将故障模式按阶数和名称排序,生成最终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
相关产品推荐
相关产品推荐

