项目

一般

简介

CR-001-M2里程碑 Parquet Schema 变更 » 历史记录 » 版本 1

Huarui Lin, 2026-04-12 18:37

1 1 Huarui Lin
# CR-001: M2 里程碑 Parquet Schema 变更(新增 segment_id)
2
3
| 字段 | 内容 |
4
|------|------|
5
| **CR ID** | CR-001 |
6
| **标题** | 清洗后 Parquet 新增 `segment_id` 列 |
7
| **发起人** | Henry Lin (PM) |
8
| **日期** | 2026-04-11 |
9
| **状态** | ✅ Approved |
10
| **影响范围** | M2 Done 标准、规约 1.3 存储方案、Step 3/4/5 模块接口 |
11
12
---
13
14
### 1. 变更描述
15
16
**原文(项目章程 M2 Done 标准)**:
17
> Parquet 文件产出,Schema **仅含** `fund_id`/`net_value_date`/`cumulative_net_value`
18
19
**变更为**:
20
> Parquet 文件产出,Schema 含 `fund_id`/`net_value_date`/`cumulative_net_value`/`segment_id`
21
22
新增列定义:
23
24
| 字段 | 类型 | 可否 NULL | 说明 |
25
|------|------|-----------|------|
26
| `segment_id` | `UInt32` | **NOT NULL** | 截断段标识。同一 `fund_id` 内,连续有效数据段从 `0` 起递增。被 `>4周连续缺失` 截断后,下一段 `segment_id + 1`。用于后续 Step 3 滚动窗口计算的物理隔离边界。 |
27
28
### 2. 变更原因(根因追溯)
29
30
规约 1.2 规定"连续缺失 > 4 周的区段直接截断,截断后各段独立参与后续计算"。
31
若不引入 `segment_id`,后续 Step 3 的 Polars 滚动窗口将无法识别截断边界,
32
导致跨段窗口计算引入"未来穿越"的脏数据。此为**数据完整性红线**,
33
不是功能增强,而是工程必需。
34
35
### 3. 影响分析
36
37
| 受影响模块 | 影响说明 | 应对措施 |
38
|-----------|---------|---------|
39
| `data_loader.py` (Step 2) | 输出 Parquet 必须包含 `segment_id` | 在 Polars 截断逻辑中增加列生成 |
40
| `feature_engineering.py` (Step 3) | 滚动窗口必须按 `segment_id` 隔离 | `group_by(['fund_id', 'segment_id'])` |
41
| `label_generator.py` (Step 4) | DCA 标签计算不可跨段 | 按 `segment_id` 切片后独立计算 |
42
| `trainer.py` (Step 5) | 训练数据 JOIN 需携带 `segment_id` | 无额外逻辑,自动透传 |
43
| `data_audit.json` | 新增 `truncated_rows_by_gap` 字段 | 已纳入审计 Schema |
44
45
### 4. 更新后的 M2 Done 标准(完整版)
46
47
① Parquet 文件产出,Schema 含 `fund_id`(String)/`net_value_date`(Date)/`cumulative_net_value`(Float64)/`segment_id`(UInt32);
48
② 实体机压测峰值内存 ≤ 40GB;
49
③ 审计日志 `data_audit.json` 包含:`whitelist_retention_rate`、`missing_rate`、`anomaly_rate`、`building_period_dropped`、`survival_filtered`、`truncated_rows_by_gap`;
50
④ `fund_basic_info` 多余 4 列已显式丢弃;
51
⑤ `v_net_value_processed` DuckDB VIEW 创建成功。
52
53
---
54
**PM 签字**:Henry Lin | **日期**:2026-04-11