144 lines
5.5 KiB
Markdown
144 lines
5.5 KiB
Markdown
# 作战体系数据清洗与标准化系统
|
||
|
||
## 项目简介
|
||
本项目用于处理异质作战体系节点的原始JSON数据。系统能够自动识别并修复数据中的噪声、缺失值、异常值,并将关键效能指标标准化至 [0, 1] 区间,最终输出符合建模要求的高质量数据集。
|
||
|
||
## 目录结构
|
||
```
|
||
project/
|
||
├── config/
|
||
│ ├── config.yaml # 配置文件(推荐,支持注释)
|
||
│ └── config.json # 配置文件备选
|
||
├── data/
|
||
│ ├── raw_data_sample.json # 原始输入数据(JSON 模式)
|
||
│ └── cleaned_data_final.json # 清洗后的输出数据
|
||
├── src/
|
||
│ ├── cleaner.py # 清洗运行程序
|
||
│ └── data_loader.py # 数据加载(JSON/达梦)
|
||
├── report/
|
||
│ └── detailed_cleaning_report.json # 详细清洗报告
|
||
├── scripts/
|
||
│ └── inspect_dm_tables.py # 达梦表结构查看(部署时用)
|
||
├── .env.example # 环境变量示例(含 DM_PASSWORD)
|
||
└── README.md # 项目说明文档
|
||
```
|
||
|
||
## 清洗流程说明
|
||
|
||
程序按以下顺序依次执行五步清洗操作:
|
||
|
||
### 1. 去重 (clean_duplicates)
|
||
- **依据**:按 `TARGET_ID` 去重,同一目标只保留一条记录
|
||
- **策略**:若存在 `CREATED_TIME` 字段,按创建时间倒序排序后保留最新一条;否则保留第一条
|
||
- **目的**:消除重复录入的目标节点
|
||
|
||
### 2. 缺失值填充 (handle_missing_values)
|
||
- **范围**:对所有数值型列(除 ID 外)进行处理
|
||
- **策略**:
|
||
- 先按 `ROLE_ID` 分组,用同类型单位的均值填充该组内缺失值
|
||
- 若分组后仍有缺失(如该组仅有一条记录),用全列均值兜底填充
|
||
- **目的**:保证数值字段完整,便于后续建模
|
||
|
||
### 3. 异常值纠正 (correct_outliers)
|
||
- **涉及字段**:`TARGET_RECOGNITION_CAPABILITY`、`STRIKE_ACCURACY`、`ANTI_JAMMING_CAPABILITY`、`ENVIRONMENT_ADAPTABILITY`、`MOBILITY`
|
||
- **规则**:
|
||
- 若值 < 0:取绝对值
|
||
- 若值 > 1:截断为 1.0
|
||
- **目的**:将效能指标统一限制在 [0, 1] 区间内
|
||
|
||
### 4. 噪声平滑 (apply_kalman_filter)
|
||
- **对象**:`COMMUNICATION_RANGE`(通信范围)字段
|
||
- **方法**:使用窗口大小为 3 的移动平均进行平滑(与卡尔曼滤波效果类似的时序平滑)
|
||
- **结果**:数值保留 2 位小数
|
||
- **目的**:削弱测量噪声对连续数值的影响
|
||
|
||
### 5. 标准化与输出
|
||
- 坐标精度统一为 2 位小数
|
||
- 时间戳统一为 ISO-8601 格式
|
||
- 输出清洗后 JSON 及详细报告(含各步骤的统计与示例)
|
||
|
||
## 数据源配置
|
||
|
||
程序支持两种数据源,通过 `config/config.yaml` 或 `config/config.json` 中的 `source` 切换:
|
||
|
||
| source | 适用场景 | 说明 |
|
||
|--------|--------------|------|
|
||
| `json` | 开发、无数据库 | 从 `data/raw_data_sample.json` 读取 |
|
||
| `db` | 生产、有达梦库 | 从达梦数据库指定表读取 |
|
||
|
||
### 开发阶段(当前设备无达梦)
|
||
|
||
保持 `source: json`,直接使用本地 JSON 文件即可。
|
||
|
||
### 生产阶段(部署到有达梦的设备)
|
||
|
||
`OBJECTIVE_INSTANCE` 表结构与 `raw_data_sample.json` 一致,配置中已设为 `db.table: OBJECTIVE_INSTANCE`,直接查询即可。
|
||
|
||
1. **修改配置**:`source: db`,端口 `5080`、表 `OBJECTIVE_INSTANCE` 已预设;
|
||
2. **设置密码**:`export DM_PASSWORD=你的密码`;
|
||
3. **运行清洗**:`python src/cleaner.py`。
|
||
|
||
若需自定义查询(如加 WHERE 条件),可清空 `table`,在 `db.query` 中写完整 SQL。
|
||
|
||
### 密码注入与安全说明
|
||
|
||
**⚠️ 安全原则:切勿将达梦密码写入配置文件或源代码。**
|
||
|
||
达梦模式通过环境变量 `DM_PASSWORD` 注入密码,支持以下方式:
|
||
|
||
| 方式 | 说明 |
|
||
|------|------|
|
||
| **终端** | `export DM_PASSWORD=你的密码`(Linux/Mac)或 `set DM_PASSWORD=你的密码`(Windows CMD) |
|
||
| **PyCharm** | Run → Edit Configurations → Environment variables → 添加 `DM_PASSWORD=你的密码` |
|
||
| **.env 文件** | 复制 `.env.example` 为 `.env`,填入 `DM_PASSWORD=你的密码`,并用 `python-dotenv` 加载(需自行集成) |
|
||
|
||
`inspect_dm_tables.py` 支持两种密码来源:优先环境变量 `DM_PASSWORD`,其次脚本内 `LOCAL_PASSWORD`。若使用 `LOCAL_PASSWORD`,务必执行 `git update-index --assume-unchanged scripts/inspect_dm_tables.py` 避免误提交。
|
||
|
||
配置文件(`config.yaml` / `config.json`)中仅配置 `host`、`port`、`user`、`schema`、`table` 等,**不包含 password**。本项目源代码中不包含任何硬编码密码。
|
||
|
||
## 快速开始
|
||
|
||
### 1. 环境依赖
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
核心依赖:`numpy`、`pandas`、`PyYAML`。达梦模式需额外安装 `dmPython`。
|
||
|
||
### 2. 运行清洗
|
||
在项目根目录下执行:
|
||
|
||
```bash
|
||
python src/cleaner.py
|
||
```
|
||
|
||
默认从 JSON 读取,处理后生成:
|
||
- `data/cleaned_data_final.json`(清洗后的数据)
|
||
- `report/detailed_cleaning_report.json`(详细清洗报告)
|
||
|
||
## 输出结果示例
|
||
|
||
**清洗前 (Raw):**
|
||
```json
|
||
{
|
||
"MOBILITY": -0.5,
|
||
"STRIKE_ACCURACY": 1.5,
|
||
"COMMUNICATION_RANGE": 102.8116
|
||
}
|
||
```
|
||
|
||
**清洗后 (Cleaned):**
|
||
```json
|
||
{
|
||
"MOBILITY": 0.5,
|
||
"STRIKE_ACCURACY": 1.0,
|
||
"COMMUNICATION_RANGE": 102.81
|
||
}
|
||
```
|
||
|
||
## 清洗报告说明
|
||
|
||
`detailed_cleaning_report.json` 中包含:
|
||
- **summary**:总记录数、最终记录数、去重数量
|
||
- **details**:各字段缺失值填充数量、异常值修正数量及示例、噪声平滑处理记录、标准化说明
|