# CLAUDE.md

## 项目概述

本科毕业设计：银发群体高温多时间尺度预警和服务优化可视化研究。为焦作市和郑州市老年群体构建基于 ERA5-Land 气象数据的高温健康风险预警模型（XGBoost + LSTM-Attention），并开发 Flask+ECharts 可视化大屏。

## 技术栈

- **Python 3.13**（uv 管理虚拟环境 `.venv`）
- **PyTorch 2.12.0+cu126**（GPU 训练，RTX 4060 Laptop 8GB）
- **XGBoost 2.0+** / **Scikit-learn 1.3+**
- **Flask 3.0+** / **ECharts 5.5**
- **LaTeX**（XeLaTeX + ctexbook，中文字体 STSong/Noto Sans SC/FangSong）
- **xarray + h5netcdf + h5py**（NetCDF4 读取）

## 常用命令

```bash
# 环境
uv sync                    # 同步依赖（含 CUDA PyTorch）
uv run python -c "..."     # 运行 Python 代码

# 数据管线
uv run python -m src.data.download_era5    # CDS API 下载 ERA5
uv run python -m src.data.extract_zips     # ZIP→NetCDF 解压
uv run python -m src.data.preprocess       # 预处理管线

# 模型
uv run python -m src.models.train          # 训练 LSTM
uv run python -m src.models.evaluate       # 评估 + XGBoost 训练

# Web
uv run python -m src.web.app               # 启动 Flask (localhost:5005)

# 论文
cd thesis && xelatex -interaction=nonstopmode main && xelatex -interaction=nonstopmode main

# Git
git push origin main     # 推送到 Gitea
```

## 项目结构

```
src/
├── data/
│   ├── download_era5.py       # CDS API 逐月下载（360文件）
│   ├── extract_zips.py        # ZIP 解压（CDS 新格式适配）
│   ├── preprocess.py          # 8步预处理管线（597行）
│   └── collect_mortality.py   # 死亡率/人口数据整理
├── models/
│   ├── lstm_attention.py      # LSTM-Attention 模型（983K参数）
│   ├── xgboost_baseline.py    # XGBoost 三分类器基线
│   ├── train.py               # 训练脚本（Focal Loss + 早停）
│   └── evaluate.py            # 评估对比 + 图表生成
├── web/
│   ├── app.py                 # Flask 4端点 (predict/history/stats/index)
│   └── static/index.html      # ECharts 6面板大屏（~800行）
└── utils/config.py            # 全局配置（城市坐标/超参数/路径）
```

## 关键路径

| 路径 | 说明 |
|------|------|
| `data/raw/era5/{city}/` | 每城 180 个 NetCDF 月文件 |
| `data/processed/` | NPZ 序列 + CSV 特征（gitignored） |
| `outputs/models/best_model.pt` | LSTM 最佳 checkpoint（12MB，gitignored） |
| `outputs/figures/` | 评估图表（PNG, 300dpi） |
| `outputs/logs/` | 训练日志 |
| `thesis/main.pdf` | 编译后 PDF（56页） |

## 运行注意事项

- CDS 下载很慢（约5天），使用单线程 + 5次指数退避重试，中断后可直接重启（已存在文件自动跳过）
- CDS 迁移后返回 ZIP 格式，需要 `extract_zips.py` 解压（文件头魔数检测 PK→ZIP）
- NetCDF 读取用 `h5netcdf` 引擎，不要用 `netcdf4`（Windows 需额外 DLL）
- 论文编译需 XeLaTeX + STSong/Noto Sans SC/FangSong 字体（Windows 自带或在系统字体目录）
- 类别极度不平衡（低风险 94-96%），LSTM 多次调优未收敛，XGBoost 为主力模型

## 远程仓库

Gitea: `git@lhy-git.liuhangyv.top:Serendipity/elderly-heat-warning.git`
