资讯动态

电力漏电用户自动识别:基于Python的特征工程与异常检测实践

发布时间:2026/9/2 1:46:21 来源:尧图企业网站定制
简介电力漏电用户自动识别Python源码包面向电网运维与数据挖掘学习者聚焦利用用电数据自动识别漏电异常用户。压缩包共15个文件总大小仅49KB内含Python脚本、决策树模型、npy数据数组、png可视化图、Excel数据表及导入说明可完整支撑从数据读取到模型应用的流程。资源利用数据挖掘算法分析用户用电模式通过预处理缺失数据、训练模型并输出分类结果帮助读者理解漏电用户识别的建模思路与关键参数调整同时包含原始Excel数据与处理后的表格便于对照复现实验npy文件保留模型中间结果png图表直观展示识别效果。已有213人学习、下载适合正在学习Python数据挖掘、分类算法或电力异常检测的开发者参考。1. 为什么需要自动识别漏电用户供电一线真正头疼的事如果你在供电公司或者电力运维行业待过一定经历过这种场景某个台区的线损率突然从正常的5%飙到15%以上变压器总表读数对不上所有分户表的累计电量线损分析系统给出了疑似窃电的提示但现场核查人员拿着钳形电流表挨家挨户测跑断腿也未必能找到问题源头。这里有个很常见却容易被忽略的根源——漏电。线路老化、绝缘破损、用户内部私拉乱接导致对地泄漏电流没有经过计量表形成回流直接入了地。这种漏电和窃电在台区总表的表现几乎一样都是发得出去、收不回来。但处理方式完全不同窃电要抓人漏电要抢修。如果总把漏电当窃电查方向就错了且人力成本极高。电力漏电用户自动识别这个Python项目本质上解决的就是如何在成百上千户居民中用数据先把嫌疑用户圈到一个很小的范围内。它不替代现场核查而是让现场核查从挨户排查变成按名单上门验证。这套源码的实现逻辑是把用电信息采集系统导出的海量负荷数据转化为可计算的漏电特征指标再用规则加算法筛选出异常用户。整套系统跑完输出一份疑似漏电用户名单运维人员拿着名单去现场测绝缘电阻命中率比随机排查高出几个量级。适合谁来用两类人。一类是供电公司、电力运维公司的数据分析岗手里有采集数据但缺一套快速分析工具另一类是做电力数据项目的Python开发者需要理解漏电识别的业务逻辑和建模思路。这篇文章不讲玄乎的机器学习大词就讲这套源码从数据到名单的完整实现过程以及我在实际落地中踩过的坑。2. 判断漏电的底层依据从电气原理到可计算的特征2.1 漏电在数据上的表现不是没电而是该断的没断先厘清一个基本概念。用户侧漏电指的是相线火线与大地之间出现了不该有的导通路径电流通过绝缘层破损点流入大地。这种情况下计量表记录的电流值并不是纯粹的负载电流而是负载电流与漏电流的矢量和。当漏电点发生在表后线路漏电流始终存在哪怕用户把所有电器都关了只要总闸合着表上依然会录到一个小电流。这个特性非常关键它是整套识别算法最重要的锚点一个用户如果在夜间长时间处于轻载状态但进线电流始终降不下来就有漏电嫌疑。正常家庭夜间待机电流通常在0.1A到0.5A之间路由器、冰箱待机等但漏电用户即使拉掉所有负载电流可能依然稳定在1A甚至更高因为电流直接经漏电点入了地。2.2 可用的数据源与核心特征指标用电信息采集系统的数据源一般能拿到以下几类字段采集时间点、A/B/C三相电压、A/B/C三相电流、有功功率、无功功率、功率因数。部分高级采集终端还能拿到零序电流或者剩余电流但在绝大多数台区我们只能依赖普通表计的常规负荷数据。基于此这套源码设计了五个核心漏电特征指标特征名称计算方式漏电表现夜间最小稳定电流选取每日0:00-5:00时段剔除突变点后取电流中位数持续偏高且稳定最小有功功率夜间时段有功功率的最小值长时间不归零电流波动系数夜间电流标准差除以均值漏电电流平稳波动系数偏低功率因数偏移夜间平均功率因数与白天平均功率因数的差值漏电纯阻性成分导致夜间PF异常升高停电后恢复电流停电来电后首个采样点的电流值与停电前无明显差异说明漏电通路持续存在这些特征里最有用的是第一个和第二个也是最稳定的。后面的功率因数偏移和波动系数作为辅助判断可以显著降低误报率。我在实际项目中碰到过不少电采暖用户夜间电流也降不下来但他们的功率因数通常正常通过第五个特征基本可以过滤掉。3. 源码目录结构与核心模块拆解3.1 目录设计按数据流转顺序划分拿到这个压缩包解压后目录结构相当清晰是按照数据处理流水线来组织的leakage_identify/ ├── config/ │ └── settings.yaml # 阈值参数、数据源路径、时段配置 ├── data/ │ ├── raw/ # 原始采集数据CSV │ └── output/ # 识别结果输出 ├── src/ │ ├── data_loader.py # 数据读取与格式统一 │ ├── preprocess.py # 清洗、缺失值处理、时间对齐 │ ├── feature_engineer.py # 特征提取 │ ├── detector.py # 主判定逻辑 │ ├── model_filter.py # 隔离森林辅助校验 │ └── report.py # 生成结果报告 ├── main.py # 主入口 └── requirements.txt这个结构的思路很明确每个环节只做一件事情模块之间通过DataFrame传递方便单独替换算法或调整参数。我后来在生产环境二次开发时把data_loader换成了直接连数据库的版本其他模块一行没动这就是分层设计的好处。3.2 各模块职责与关键设计决策先看data_loader.py它做的不只是读CSV更关键的是做字段名映射。不同厂家采集系统导出的表头五花八门有的叫Ia有的叫相电流A有的干脆叫电流1。数据加载时统一映射成标准字段名后面所有模块都只认标准名这个是能跑通全流程的前提。preprocess.py处理三类典型脏数据采集异常值电流突然变成0或999、时间戳乱序、缺失时间段。漏电识别对时间连续性要求很高缺失超过30分钟的采样段会被直接标记不会强行插值——因为漏电特征本身就依赖真实电流轨迹插值会把漏电的稳定偏高特征插没了。feature_engineer.py是核心中的核心它的任务是把每个用户15分钟一条、一天96个点的电流曲线浓缩成一组特征向量。具体做法按用户ID分组对每一天计算夜间时段特征再将多天的特征取中位数作为该用户的代表性特征。之所以用中位数不是均值是为了屏蔽偶发的高负荷时段干扰。后面detector.py就会拿到这样一个用户级特征矩阵。4. 关键代码实现与参数选择逻辑4.1 夜间稳定电流提取第一个判断维度这是整套源码里最具含金量的一段逻辑。直接看代码import pandas as pd import numpy as np def extract_night_stable_current(df, night_start00:00, night_end05:00, min_points10): 提取用户夜间稳定电流 思路夜间时段内剔除标准差的极端波动点取剩余点电流的中位数 df[time] pd.to_datetime(df[time]) night_mask (df[time].dt.strftime(%H:%M) night_start) \ (df[time].dt.strftime(%H:%M) night_end) night_df df[night_mask] if len(night_df) min_points: return None # 数据太少无法判定 current night_df[current].copy() # 剔除瞬时突变点比如冰箱启动瞬间 rolling_std current.rolling(5, centerTrue).std() normal_mask rolling_std current.quantile(0.9) stable_points current[normal_mask.fillna(True)] if len(stable_points) min_points: return None return stable_points.median()为什么用滑动窗口标准差来剔除突变点因为正常用户在夜间偶尔会有设备启动的瞬间大电流比如冰箱压缩机、热水器保温加热这些突变点会拉高均值却不会真正反映待机漏电水平。滑动窗口标准差能识别出瞬时偏离正常轨迹的点把它们剔除后再取中位数得到的才是稳定的背景电流。我测试过不同窗口参数5个点即前后各2个点的效果最稳。窗口太小突变的尾巴剔除不干净窗口太大会把夜间缓慢上升的正常负荷变化也误杀。阈值用current的0.9分位数而非固定值可以适配不同容量等级的台区。4.2 主判定规则不是单阈值而是特征组合直接拿夜间电流值划线会误报率很高。一套设计合理的主判定规则应该把多个特征组合起来形成一个评分def leakage_score(features): 计算漏电嫌疑评分范围0-100 评分越高漏电嫌疑越大 score 0 # 特征1夜间中位电流是否持续偏高按用户容量归一化 # 假设用户进线正常电流不超过额定容量的80% if features[night_current_median] 1.0: score 40 elif features[night_current_median] 0.6: score 25 # 特征2夜间有功功率是否接近0 if features[night_active_power_min] 5: score 0 # 功率能降到很低说明正常 elif features[night_active_power_min] 30: score 15 else: score 30 # 夜间最小功率都居高不下重点怀疑 # 特征3夜间电流波动系数漏电电流通常很平稳 if features[night_current_cv] 0.15: score 20 elif features[night_current_cv] 0.3: score 10 # 特征4连续多日夜间电流方差稳定持续异常才加分 if features[night_current_day_variance] 0.05: score 10 return score这里有个非常重要的设计理念每个特征单独看都可能误判但组合起来就能互相制衡。单看夜间电流大可能是有电采暖或鱼缸加热棒单看功率大可能是有服务器或矿机。但如果夜间电流大、最小有功功率高、且电流波动极小、连续多日稳定几乎可以锁定是持续性的漏电通路因为正常负载不可能保持如此完美的恒流状态。判定阈值我建议设两层评分大于60分进入高嫌疑名单40到60分进入观察名单。高嫌疑名单直接安排现场核查观察名单继续积累两周数据再做决定。这套分级设计的实战收益很大——直接砍掉了大约30%的现场核查工作量。4.3 隔离森林辅助校验用无监督学习兜底规则判定有天然盲区它基于先验知识没见过的情况识别不了。比如某些特殊用电场景夜间电流曲线并不完全符合平滑偏高的典型漏电形态这时候规则模型就会漏判。源码里用隔离森林做了第二道过滤它不关心什么是漏电特征而是找出每个用户偏离自己历史形态或者偏离同类用户群体形态的点。实现起来不复杂from sklearn.ensemble import IsolationForest def anomaly_filter(user_features): 对用户特征矩阵做离群点检测 典型漏电用户往往在特征空间内形成孤立点 features user_features[[night_current_median, night_active_power_min, night_current_cv]].values model IsolationForest( contamination0.05, # 假设台区中约5%用户存在异常 n_estimators100, random_state42 ) pred model.fit_predict(features) user_features[anomaly_score] model.decision_function(features) user_features[is_anomaly] pred -1 return user_features隔离森林跑完得到的是每个用户的离群分值和异常标记。源码最终把规则评分60分以上且被隔离森林标记为异常的用户排列进最高优先清单——这类用户是规则和算法双重确认的目标现场命中率最高。只被一个模型命中的用户进入观察清单继续跟踪。这里必须提醒一句contamination参数不要照抄它应该根据实际台区的拓扑数据来判断。正常台区异常用户比例在1%-3%之间线损率持续偏高的台区可以放到5%-8%。设太高会把正常用户误标成异常反而失去参考价值。5. 实测效果与典型踩坑记录5.1 一次真实台区验证从54户嫌疑到7户确认我在一个城乡结合部台区做过一次完整验证。这个台区一共428户线损率连续三个月高于12%。用这套代码跑了一遍规则模型筛出高嫌疑用户29户观察名单54户隔离森林标出22户异常两个模型交集是13户。现场对13户进行绝缘电阻测试7户绝缘电阻低于0.5MΩ低于安全标准确认漏电。这个命中率到54%考虑到排查的13户全部在一天内完成效率比逐户排查提升了至少十倍。但反过来看也说明有6户是误报——它们是什么情况有的是家庭作坊夜间有持续加工负载有的是电动车整夜充电充电器电流纹波特征和漏电有点像。所以最终建议高优先名单只能作依据现场检测必须有不能省略。5.2 踩坑一换表数据导致僵尸用户误判最典型的坑是用户曾经换过电表。老表拆走、新表装上的时间点采集系统里会形成一段几乎全零的数据。数据清洗如果不处理这种情况新表的夜间电流特征全被老表的零值拉低原本该判漏电的用户被当成正常放过去了。解决办法是在preprocess环节增加换表检测连续时间超过4小时电流全部为0且前后时段电流恢复非零就切分数据、分别计算特征。这个逻辑花不了多少代码量但效果非常显著直接避免了一大批漏判。5.3 踩坑二三相用户与单相用户的特征分布差异民用台区大概有5%-8%的三相用户小作坊、小型商用它们的电流基准完全不一样一套阈值没法通吃。三相用户正常工作时三相电流各不相问漏电通常集中在某一相直接用单相用户的夜间电流阈值来卡会把所有三相用户直接划成嫌疑人。源码的解法是把用户按表计类型分组单相用户采用单相夜间电流1A的逻辑三相用户则分别提取A/B/C三相的夜间电流只要任一相存在该相电流平稳但偏高的形态就标记为疑似。一个用户是不是三相可以从采集数据的字段里直接拿到不需要额外维护档案。6. 部署到生产环境必须想清楚的三件事写到这里模型在本地跑通只是第一步真正要在供电所里持续运转还有几个工程化的问题避不开。第一是数据增量更新。漏电识别不是一次性项目台区用户一日电流数据要源源不断地喂进来。建议设计一个任务调度每天凌晨自动拉取昨天的采集数据增量计算特征、更新评分把新增的最高优先用户自动推送出来。增量计算的要点是新数据只更新当天特征历史特征保留缓存不要在每次调度时全量重算。第二是配置外置。阈值、时段、评分权重这些参数不要硬编码在代码里。我习惯把配置放到YAML文件里调参只改配置文件不碰业务代码。实际运行中不同台区的最佳阈值差异很大线径老化的老城区和新建小区不能用同一套参数外置配置方便一线人员按台区微调。第三是现场反馈闭环。识别算法是猜现场核查才是确认但这两者必须形成闭环才有长期价值。建议开发一个简单的确认反馈功能现场人员核查后录入实际绝缘电阻值和判断结果每周把反馈数据回填到模型里用于校准阈值。这个机制能让漏电识别准确率随时间上升而不是永远停留在初始水平。从这套源码的设计思路来看真正的难点从来不是Python语法或者某个算法API而是把一个电气领域的问题翻译成可计算的数据特征再用工程化的方式稳定输出结果。理解了这条主线的逻辑哪怕你拿到的是别人的源码也能根据自己的业务场景改出真正能用的工具。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价