# 作战体系数据清洗与网络效能评估系统 ## 项目简介 本系统包含两大功能模块: 1. **数据清洗**:从 JSON 文件或达梦数据库读取实体属性表、三元组,进行去重、缺失值填充、异常值修正、噪声平滑等清洗;并按 **1125 属性需求** 做 **内容与格式的双重对齐**(格式校验 + 内容校验 + 原始字段→规范 schema 转换),**输出仅含 xlsx 定义字段**的 `nodes.json`,不保留原始其他字段。 2. **网络关系与效能评估**:基于节点与三元组数据,计算关系强度、过滤低置信边,评估任务网络效能,生成评价报告。 --- ## 目录结构 ``` 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. 环境依赖 ```bash 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` 中设置: ```yaml source: json ``` 然后运行: ```bash 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` | ### 达梦密码(切勿写入配置) 达梦模式需设置环境变量: ```bash 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 关系计算。 **单条节点记录示例:** ```json { "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`)缺失不影响记录通过校验