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