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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:07:37