☰
基于电压波动相关性的配变 — 母线从属关系校验方法
2026/11/4 2:24:35 网站建设 项目流程

一、问题的提出

在配电网的线损分析、供电可靠性评估和高比例分布式光伏承载力分析中,拓扑台账的准确性是一切计算的前提。然而在实际工程中,"配变挂在哪条馈线、哪个母线节点下" 的台账信息常常与现场真实接线不一致 —— 设备异动后未及时上图、营销与运检台账口径不一、历史数据迁移出错,都会导致分析模型 "错挂"。

拓扑关系错了,后续的潮流计算、线损分摊和故障定位都会跟着错,而且这类错误隐蔽性强、不易被发现。本文提出一种基于电压波动相关性的校验方法:利用配变与母线量测数据在时序上的 "同源波动" 特征,反推两者是否存在真实的电气从属关系。

二、方法原理

电气上,下游节点(配变低压侧)的电压是由上游节点(母线)的电压经过变压器和线路降压得到的。因此当母线电压随负荷、馈线运行方式发生波动时,其下游配变的电压会几乎同步、同趋势地波动 —— 这就是 "上下级电压跟随特性"。

于是,校验从属关系的思路可以概括为三步:

  1. 取配变和母线各自的三相电压时序(ua/ub/uc);
  2. 对两者做归一化,消除幅值量纲差异(配变约 220V,母线可能高达数千伏,直接比较无意义);
  3. 计算对应相的相关系数,相关系数越接近 1,说明电压波动趋势越一致,配变归属于该母线的可信度越高。

三、数据场景构造

为了验证方法有效性,代码首先构造了三个表:

  • df1:配变 — 馈线 — 母线拓扑关系(5 台配变、1 条馈线、1 条母线);
  • df2:配变三相量测(220V 量级,含同源波动趋势);
  • df3:母线三相量测(5900V 量级,同样含同源波动趋势)。

关键设计在于:所有配变和母线共用同一套波动趋势基线,只叠加各自独立的小幅噪声,用来模拟 "真实从属、电压跟随" 的理想场景。

# df2:配变量测 ua/ub/uc 220~225,时序采样(20个点) np.random.seed(42) n_sample = 20 trafo_list = df1['trafo_id'].tolist() df2_list = [] for tid in trafo_list: # 共用同源波动趋势,模拟上下级电压跟随特性 trend = np.linspace(0, 1, n_sample) + np.random.normal(0, 0.02, n_sample) ua = 220 + 4.5 * trend + np.random.normal(0, 0.15, n_sample) ub = 220 + 4.3 * trend + np.random.normal(0, 0.15, n_sample) uc = 220 + 4.4 * trend + np.random.normal(0, 0.15, n_sample) for a, b, c in zip(ua, ub, uc): df2_list.append({'trafo_id': tid, 'ua': a, 'ub': b, 'uc': c}) df2 = pd.DataFrame(df2_list)

母线侧采用相同的构造逻辑,仅幅值和噪声尺度不同,以更贴近真实的量测差异。

四、归一化:消除量纲差异的前提

配变电压和母线电压不在同一量级,直接做相关性计算会因幅值差异掩盖波动形状的相似度。因此必须先对每条序列做 MinMax 归一化,把波动 "形状" 单独提取出来:

def normalize_series(s: pd.Series) -> pd.Series: scaler = MinMaxScaler() return pd.Series(scaler.fit_transform(s.values.reshape(-1,1)).ravel(), index=s.index)

归一化后,比较的就是两条序列在 [0,1] 区间内同涨同跌的程度,而非绝对电压大小,这正是相关性分析需要的输入。

五、分相相关性计算

配变与母线各有三相,三相电压的波动并不完全一致(三相不平衡、单相负荷差异等),因此按相分别计算,避免三相混合掩盖单相的跟随关系:

def calc_corr_between_trafo_bus(df_trafo, df_bus, trafo_id, bus_id): t_data = df_trafo[df_trafo['trafo_id'] == trafo_id][['ua','ub','uc']].reset_index(drop=True) b_data = df_bus[df_bus['bus_id'] == bus_id][['ua','ub','uc']].reset_index(drop=True) res = {} for ph in ['ua','ub','uc']: t_norm = normalize_series(t_data[ph]) b_norm = normalize_series(b_data[ph]) corr_val = t_norm.corr(b_norm) res[ph] = corr_val return res

逐相求解后得到三相各自的相关系数,便于后续对单相异常单独排查。

六、批量校验:从单台到全馈线

将上述单台校验推广到整条馈线上的所有配变,逐台与目标母线比对,生成一张 "配变 — 母线 — 三相相关系数" 的结果表:

bus_target = 'B01' result_table = [] for trafo in df1['trafo_id'].unique(): corr_dict = calc_corr_between_trafo_bus(df2, df3, trafo, bus_target) result_table.append({ 'trafo_id': trafo, 'bus_id': bus_target, 'corr_ua': corr_dict['ua'], 'corr_ub': corr_dict['ub'], 'corr_uc': corr_dict['uc'] }) df_corr_result = pd.DataFrame(result_table)

七、判定逻辑与工程启示

