ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

配电网可靠性指标与ARMA预测:从SAIDI到电网模型实战

配电网可靠性指标与ARMA预测:从SAIDI到电网模型实战 简介面向配电网可靠性评估与预测的MATLAB源码资源适用于电力系统研究人员、电气工程专业学生及从事电网规划运维的工程师。压缩包内仅含1个Reliability.m文件整体大小4KB代码体量轻、结构清晰便于直接阅读和二次开发。源码围绕配电网可靠性指标计算展开可输出可用度、可靠度、期望寿命等关键参数同时实现ARMA自回归移动平均模型的参数估计、定阶选择与未来故障率预测并融入电网模型预测的典型思路支持基于预测结果制定预防性维护策略。读者通过研读该源码可以掌握基于时间序列的配电网故障预测方法理解模型输入输出与调参逻辑并将其迁移到自己的电网风险评估项目中。该资源已有140人学习浏览内容定位明确是课程设计、毕业论文或工程验证的实用参考。1. 配电网可靠性 ARMA 预测一包源码背后要解决的真问题拿到Reliability_配电网可靠性_配电网_ARMA预测_电网可靠性_电网模型预测_源码.rar这个名字绝大多数人的第一反应是这包东西到底能不能算出我要的可靠性指标另一部分人则是手里已经攒了三年的停电台账领导要求预测明年 SAIDI 会不会继续恶化论文里还缺一个有据可查的预测模型。配电网可靠性这个方向的门槛从来不在指标定义——SAIFI、CAIDI 那些公式翻手册就有——而在预测这一环可靠性序列短、噪声大、统计口径经常变常规回归一碰就翻车。这个源码包解决的核心问题就是把可靠性指标整理成时间序列用ARMA模型对后续走势做预测同时把数据预处理、定阶、检验、画图的完整链路串起来给做配电网规划或写课题的人一个能落地的起点。这篇文章按一线做法的顺序拆开讲指标怎么算、序列怎么喂给模型、定阶参数怎么设、跑通代码要改哪几处、以及最容易翻车的几个真实场景。2. 先算对四个可靠性指标SAIFI、SAIDI、CAIDI、ASAI 与月度序列清洗预测的前提是把“可靠性”变成一个可计算的数值序列。很多拿到源码包的人第一步就栽在数据上——台账里的停电记录是明细行而模型需要的是按时间聚合后的指标序列。本章先把指标定义讲清楚再把清洗步骤落到可执行的操作上。2.1 SAIFI、SAIDI、CAIDI、ASAI四个指标各管哪个维度配电网可靠性的标准四件套都从两个原始字段推出停电次数和停电时户数。四个指标分别回答四个不同的问题用户平均一年停几次、一次停多久、总停多少小时、供电可用率有多高。做时间序列预测时真正适合作为预测目标的是 SAIFI 和 SAIDICAIDI 是两者比值导致方差结构不稳定ASAI 常年接近 1细微变化会被模型当成噪声忽略。指标表达式单位工程含义SAIFI用户停电总次数 / 总用户数次/(户·年)用户平均每年停电频次SAIDI停电时户数总和 / 总用户数小时/(户·年)用户平均每年停电时长CAIDISAIDI / SAIFI小时/次单次停电平均修复时间ASAI(总供电时间 - 总停电时间) / 总供电时间%供电可用率表格里的“停电时户数”值得单独说明。在台账里每条停电记录通常只有“停电时长”和“受影响用户数”两个字段时户数需要自己乘出来。比如一条记录停了 2 小时、涉及 300 户那么它贡献的停电时户数是 600算 SAIDI 时要把全月所有记录的时户数加总再除以用户总数。不同电网公司的口径略有差别——有的把预安排停电和故障停电分开统计有的把低压故障剔除在外——所以在做序列之前第一件事是向数据提供方确认口径否则后面模型拟合得再好算出来的也是错数。2.2 停电台账整理成月度序列三步清洗与一个易错点原始台账长什么样常见格式是每行一条停电事件至少包含四列停电开始时间、停电结束时间、停电用户数、停电类型。有的表还会多出“故障原因”“设备类型”“所属馈线”等字段但建模时不直接用这些只取前四列。整理成月度序列分三步走。第一步是字段校验。重点检查“停电用户数”是否为空、开始时间和结束时间是否早于开始时间、用户数是否为 0。这些脏数据在明细里隐藏得很深一条用户数为空但时长 5 小时的记录会直接把当月 SAIDI 拉偏。第二步是按月聚合。以停电开始时间的月份为归属月统计当月停电次数、当月停电时户数总和再除以当月用户总数得到月 SAIDI。停电次数直接数事件条数即可但要注意一个事件可能拆成多条记录比如一条馈线故障分三段修复这时需要按事件 ID 去重否则 SAIFI 被高估。第三步是连续化。没有停电记录的自然月要补 0 值而不是跳过。很多 ARMA 程序在读数据时遇到空月份会直接丢弃导致时间轴断裂、预测结果错位。补 0 后的序列形如下表时间停电次数(次)停电时户数(时户)用户数(户)月SAIDI(h)2023-0131260120000.1052023-021420120000.0352023-0300120000.000这里有一个新手必踩的坑用户总数在一年内可能变动。电网公司每年新增用户、销户年中用户数不等于年初用户数。如果全年都用年初用户数做分母下半年的 SAIDI 会被系统性高估。常见做法是每季度更新一次用户数或者用月度平均值。源码包里如果只给了一个固定值建议自己留意这个细节。2.3 为什么用时间序列模型而不是多元回归刚接触这个方向的人通常会问为什么不用天气、负荷、设备年龄这些因素做多元回归原因很现实配电网停电事件受瞬时工况影响极大网格级的天气数据、设备状态数据往往拿不到即便拿到了停电与这些因素之间的关系也高度非线性线性回归拟合不了树模型又需要大量样本。可靠性指标本身有很强的自相关性台风过后树障、雷击、设备受潮引发的后续故障会持续数周本月停电多下月往往也多。ARMA 模型只利用指标自身的历史行为推断未来本质上是“让数据自己说话”在缺少外生变量、数据量又只有几十个点的场景下是最稳妥的一类模型。这也是ARMA预测在电网模型预测里被广泛使用的原因——它不要求你做复杂的外部因子收集只要有一根连续、口径统一的指标序列即可。3. ARMA 建模四环节平稳性检验、定阶、参数估计与残差检验模型选型定了之后真正的功夫在建模流程上。ARMA(p,q) 由两部分组成AR(p) 用过去 p 个时刻的观测值预测当前值MA(q) 用过去 q 个时刻的预测误差修正当前值。数学形式可以写成Y_t c φ₁Y₍t₋1₎ ... φₚY₍t₋p₎ εₜ θ₁ε₍t₋1₎ ... θ_qε₍t₋q₎其中 φ 是自回归系数θ 是移动平均系数ε 是白噪声。实际做配电网可靠性预测时序列很少天生平稳所以通常需要先差分差分后的 ARMA 实际上是 ARIMA(p,d,q)。本章按操作顺序拆解四个环节。3.1 ADF 平稳性检验不平稳就差分但别一上来就 d2ARMA 模型要求序列平稳即均值和方差在时间上没有明显漂移。配电网可靠性序列几乎不可能天生平稳负荷逐年增长带来停电时长的缓慢抬升检修策略调整带来阶梯跳跃季节性极端天气带来周期波动。这三股力量叠在一起直接拿原序列拟合 ARMA参数估计极不稳定。建模前先做 ADF 单位根检验。ADF 的原假设是序列存在单位根即不平稳。p 值大于 0.05 时无法拒绝原假设需要对序列做差分一阶差分后通常就能平稳。少数情况下序列仍有趋势需要 d2但要格外谨慎——二阶差分会放大高频噪声后面避坑章节会展开讲。判断平稳性不能只看 ADF 的 p 值还要辅以目视检查画出序列的时间趋势图看均值是否围绕一条水平线波动。如果看到明显的上升或下降趋势即使 ADF 恰好给出 p 值略小于 0.05也建议做一阶差分。原因是 ADF 检验在小样本下功效不足30~60 个观测点的情况下检验结果本来就不可靠工程上宁可多差分一次也不能让模型建立在伪平稳的基础上。3.2 用 BIC 自动扫阶p、q 范围为什么限定在 0~4理论上的 Box-Jenkins 定阶方法是看 ACF 和 PACF 图的截尾、拖尾特征ACF 在 q 阶后截尾则选 MA(q)PACF 在 p 阶后截尾则选 AR(p)。但配电网可靠性数据通常只有几十个观测点ACF/PACF 的置信带很宽肉眼判阶误差极大。更可复现的做法是设定 p、q 搜索范围用信息准则自动扫描。AIC 偏重拟合优度在短序列上容易选出过大的阶数BIC 对参数个数的惩罚更重在小样本场景下更稳健。我一般把 p 和 q 都限制在 0~4原因有两个一是可靠性月度序列通常只有 36~60 个点阶数太高会把每条波动都“背下来”过拟合到完全没有泛化能力二是 p、q 过大时ARMA 模型会退化出近似单位根的行为预测结果变成一条僵硬的直线。pqBIC0188.431184.121285.072290.673192.55上表是一次真实的扫阶结果示意最优选择是 ARMA(1,1)。注意扫阶时要固定差分阶数即对同一份差分后的序列进行比较否则 p、q 之间没有可比性。3.3 Ljung-Box 残差检验季节性没抽干时的补救路径模型拟合完不能直接预测必须先看残差。如果残差里还有显著自相关说明模型没有把序列里的时间依赖结构抽干净预测区间会系统性偏窄——预测均值可能看着没问题但置信区间完全不靠谱。用 Ljung-Box 检验看滞后 12 阶的 p 值是否大于 0.05。配电网月度序列最常见的检验失败原因是季节性未处理夏季雷雨、台风多发停电事件呈现明显的 12 个月周期。遇到这种情况把 p、q 加大只是“硬记”周期更规范的做法是换成 SARIMA增加 seasonal_order 参数数据量有限时也可以先做 12 个月差分再建 ARMA效果接近但实现更简单。预测步长同样要克制。月度序列预测 12 个月是比较合理的上限强行预测 24 个月置信区间会宽到没有工程意义年度序列则预测 2~3 年就到头了。ARMA 是短期预测工具不是长期趋势外推工具这一点在向领导汇报前务必想清楚。4. 跑通 ARMA 预测源码最小脚本、输入格式与三处必改参数源码包到手后先别急着跑理清里面的文件结构再动手。典型的配电网可靠性预测源码包含四类内容原始数据表、可靠性指标计算脚本、ARMA 建模脚本、绘图与结果输出脚本。其中建模脚本是核心本节给出一套可以直接运行的最小复现版本再说明换用自己数据时需要改动的具体位置。4.1 最小可运行的主流程脚本从 ADF 到未来 12 个月预测以下脚本用 Python 的 statsmodels 实现完整覆盖平稳性检验、BIC 定阶、模型拟合、残差检验和预测五个环节可以直接在 Jupyter 或命令行环境运行import pandas as pd import numpy as np import warnings from statsmodels.tsa.stattools import adfuller from statsmodels.tsa.arima.model import ARIMA from statsmodels.stats.diagnostic import acorr_ljungbox warnings.filterwarnings(ignore) # 1. 读取数据两列第一列是月份(YYYY-MM)第二列是SAIDI df pd.read_csv(saidi_monthly.csv, parse_dates[month], index_colmonth) series df[saidi].astype(float) # 2. ADF平稳性检验p0.05时取差分阶数d1 adf_result adfuller(series) d 1 if adf_result[1] 0.05 else 0 print(ADF p-value %.4f, 差分阶数 d %d % (adf_result[1], d)) # 3. 在p,q属于0~4范围内用BIC扫阶 best_bic np.inf best_order None for p in range(5): for q in range(5): try: model_tmp ARIMA(series, order(p, d, q)).fit() except Exception: continue if model_tmp.bic best_bic: best_bic model_tmp.bic best_order (p, d, q) print(BIC选择: ARIMA%s, BIC%.3f % (best_order, best_bic)) # 4. 用选定阶数重新拟合 final_model ARIMA(series, orderbest_order).fit() print(final_model.summary()) # 5. 残差白噪声检验滞后12阶 ljung acorr_ljungbox(final_model.resid, lags[12], return_dfTrue) print(Ljung-Box p-value %.4f % ljung[lb_pvalue].iloc[0]) # 6. 预测未来12个月 forecast final_model.forecast(steps12) print(未来12个月预测值:) print(forecast)代码逻辑是标准的 Box-Jenkins 流程先读数据ADF 检验决定差分阶数然后用 BIC 在 0~4 范围内扫描最优 p、q重拟合后检验残差是否为白噪声最后输出未来 12 个月的预测值。整个脚本不依赖源码包里的其他模块目的就是让你先用最小输入跑通流程确认数据没问题后再接回原有项目。几个参数需要理解而不是照抄。ADF 检验返回的 p 值决定 d 取 0 还是 1BIC 扫阶范围 0~4 是经验值数据量大时可以放宽到 0~6但配电网场景通常不需要lags[12]对应月度序列的 12 阶滞后如果你是年度数据改成lags[2]更合适steps12是预测步长即未来 12 个月。若代码执行时报ValueError绝大多数情况是序列中有 NaN 或无穷值回头检查清洗环节。4.2 输入文件格式与三个关键参数的调法脚本对输入数据格式有硬性要求CSV 文件第一列列名为 month取值形如 2023-01第二列列名为 saidi取值为浮点数。月份必须连续缺失月份要提前补 0否则 pandas 解析后会留下 NaN。三个关键参数的调法单独说明差分阶数 d由 ADF 检验自动决定。若检验 p 值略小于 0.05 但序列目视有明显趋势手动把 d 改为 1 更稳妥。p、q 扫阶范围代码里用range(5)表示 0~4。如果你的数据超过 100 个点可以放大到range(7)数据少则保持 0~3 即可避免过拟合。预测步长 steps月度序列填 12季度序列填 8未来两年年度序列填 3。步长超过数据长度的三分之一时预测置信区间会宽到失去参考价值属于无效输出。4.3 换用自己的台账路径、列名、预测步长改哪三处把源码包里的示例数据换成你自己的停电台账几乎不需要动模型代码只改三处。第一处是数据读取路径把saidi_monthly.csv换成你整理好的文件路径。第二处是列名如果你的指标列不叫 saidi或者你想预测 SAIFI把df[saidi]改成对应列名即可。第三处是预测步长根据你的业务目标决定是 6、12 还是 24 个月。如果你的原始数据是年度指标而不是月度需要先按年度聚合再喂给模型。以下片段展示了从“月度时户数”聚合到“年度 SAIDI”的过程# 按年聚合计算年度SAIDI df_yearly df.resample(Y).agg({stop_count: sum, user_hours: sum}) df_yearly[saidi] df_yearly[user_hours] / 12000 # 12000为该区域平均用户数 df_yearly[saifi] df_yearly[stop_count] / 12000这段代码说明了一个容易被忽略的事情SAIDI 的分母是用户数如果用户数逐年变化不能简单复用上一年数据。常见做法是按年更新用户数或者用年内月均用户数替代。另外提醒一句读 CSV 时遇到中文路径或中文列名记得加上encodinggbk参数否则 Windows 环境下大概率报编码错误这是最常见的“环境问题”不是模型问题。5. 实战避坑可靠性序列建模容易翻车的 5 个点原理和代码都跑通之后真正的考验在真实数据上。这一章写的都是实际建模时反复出现的坑每一条都按“现象 — 原因 — 解决”来描述后面做项目时可以直接对照排查。5.1 二阶差分把 SAIDI 预测成负数现象ADF 检验显示原序列 p 值 0.4一阶差分后 p 值 0.03但你觉得“还不够稳”继续做二阶差分。拟合后预测未来 12 个月的 SAIDI 出现了 -0.35 这种根本不可能出现的值画出来的图后半段直接扎进负半轴。原因二阶差分会把序列中本来就不多的低频趋势信息全部抹掉剩下的基本上是高频噪声。ARMA 在纯噪声上拟合出的系数没有物理意义预测时累积误差会迅速放大结果出现负值。解决差分阶数 d 取到 1 就到头了不要为了“让 p 值更小”而继续差分。如果一阶差分后序列仍有明显趋势或异方差先对原始序列做对数变换或 Box-Cox 变换再考虑差分。SAIDI 本质上是非负的持续时间类指标对数变换通常比盲目二阶差分更有效。5.2 零值过多的月度序列让模型预测成一条直线现象某个区域配电网可靠性很高全年只有 3~4 个月发生过停电其余月份 SAIDI 全是 0。模型拟合后残差检验勉强通过但预测的未来 12 个月几乎全是接近 0 的直线偶尔有一个小凸起完全看不出任何规律。原因这是典型的零膨胀序列。ARMA 的核心假设是线性高斯噪声而大量 0 值让序列均值被压到很低方差却因为少数停电月份被拉得很大。模型在这种数据上只能估计出一个“平均接近 0”的状态没有能力刻画停电事件发生的随机性。解决月度序列改为季度聚合缓解零膨胀。如果季度聚合后零值仍超过一半说明这个区域的可靠性水平已经高到不适合用连续型时间序列建模改用两阶段方案先预测“本月是否发生停电”分类问题再预测“停电发生时的 SAIDI 是多少”回归问题。后者对非零子序列建模效果远好于直接硬套 ARMA。5.3 统计口径变更产生“台阶”被模型当趋势学走现象序列在第 36 个月的位置出现一个明显的阶跃从月均 0.2 跳到 0.5。ARMA 模型把这个台阶识别为长期趋势预测值持续走高但你去看原始台账发现当年并没有发生大规模停电只是供电所改了口径。原因很多电网公司从某一年开始把“预安排停电”纳入可靠性统计之前只统计故障停电。这相当于序列的定义发生了根本变化模型不可能自动识别这一点。解决清洗数据时在月份维度加一个“统计口径”标签列建模前先画时间线看到台阶就手动截断只保留口径一致的时间段。如果口径变化发生在近期、数据量不足以截掉就用第 36 个月之前的数据做训练并将台阶之后的数据作为验证集观察模型是否能泛化。千万不要把台阶当趋势学进去预测结果会一路飘高。5.4 极端天气月份残差检验永远过不了现象时序图看着平稳BIC 定的阶数也合理但 Ljung-Box 检验的 p 值始终小于 0.05。把残差按时间画出来才发现某一年台风月、暴雨月的残差异常大其余月份残差都正常。原因极端天气导致的停电事件是典型的“厚尾”现象。ARMA 只对条件均值建模对条件方差的波动无能为力。少数几个异常的极端月份把残差的自相关结构拉出了“幽灵相关”。解决两个方向。一个是在序列中增加极端天气哑变量该月是否发生台风/暴雨用带外生变量的 ARIMAX 模型把极端月份的均值偏移吸收掉另一个是放弃月度序列中对极端月份的精确预测改用滚动 3 个月均值平滑后再建模。对极端月份本身的预测属于小概率事件建模范畴ARMA 不合适硬做只会让整体模型质量被几个点拖垮。5.5 一次性拟合格外漂亮滚动验证一跑就崩现象用全部数据拟合RMSE 很小、拟合曲线几乎贴着真实值。但把数据按“训练集 测试集”切分后用前 36 个月训练、预测后 12 个月误差放大好几倍预测曲线发散。原因这是过拟合最典型的表现。模型把训练期内的每一个波动都背下来了一旦进入未见过的时段就没有泛化能力。配电网可靠性序列只有几十个点这种情况尤其常见。解决建立滚动验证习惯。这不仅是检验手段更是调参依据用扩展窗口滚动预测每次向前一步累计误差。如果滚动验证的误差远大于一次性拟合的误差先降低 p、q 阶数再看差分阶数是否过大最后检查训练集与测试集之间是否存在口径差异。模型的好坏以滚动验证结果为准不要相信单次拟合的漂亮曲线。6. 让预测结果真的支撑决策滚动验证与两个落地习惯6.1 用滚动验证代替一次性拟合一次性拟合把全部数据用来训练再在同样的数据上看误差等于开卷考试分数再高也说明不了问题。配电网可靠性预测中我习惯用扩展窗口滚动验证来评估模型每一次只用当前时点之前的数据训练预测下一个时点然后窗口向后滚动一位重复直到覆盖整个测试期。这样得到的误差序列才是模型真实泛化能力的估计。# 扩展窗口滚动预测示例 train_size 36 preds [] for i in range(train_size, len(series)): train series.iloc[:i] model ARIMA(train, orderbest_order).fit() pred model.forecast(steps1).iloc[0] preds.append(pred) # 计算RMSE评价滚动预测精度 rmse np.sqrt(np.mean((series.iloc[train_size:] - np.array(preds)) ** 2)) print(rolling RMSE %.4f % rmse)这段代码会暴露出所有一次性拟合掩盖的问题如果 rolling RMSE 是 in-sample RMSE 的几倍说明模型过拟合或者数据中发生了结构变化。网格化预测、年度预测都适用同一套逻辑只是窗口大小不同。6.2 预测值折算成停电损失决策才有对象预测出未来 12 个月的 SAIDI 只是中间产物真正给规划部门用的应该是停电损失。常见折算方式是把 SAIDI 乘上区域平均负荷和电价得到期望缺供电量 EENS 对应的经济损失再与技改投资对比。这样预测结果就从“一个漂亮的曲线”变成“明年若不加装联络开关预计多损失 X 万元”的决策输入。我自己的习惯是每接一份配电网可靠性数据先画时间线、确认统计口径再谈建模。模型参数、BIC 值和滚动验证结果每次都存下来方便三个月后追溯当时的判断依据。预测这种东西最怕的不是算不准而是算完说不清怎么来的。希望帮到你。本文还有配套的精品资源点击获取
返回列表