基于Python的电力系统故障CSV数据统计分析技术求助
高效处理电力系统仿真CSV数据的统计与可视化方案
我来帮你搞定这个电力系统仿真数据的统计任务!之前用正则解析嵌套元组列表确实容易踩坑,而且效率不高,换成ast.literal_eval来解析字符串形式的Python数据结构会靠谱得多。下面是一套完整、规范的实现方案,覆盖你所有的统计需求:
1. 导入依赖库
首先安装并导入需要的工具:
import pandas as pd import ast import matplotlib.pyplot as plt import seaborn as sns # 设置可视化风格,让图表更美观 sns.set_style("whitegrid") plt.rcParams["font.size"] = 12
2. 读取并预处理数据
重点是安全解析第8列的故障事件列表(注意CSV列索引从0开始,第8列对应索引7,故障标记列是第7列对应索引6):
# 读取CSV数据,替换成你的文件路径 df = pd.read_csv("your_simulation_data.csv") # 定义安全解析故障事件的函数,处理空值和格式错误的情况 def parse_fault_events(event_str): if pd.isna(event_str): return [] try: # 将字符串形式的元组列表转换为实际Python对象 return ast.literal_eval(event_str) except (SyntaxError, ValueError): # 遇到格式异常的条目直接返回空列表,避免程序崩溃 return [] # 解析第8列的故障事件,生成新列存储 df["fault_events"] = df.iloc[:, 7].apply(parse_fault_events) # 将第7列的故障标记转为布尔值,方便后续筛选 df["has_fault"] = df.iloc[:, 6].astype(bool)
3. 完成统计分析任务
任务1:总仿真次数与故障仿真占比
total_simulations = len(df) fault_simulations = df["has_fault"].sum() fault_ratio = fault_simulations / total_simulations print(f"总仿真次数: {total_simulations}") print(f"故障仿真次数: {fault_simulations}") print(f"故障仿真占比: {fault_ratio:.2%}")
任务2:统计各类故障类型占比
先展开所有故障事件,再提取故障原因(部分条目无原因,统一标记为Unknown):
# 筛选出有故障的记录,把嵌套的故障事件列表展开成单条记录 all_faults = df[df["has_fault"]]["fault_events"].explode() # 提取故障类型的函数,适配两种元组格式 def extract_fault_type(event): # 元组格式:('故障元件','故障原因','故障时间') 或 ('故障元件','故障时间') if len(event) >= 3: # 假设故障原因直接是类型(如Over-Speed、OverVoltage) return event[1].strip() else: return "Unknown" fault_types = all_faults.apply(extract_fault_type) # 统计各类型占比,按占比降序排列 fault_type_ratios = fault_types.value_counts(normalize=True).sort_values(ascending=False) print("\n各类故障占比:") print(fault_type_ratios.round(4)*100)
任务3:统计易发生故障的元件及其占比
同样展开故障事件,提取故障元件并统计:
# 提取故障元件的函数 def extract_fault_component(event): return event[0].strip() fault_components = all_faults.apply(extract_fault_component) # 统计各元件故障占比,按占比降序排列 component_ratios = fault_components.value_counts(normalize=True).sort_values(ascending=False) print("\n易故障元件占比:") print(component_ratios.round(4)*100)
4. 生成可视化图表
故障仿真占比饼图
plt.figure(figsize=(6,6)) plt.pie([total_simulations - fault_simulations, fault_simulations], labels=["无故障", "有故障"], autopct="%.1f%%", colors=["#4CAF50", "#FF5722"]) plt.title("故障仿真占比") plt.show()
故障类型占比条形图(只显示前10种)
plt.figure(figsize=(10,6)) top_fault_types = fault_type_ratios.head(10) sns.barplot(x=top_fault_types.values*100, y=top_fault_types.index, palette="viridis") plt.xlabel("占比 (%)") plt.ylabel("故障类型") plt.title("Top 10 故障类型占比") plt.show()
易故障元件占比条形图(只显示前10种)
plt.figure(figsize=(10,6)) top_components = component_ratios.head(10) sns.barplot(x=top_components.values*100, y=top_components.index, palette="coolwarm") plt.xlabel("占比 (%)") plt.ylabel("故障元件") plt.title("Top 10 易故障元件占比") plt.show()
关键优势说明
- 高效解析:用
ast.literal_eval替代正则,能安全、快速解析嵌套的元组列表,避免正则的复杂匹配逻辑和格式错误问题; - 健壮性:加入异常处理,能容忍CSV中格式不规范的故障事件条目;
- 可扩展性:如果后续需要提取故障时间等其他字段,只需修改提取函数即可。
内容的提问来源于stack exchange,提问作者Lexi Ligeti
相关产品推荐
相关产品推荐