代码输出的判定逻辑非常直接:

  • 相关系数 ∈ [-1, 1];
  • 越接近 1,说明配变电压与母线电压波动趋势越一致,从属关系越可信;
  • 若某配变三相相关系数显著偏低,则说明该配变很可能并不归属于当前母线,拓扑关系可能存在错误。

在实际工程落地时,这套方法可以进一步扩展:

表格

扩展方向说明
阈值判定设定相关度阈值(如 0.9),低于阈值即触发拓扑异常告警
多母线比对逐台配变与多条候选母线比对,取相关度最高者作为真实上级
数据清洗过滤量测缺失、零值、突变点,避免坏数据污染相关性
与线损结合将校验结果作为线损分摊模型的前置校验,从源头提升数据质量

八、结语

电压波动相关性校验不需要额外的量测设备,仅复用现有的配变和母线量测数据即可对拓扑从属关系进行定量筛查,是一种低成本、可批量、可解释性强的数据质量治理手段。结合阈值判异与多母线比对,它能够有效支撑配电网台账治理、线损分析和新能源承载力评估等业务,为 "数据驱动" 的配网精益化管理提供了坚实的数据底座。

九、全部源码

import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler # ===================== 1. 构造3个DataFrame ===================== # df1:配变-馈线-母线关系,5台配变、1条馈线、1条母线 df1 = pd.DataFrame({ 'trafo_id': ['T01', 'T02', 'T03', 'T04', 'T05'], 'feeder_id': ['F01', 'F01', 'F01', 'F01', 'F01'], 'bus_id': ['B01', 'B01', 'B01', 'B01', 'B01'] }) # df2:配变量测 ua/ub/uc 220~225,时序采样(20个点,用于波动相关性分析) np.random.seed(42) n_sample = 20 trafo_list = df1['trafo_id'].tolist() df2_list = [] for tid in trafo_list: # 共用同源波动趋势,模拟上下级电压跟随特性 trend = np.linspace(0, 1, n_sample) + np.random.normal(0, 0.02, n_sample) ua = 220 + 4.5 * trend + np.random.normal(0, 0.15, n_sample) ub = 220 + 4.3 * trend + np.random.normal(0, 0.15, n_sample) uc = 220 + 4.4 * trend + np.random.normal(0, 0.15, n_sample) for a, b, c in zip(ua, ub, uc): df2_list.append({'trafo_id': tid, 'ua': a, 'ub': b, 'uc': c}) df2 = pd.DataFrame(df2_list) # df3:母线量测 ua/ub/uc 5900~6100,同源波动 df3_list = [] trend_bus = np.linspace(0, 1, n_sample) + np.random.normal(0, 0.02, n_sample) ua_bus = 5900 + 195 * trend_bus + np.random.normal(0, 2.0, n_sample) ub_bus = 5900 + 193 * trend_bus + np.random.normal(0, 2.0, n_sample) uc_bus = 5900 + 194 * trend_bus + np.random.normal(0, 2.0, n_sample) for a, b, c in zip(ua_bus, ub_bus, uc_bus): df3_list.append({'bus_id': 'B01', 'ua': a, 'ub': b, 'uc': c}) df3 = pd.DataFrame(df3_list) # ===================== 2. 归一化函数(MinMax归一化) ===================== def normalize_series(s: pd.Series) -> pd.Series: scaler = MinMaxScaler() return pd.Series(scaler.fit_transform(s.values.reshape(-1,1)).ravel(), index=s.index) # ===================== 3. 单台配变-母线 分相相关性计算 ===================== def calc_corr_between_trafo_bus(df_trafo, df_bus, trafo_id, bus_id): t_data = df_trafo[df_trafo['trafo_id'] == trafo_id][['ua','ub','uc']].reset_index(drop=True) b_data = df_bus[df_bus['bus_id'] == bus_id][['ua','ub','uc']].reset_index(drop=True) res = {} for ph in ['ua','ub','uc']: t_norm = normalize_series(t_data[ph]) b_norm = normalize_series(b_data[ph]) corr_val = t_norm.corr(b_norm) res[ph] = corr_val return res # ===================== 4. 批量校验 ===================== bus_target = 'B01' result_table = [] for trafo in df1['trafo_id'].unique(): corr_dict = calc_corr_between_trafo_bus(df2, df3, trafo, bus_target) result_table.append({ 'trafo_id': trafo, 'bus_id': bus_target, 'corr_ua': corr_dict['ua'], 'corr_ub': corr_dict['ub'], 'corr_uc': corr_dict['uc'] }) df_corr_result = pd.DataFrame(result_table) # ===================== 输出打印 ===================== print("==== df1 配变-馈线-母线关系 ====") print(df1) print("\n==== df2 配变量测(前10行) ====") print(df2.head(10)) print("\n==== df3 母线量测(前10行) ====") print(df3.head(10)) print("\n==== 归一化后各相电压相关系数(校验从属关系) ====") print(df_corr_result.round(4)) print("\n【判定逻辑】") print("相关系数∈[-1,1];越接近1 -> 电压波动趋势越一致,配变归属该母线可信度越高") print("如果某配变三相相关系数显著偏低,说明拓扑关系可能错误")

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询