Initial commit

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
lofyer
2026-07-13 15:38:41 +08:00
co-authored by factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
commit 71db82393a
180 changed files with 170640 additions and 0 deletions
+199
View File
@@ -0,0 +1,199 @@
# 二期(Era2)全市数据升级 — 关键点说明
> 更新日期:2026-03-18
>
> 本文档用于向领导解释:为什么需要接入全市数据、接入后能带来什么价值、技术上需要注意哪些关键点。
---
## 一、背景:当前方案的局限
二期报告生成系统目前使用的数据来自**原始平台导出**(17个Excel分学科文件,经ETL合并),覆盖 **13个区、176所学校**。但存在三个核心局限:
### 1. "区均值恒等于50分"问题
当前系统对每个区**独立做标准化**(PCA + Z-score → 均值50,标准差10),导致:
- 任何一个区的"区均值"永远精确等于**50.00分**
- 校长看到的"高于区均值X分"只能反映**区内相对位置**,无法回答"我们区在全市什么水平?"
- 强区和弱区的50分含金量完全不同,但报告无法体现
### 2. 缺失学校类型信息
原始导出数据中**没有**学校类型字段(市实验性示范性高中、区实验性示范性高中、公办普通高中、民办高中、特色高中等),导致:
- 报告中"同类学校均值"被迫等于区均值,丧失了对标参考价值
- LLM分析文字无法给出针对性的定位建议(如"作为市实验性示范性高中,应在全市发挥引领作用")
- 缺少A/B/C/D/T类学校的分类对比
### 3. 缺失3个区的数据
原始导出覆盖13个区、176所学校,缺少**嘉定区(11校)、普陀区(13校)、浦东新区(57校)**的数据,合计缺失约81所学校。
---
## 二、全市数据带来的价值
邱老师提供的全市数据(3个Excel文件)覆盖 **16个区、266所学校**,与当前数据相比:
### 价值1:全市统一基准线 ⭐⭐⭐
用全市266所学校做标准化基准后:
| 对比项 | 当前方案 | 升级后 |
|--------|----------|--------|
| 标准化基准 | 区内自己 → 区均值恒=50 | 全市266校 → 区均值有差异 |
| 杨浦区均值 | 50.00(数学定义) | 可能 52-55(反映杨浦在全市偏上) |
| 报告价值 | 只能看区内排名 | 能看到全市坐标、区域定位 |
| 校长体感 | "高于均值8分"——均值是什么? | "高于全市均值8分"——清晰有力 |
### 价值2:学校类型对标 ⭐⭐⭐
全市数据自带每所学校的完整元数据:
| 字段 | 示例 | 报告中的用途 |
|------|------|-------------|
| 学校类型 | 市实验性示范性高中 | "同类学校均值"计算、LLM定位建议 |
| 学校类型编号 | A类/B类/C类/D类/T类 | 五类学校分组对比 |
| 学校性质 | 公办/民办 | 办学性质维度分析 |
| 所处地区 | 城区/城市郊区 | 城郊差异分析 |
| 学校特色 | 科技类/艺术类/人文类 | 特色学校的个性化建议 |
**升级后的报告示例**
> 贵校课程实施总体得分58.75分,高于**杨浦区均值(53.2分)** 5.55分,高于**全市同类学校(市实验性示范性高中,74所)均值(54.8分)** 3.95分,在杨浦区14所学校中排名第1位。
### 价值3:覆盖完整16区 ⭐⭐
| 对比项 | 当前方案 | 升级后 |
|--------|----------|--------|
| 覆盖区域 | 13个区 | **16个区**+嘉定、普陀、浦东新区) |
| 学校数量 | 176所 | **266所** |
| 浦东新区 | ❌ 缺失 | ✅ 57所(最大区) |
### 价值4:恢复被削弱的维度 ⭐⭐
全市数据比当前parquet **多出102个字段**,其中包括之前因原始导出格式问题被标记为"二期删除"的关键字段:
| 恢复的字段 | 归属维度 | 影响 |
|-----------|---------|------|
| `信息化平台功能_*`(18个) | 环境支持 | 该子维度从"降级评分"恢复为完整评分 |
| `管理业务的信息化应用_*`(2个) | 课程迭代优化 | 该子维度从仅1个评分项恢复到3+个 |
| `教学业务的信息化应用_*`(4个) | 课程迭代优化 | 同上 |
| `已完成的网络课程门数`(1个) | 课程迭代优化 | 同上 |
| 德育、劳动周、选课走班等(约75个) | 多个维度 | 增加评分区分度 |
> ⚠️ 唯一仍缺失的字段:`信息技术与教学融合的认识_*`(教学方式创新维度),已用`教学信息化应用程度_*`替代,不受影响。
---
## 三、技术实施方案
### 架构决策:在现有era2代码上扩展,不复制新分支
**原因**:赋分引擎、渲染引擎、模板、LLM引擎完全复用,只改数据加载层和统计基准层。复制会导致两套几乎相同的代码,后续维护成本翻倍。
### 改动范围
| 文件 | 改动内容 | 影响 |
|------|---------|------|
| `08_etl_city_data.py` | **新建** — 将全市3个xlsx转为parquet | 一次性ETL |
| `config_era2.py` | 新增全市数据路径、自动构建`SCHOOL_TYPE_MAP`266校) | 配置扩展 |
| `data_engine_era2.py` | 支持加载全市parquet;提供全市基准数据接口 | 接口扩展 |
| `stats_engine_era2.py` | 标准化基准改为全市;同类学校均值从全市同类型算 | 核心逻辑变化 |
| `04_generate_report.py` | 新增`--city-baseline`参数(默认开启) | 参数扩展 |
| `05_batch_generate.py` | 同上 | 参数扩展 |
赋分引擎、渲染引擎、LLM引擎、模板 → **零改动**
---
## 四、需要注意的关键点
### 关键点1:学校名称映射
全市数据使用**简称**(如"同济一附"),当前系统使用**全称**(如"同济大学第一附属中学")。
| 来源 | 杨浦区示例 |
|------|-----------|
| 全市数据 | 同济一附、复旦附中、交大附中、控江中学 |
| 当前系统 | 同济大学第一附属中学、复旦大学附属中学… |
**处理方案**
- 统一使用全市数据的**简称**作为系统内部标识
- 报告标题使用全称(从A表或映射表获取),正文用简称
- 需构建266所学校的 简称↔全称 映射表
### 关键点2:学校数量差异
| 数据源 | 学校数 | 说明 |
|--------|:------:|------|
| A表(基础信息) | 270 | 含4所无课程数据的学校 |
| B表(课程实施) | 266 | 以此为准 |
| C表(学科课程) | 待确认 | 理论上应与B表一致 |
| 当前parquet | 176 | 原始导出不完整 |
差异原因:当前parquet来自原始平台导出(17个分学科文件),部分区的数据未被导出。全市数据是整合后的完整版。
> **建议**:以全市B表的266所学校为准。A表多出的4所(宝山世外、协和高中、金瑞学校、青浦协和)无课程数据,不参与赋分。
### 关键点3:字段差异处理
| 类别 | 数量 | 说明 |
|------|:----:|------|
| 全市与parquet共有字段 | 331 | 赋分引擎已适配 |
| 全市多出的字段 | 102 | 其中约25个可提升赋分精度,其余为新增题目 |
| parquet独有的字段 | 5 | 其中`nan`为脏数据,其余4个为极少数学校的特殊选项 |
**原则**:赋分引擎基于字段名称匹配,多出的字段不会报错(被忽略),但可以主动利用恢复的字段提升评分精度。
### 关键点4B表中的表头行污染
全市B表的`所在区`列中混有一行值为`district`的表头行,加载时需过滤:
```python
df = df[df['所在区'] != 'district']
```
### 关键点5:标准化基准变化的影响
使用全市基准后,**所有已生成的报告得分都会变化**:
| 影响 | 说明 |
|------|------|
| 分数值变化 | 同一学校的得分可能从58.75→55.2或→62.3(取决于全市分布) |
| 排名逻辑不变 | 区内排名仍按区内学校比较 |
| 水平划分 | 阈值不变(仍用赋分整理表中的固定阈值),但学校可能跨水平 |
| LLM缓存 | 所有旧缓存失效,需重新生成(约50秒/校) |
> **建议**:全市基准上线后,需一次性重新生成所有已交付区域的报告。
### 关键点6C表文件较大
`C全市数据_学科课程实施情况表_sh_sub7(全)(1).xlsx` 约44MB,包含全市15个学科×266校的数据。ETL转parquet后约10-15MB,后续读取速度不受影响。
---
## 五、实施步骤(预估)
| 步骤 | 工作量 | 说明 |
|------|--------|------|
| 1. 全市数据ETLxlsx→parquet) | 30分钟 | 新建脚本,处理名称映射和表头清洗 |
| 2. 构建全量SCHOOL_TYPE_MAP | 15分钟 | 从A/B表提取266校元数据 |
| 3. 改造data_engine支持全市数据 | 30分钟 | 加载全市parquet,提供基准接口 |
| 4. 改造stats_engine标准化逻辑 | 45分钟 | 全市基准 + 同类学校均值 |
| 5. 恢复C类削弱字段的赋分 | 30分钟 | 环境支持、课程迭代优化维度 |
| 6. 测试验证 | 30分钟 | 对比前后得分变化,确认逻辑正确 |
| 7. 重新生成已交付区域报告 | ~60分钟 | 杨浦14校+宝山19校+长宁9校 |
**合计:约 3-4 小时**
---
## 六、预期效果对比
### 报告第一段(Before
> 贵校课程实施总体得分为58.75分,高于**长宁区**均值(**50.00分**)8.75分,同时高于同类学校均值(**50.00分**)8.75分…
### 报告第一段(After
> 贵校课程实施总体得分为XX.XX分,高于**杨浦区**均值(**XX.XX分**)X.XX分,高于**全市同类学校(市实验性示范性高中,74所)** 均值(**XX.XX分**)X.XX分。在杨浦区14所学校中排名第1位,在全市同类学校中排名第X位…
信息密度和说服力显著提升。