332 lines
14 KiB
Markdown
332 lines
14 KiB
Markdown
# 作战体系数据清洗与网络效能评估系统
|
||
|
||
## 项目简介
|
||
|
||
本系统包含两大功能模块:
|
||
|
||
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`)缺失不影响记录通过校验
|