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
+103
View File
@@ -0,0 +1,103 @@
# 二期数据处理脚本
## 数据概况
| 项目 | 一期 | 二期 |
|------|------|------|
| 区域 | 仅长宁区 | **13个区** |
| 学校数 | 9所 | **176~177所** |
| 基础信息表 | 277行 | 5,557行 |
| 课程实施情况表 | 5,506行 / 128题 | 145,484行 / **103题** |
| 学科课程实施情况表 | 25,006行 / 131题 | **1,348,513行** / 87~131题 |
### 一期 vs 二期 关键差异
1. **格式不同**:一期是3张扁平Excel,二期是原始平台导出(每题一个Sheet + 15个学科独立文件)
2. **题目数量**:课程实施表少了25题(128→103),学科表按学科不同题数也不同
3. **学校名称**:一期用简称("延安中学"),二期用全称("上海市延安中学")
4. **长宁区**:二期只有8所(缺少"市三女中"),一期有9所
5. **字段ID覆盖**
- 课程实施表:共有275个,一期独有74个,二期独有62个
- 学科表字段名称:共有713个,一期独有150个,二期独有53个
## 脚本说明
### `01_etl_transform.py` — ETL转换
将二期原始数据转换为与一期相同列结构的3张扁平表(parquet格式)。
```bash
cd report-admin
python3 scripts/era2/01_etl_transform.py
```
**输入**`二期/[整理前] 二期_课程实施+教材使用情况表/` 下的17个xlsx文件
**输出**`data/era2/` 下的3个parquet文件 + etl_meta.json
- `era2_基础信息表.parquet` — 列与一期完全一致
- `era2_课程实施情况表.parquet` — 列与一期完全一致
- `era2_学科课程实施情况表.parquet` — 列与一期完全一致
- `etl_meta.json` — 元信息(学校列表、区域列表等)
> ⚠️ 学科表有135万行,超过Excel行数上限(1,048,576),因此使用parquet格式
### `02_verify_data.py` — 数据验证
对比一期和二期的列名、字段ID、学校名称等。
```bash
cd report-admin
python3 scripts/era2/02_verify_data.py
```
## 完整脚本列表
| 脚本 | 功能 | 用法 |
|------|------|------|
| `01_etl_transform.py` | 原始格式 → 扁平表 parquet | `python3 scripts/era2/01_etl_transform.py` |
| `02_verify_data.py` | 验证 ETL + 一期对比 | `python3 scripts/era2/02_verify_data.py` |
| `03_test_pipeline.py` | 完整 Pipeline 测试(不调 LLM | `python3 scripts/era2/03_test_pipeline.py --district 长宁区` |
| `04_generate_report.py` | 单校报告生成 | `python3 scripts/era2/04_generate_report.py --school 延安中学` |
| `05_batch_generate.py` | 批量报告生成 | `python3 scripts/era2/05_batch_generate.py --district 长宁区` |
| `config_era2.py` | 二期配置(路径、学校映射等) | 被其他脚本导入 |
| `data_engine_era2.py` | 二期数据引擎(兼容一期接口) | 被其他脚本导入 |
### 关键参数
- `--district 长宁区` — 只分析长宁区8所学校(默认)
- `--district all` — 分析全部13个区176所学校
- `--enable-llm` — 启用 LLM 文字生成(**会产生 API 费用**)
- `--school 延安中学` — 指定学校(支持简称)
- `--list-schools` — 列出可用学校
### 运行示例
```bash
cd report-admin
# 1. ETL(只需运行一次)
python3 scripts/era2/01_etl_transform.py
# 2. 测试 pipeline(长宁区)
python3 scripts/era2/03_test_pipeline.py --district 长宁区
# 3. 全市 pipeline
python3 scripts/era2/03_test_pipeline.py --district all
# 4. 生成延安中学报告(不调LLM)
python3 scripts/era2/04_generate_report.py --school 延安中学
# 5. 批量生成长宁区全部报告(不调LLM)
python3 scripts/era2/05_batch_generate.py --district 长宁区
# 6. 启用LLM生成(⚠️ 会产生费用)
python3 scripts/era2/04_generate_report.py --school 延安中学 --enable-llm
```
## 后续优化方向
1. **学校名称映射扩展**:目前只配了长宁区8所学校的全称→简称映射,全市176所需补充
2. **学校类型信息补充**:办学性质、学校等级、特色类型等(一期在 config 手工配了9所)
3. **题号映射精细核对**:确认二期103题与一期128题的对应关系,优化赋分覆盖率
4. **赋分规则适配**:基于字段ID的赋分规则大部分可复用,但部分新增/缺失字段需处理
5. **全市对照基准**:二期有176所学校,PCA和标准化终于有统计意义,可做真正的全市对照