14 KiB
作战体系数据清洗与网络效能评估系统
项目简介
本系统包含两大功能模块:
- 数据清洗:从 JSON 文件或达梦数据库读取实体属性表、三元组,进行去重、缺失值填充、异常值修正、噪声平滑等清洗;并按 1125 属性需求 做 内容与格式的双重对齐(格式校验 + 内容校验 + 原始字段→规范 schema 转换),输出仅含 xlsx 定义字段的
nodes.json,不保留原始其他字段。 - 网络关系与效能评估:基于节点与三元组数据,计算关系强度、过滤低置信边,评估任务网络效能,生成评价报告。
目录结构
final/
├── config/
│ ├── config.yaml # 主配置文件(推荐)
│ └── config.json # 备选配置
├── data/
│ ├── raw_data_sample.json # 原始实体数据(JSON 模式)
│ ├── nodes.json # 清洗后实体(关系/网络计算用)
│ └── triples.json # 清洗后三元组(来自 run_all)
├── report/
│ ├── detailed_cleaning_report.json # 实体清洗报告
│ └── triplet_cleaning_report.json # 三元组清洗报告
├── results/
│ ├── filtered_triples.json # 过滤后三元组
│ ├── triples.csv # 三元组表格
│ └── evaluation_report.txt # 效能评价报告
├── src/
│ ├── main_227.py # 主程序(清洗 + 关系 + 网络评估)
│ ├── cleaner.py # 实体清洗
│ ├── attribute_schema.py # 1125 属性规范:格式/内容校验 + 原始→规范转换
│ ├── data_loader.py # 数据加载(JSON/达梦)
│ └── triplet_cleaner.py # 三元组清洗
├── scripts/
│ ├── run_all.py # 一键运行(仅清洗)
│ ├── export_triplets.py # 单独导出三元组
│ ├── inspect_dm_tables.py # 达梦表结构查看
│ ├── f_relation1125.py # 关系强度计算
│ └── f_net1125.py # 任务网络评估
├── .env.example
└── README.md
快速开始
1. 环境依赖
pip install -r requirements.txt
# 达梦模式需额外:pip install dmPython
2. 运行方式
| 命令 | 功能 |
|---|---|
python src/main_227.py |
完整流程:实体清洗 → 关系强度计算 → 网络效能评估 |
python scripts/run_all.py |
仅清洗:实体 + 三元组 读取、清洗、导出 |
3. 开发模式(无达梦数据库)
在 config/config.yaml 或 config/config.json 中设置:
source: json
然后运行:
python src/main_227.py
程序会从 data/raw_data_sample.json 读取实体数据并清洗;关系/网络计算则从 data/nodes.json 和 data/triples.json 读取。
配置说明
必须修改的配置
根据你的环境,在 config/config.yaml 或 config/config.json 中修改以下项:
| 配置项 | 说明 | 示例 |
|---|---|---|
source |
数据源:json(开发)或 db(达梦) |
json |
db.host |
达梦库地址(source=db 时) | 127.0.0.1 |
db.port |
达梦端口 | 5080 |
db.user |
达梦用户 | SYSDBA |
db.table |
实体表名 | OBJECTIVE_INSTANCE |
db.triplet_table |
三元组表名 | RELATION_INSTANCE |
达梦密码(切勿写入配置)
达梦模式需设置环境变量:
export DM_PASSWORD=你的密码
或在 PyCharm:Run → Edit Configurations → Environment variables → 添加 DM_PASSWORD=你的密码。
可选配置
| 配置项 | 说明 | 默认 |
|---|---|---|
json.input_file |
实体 JSON 路径 | data/raw_data_sample.json |
json.output_file |
清洗后实体输出 | data/nodes.json |
triplet.enabled |
是否处理三元组 | true |
triplet.input_file |
JSON 模式下三元组路径 | null |
triplet.output_file |
三元组输出 | data/triples.json |
triplet.clean.deduplicate |
三元组去重 | true |
triplet.clean.filter_orphans |
过滤悬空引用 | false |
eval.nodes_file |
main_227 读取的节点文件 | data/nodes.json |
eval.triples_file |
main_227 读取的三元组文件 | data/triples.json(与 triplet.output_file 一致) |
配置优先级
config.json 优先于 config.yaml;修改其一即可。
数据流程
main_227.py 流程
1. 实体清洗
- 从 JSON 或达梦读 raw_data_sample / OBJECTIVE_INSTANCE
- 去重、缺失值填充、异常值修正、噪声平滑
- 输出 nodes.json
2. 关系与网络评估
- 按配置读取 nodes(eval.nodes_file / json.output_file)、triples(eval.triples_file = triplet.output_file)
- 计算 5 类关系强度(情报保障、指挥控制、状态反馈、平台部署、协同作战)
- 按阈值过滤关系
- 评估 5 类任务网络效能
- 输出 results/ 下报告与表格
run_all.py 流程
1. 实体清洗 → data/nodes.json
2. 三元组清洗 → data/triples.json(格式:head, head_type, relation, tail, tail_type)
输出文件说明
| 文件 | 来源 | 说明 |
|---|---|---|
data/nodes.json |
清洗 | 清洗后实体({nodes: {id: obj}, global_params: {mtbf_max}},见下文) |
data/triples.json |
run_all | 清洗后三元组(head/head_type/relation/tail/tail_type) |
report/detailed_cleaning_report.json |
清洗 | 实体清洗统计(含 attribute_alignment:格式/内容对齐情况) |
report/triplet_cleaning_report.json |
run_all | 三元组清洗统计 |
results/filtered_triples.json |
main_227 | 过滤后三元组(含强度) |
results/triples.csv |
main_227 | 三元组表格 |
results/evaluation_report.txt |
main_227 | 效能评价报告 |
常见问题
Q: 运行报错「找不到文件 raw_data_sample.json」?
A: 将 source 改为 json,并确保 data/raw_data_sample.json 存在;或检查 json.input_file 路径。
Q: 达梦模式连接失败?
A: 检查 DM_PASSWORD 环境变量、db.host/db.port,以及 dmPython 与达梦客户端是否正确安装。
Q: main_227 中 nodes.json、triples.json 从哪来?
A: nodes.json、triples.json 均由清洗步骤生成(run_all 或 main_227 前半段),格式需包含 head、relation、tail 等字段。
Q: 如何查看达梦表结构?
A: 运行 python scripts/inspect_dm_tables.py(需设置 DM_PASSWORD)。
Q: nodes.json 为何没有 X、Y、ROLE_ID 等原始字段?
A: 输出完全对齐 1125 xlsx 规范,仅保留 schema 定义的 12 个字段;原始字段在转换阶段已映射为 spatial、org_unit 等规范结构。
数据清洗详细逻辑
清洗流程概览
原始数据 → 去重 → 缺失值填充 → 异常值修正 → 噪声平滑 → 1125 Schema 转换 → 关系计算前净化 → nodes.json
| 步骤 | 说明 |
|---|---|
| 去重 | 按 TARGET_ID 去重,优先保留 CREATED_TIME 最新的记录 |
| 缺失值填充 | 数值型字段按 ROLE_ID 分组均值填充,兜底用全局均值 |
| 异常值修正 | 对 TARGET_RECOGNITION_CAPABILITY、STRIKE_ACCURACY、ANTI_JAMMING_CAPABILITY、ENVIRONMENT_ADAPTABILITY、MOBILITY 等 [0,1] 字段:负值取绝对值、>1 截断为 1 |
| 噪声平滑 | 对 COMMUNICATION_RANGE 做 3 点移动平均 |
| 1125 Schema 转换 | 见下文字段映射,输出仅含规范字段 |
| 关系计算前净化 | 见下文「关系计算前净化」 |
关系计算前净化(sanitize_node_for_relation_calc)
下游 f_relation1125 及 utils.py 会对节点属性做数值运算(如欧氏距离、安全等级差、历史成功率平均),若字段为 None 会触发 NoneType 运算错误。因此在写入 nodes.json 前,对每条节点做最终净化,确保参与运算的字段永不为 None:
| 净化项 | 处理方式 |
|---|---|
spatial.position |
必须为 [float, float],含 None/NaN 的元素替换为 0.0 |
spatial.effective_radius |
若为 None,设为 1.0 |
temporal.* |
time_window 缺省 24.0,其余缺省 1.0 |
security_level |
若为 None 或越界,设为 3(1–5 范围) |
history_success |
若为 None,设为 0.8(0–1 范围) |
该步骤在 attribute_schema.sanitize_node_for_relation_calc() 中实现,由 cleaner 在写入前对每个节点调用。
输出字段说明
nodes.json 完全对齐 xlsx 规范,不保留原始其他字段。每条记录仅包含:
| 字段 | 类型 | 说明 |
|---|---|---|
TARGET_ID |
字符串 | 节点唯一标识(三元组 head/tail 引用所需) |
function_vector |
字典 | 7 维功能能力 [0,1] |
spatial |
字典 | 空间位置与有效半径 |
temporal |
字典 | 时间相关属性 |
performance |
字典 | 核心性能、生存能力、MTBF |
protocol_list |
列表 | 支持协议(字符串列表) |
format_list |
列表 | 支持格式(字符串列表) |
interface_list |
列表 | 支持接口(字符串列表) |
security_level |
整数 | 安全等级 [1,5],缺省 3(关系计算用) |
org_unit |
字符串/null | 组织隶属 |
nation |
字符串/null | 国家代码 |
history_success |
浮点数 | 历史成功率 [0,1],缺省 0.8(关系计算用) |
nodes.json 整体结构:{ "nodes": { "TARGET_ID": {...}, ... }, "global_params": { "mtbf_max": number } },兼容 main_227 / f_relation1125 关系计算。
单条节点记录示例:
{
"TARGET_ID": "FS-俄-情报侦-132",
"function_vector": {
"f_IC": 0.9273, "f_IA": 0.7896, "f_CS": 0.2584, "f_IT": 0.5187,
"f_DP": 0.9148, "f_CPS": 0.5619, "f_CC": 0.7822
},
"spatial": { "position": [79.36, 52.11], "effective_radius": 94.96 },
"temporal": { "response_time": 23.3891, "cycle_time": 3.7, "data_age": 1.48, "time_window": 3.7 },
"performance": { "core_performance": 0.9831, "survivability": 0.4094, "mtbf": 0.7202 },
"protocol_list": [], "format_list": [], "interface_list": [],
"security_level": 3, "org_unit": "师级", "nation": "俄", "history_success": 0.8
}
属性对齐与字段转换(1125 规范)
依据 1125暂时属性需求(1).xlsx,对每条记录做 内容与格式的双重对齐:
- 格式校验:各字段类型与结构(dict/list/scalar)
- 内容校验:取值范围(如 [0,1]、[1,5])
- 转换:原始扁平字段 → 规范 schema
清洗报告中 details.attribute_alignment 记录格式/内容错误统计及示例。
原始字段 → 目标 Schema 映射
function_vector(功能向量)
每个维度取 [0,1] 浮点数,从原始能力字段推导:
| 目标维度 | 原始字段(按优先级) | 转换方式 |
|---|---|---|
| f_IC 情报收集 | DETECTION_ACCURACY, TARGET_RECOGNITION_CAPABILITY | 取第一个有效值,clamp 到 [0,1] |
| f_IA 信息分析 | INFORMATION_FUSION_CAPABILITY, DETECTION_ACCURACY | 同上 |
| f_CS 协同作战 | MOBILITY, ENVIRONMENT_ADAPTABILITY | 同上 |
| f_IT 信息传输 | ANTI_JAMMING_CAPABILITY | 同上 |
| f_DP 数据处理 | PROCESSING_CAPACITY, INFORMATION_FUSION_CAPABILITY | 固定参考值:见下表 |
| f_CPS 指挥控制 | DECISION_RESPONSE_TIME | 固定参考值:见下表 |
| f_CC 综合保障 | SUPPORT_CAPACITY, LOAD_CAPACITY | 固定参考值:见下表 |
固定参考值转换公式(原始值不在 [0,1] 时使用):
| 维度 | 公式 | 参数说明 |
|---|---|---|
| f_CPS | 1 / (1 + t/30) |
t = 响应时间(秒),响应越快能力越高 |
| f_DP | log10(1+PC) / log10(10001) |
PC = PROCESSING_CAPACITY;无则用 INFORMATION_FUSION_CAPABILITY clamp [0,1] |
| f_CC | 0.6×support_norm + 0.4×load_norm |
support_norm = log10(1+SUPPORT)/log10(10001),load_norm = LOAD/100;仅一个有时取该值 |
spatial(空间属性)
| 目标字段 | 原始字段(按优先级) | 转换 |
|---|---|---|
| position | position(列表 [x,y])、X/x+Y/y、POSITION_X/POSITION_Y、LONGITUDE/LATITUDE |
[round(x,2), round(y,2)],None/NaN 替为 0.0,兼容达梦多种列名 |
| effective_radius | COMMUNICATION_RANGE | 原值保留 4 位小数,缺省 1.0 |
temporal(时间属性)
| 目标字段 | 原始字段 | 转换 |
|---|---|---|
| response_time | DECISION_RESPONSE_TIME | 原值 |
| cycle_time | REFRESH_RATE | 原值 |
| data_age | TRANSMISSION_DELAY | 原值(近似数据新鲜度) |
| time_window | REFRESH_RATE | 原值 |
performance(性能属性)
| 目标字段 | 原始字段(按优先级) | 转换 |
|---|---|---|
| core_performance | STRIKE_ACCURACY, DETECTION_ACCURACY, MOBILITY | 取第一个有效值,clamp [0,1] |
| survivability | ENVIRONMENT_ADAPTABILITY, ANTI_JAMMING_CAPABILITY | 同上 |
| mtbf | RELIABILITY, SYSTEM_RELIABILITY | 取第一个有效值 |
其他标量字段
| 目标字段 | 原始字段 | 转换 |
|---|---|---|
| protocol_list | PROTOCOL | 字符串→列表,空则 [] |
| format_list | FORMAT | 同上 |
| interface_list | INTERFACE | 同上 |
| security_level | security_level, SECURITY_LEVEL | 整数 [1,5],缺省 3(避免关系计算时 None 运算错误) |
| org_unit | LEVEL, ROLE_ID | 取第一个非空字符串 |
| nation | COUNTRY_REGION | 原值 |
| history_success | history_success, HISTORY_SUCCESS | clamp [0,1],缺省 0.8(同上) |
缺失与空值
- 无可映射原始值时,多数目标字段为
null(列表型为[]) security_level、history_success、spatial.position等参与关系运算的字段永不为null:缺省分别为3、0.8、[0,0],并在「关系计算前净化」阶段再次保证- 可选字段(如
org_unit、nation)缺失不影响记录通过校验