学生流失率考核计算
每学期开学时,依据学生异动流失明细 + 教师岗位安排表,计算全校教师流失率考核扣分。
隐私与合规
- 本技能处理学校内部考核数据,涉及学生姓名、班级、流失原因等个人信息。
- 发布与分发前必须脱敏:所有示例、溯源明细、核对页均使用合成数据(如「示例学生甲」「示例教师甲」),不得夹带任何真实学生或教师的姓名、班级等可识别信息。
- 仅在校内受控环境处理真实数据;对外分享的 Skill 包、报告、截图一律脱敏。
- 使用者须遵守所在学校与地区的个人信息保护规定。
硬规则
- 绝不允许算错——涉及每位教师的考核分。必须做三路交叉验算后才交付。
- 疑点必须主动询问用户,不许自行猜测。尤其是:特殊学生是否计入、班主任归属冲突、名单差异。
- 先备份再填表。原表常被 Excel 占用(
PermissionError),要准备另存新文件的兜底方案。
数据源与格式
| 文件 | 格式 | 要点 |
|---|---|---|
| 教师岗位安排表 | .xlsx,定岗 sheet |
多段表头(1-2年级 / 3-4年级 / 5-6年级各有一个表头行),需按 年级/班级 行分段解析 |
| 异动学生明细表 | .xls(需 xlrd 2.0.1),异动明细 sheet |
列:序号/姓名/班级/班主任/异动类型/不在校原因/备注 |
| 开学报到汇总表 | 同上 .xls,汇总数据 sheet |
用于交叉校验流失人数 |
| 流失率考核统计表 | .xlsx | 第1行标题、第2行表头(教师姓名+24个班级列)、第3行起为教师名单 |
⚠️ 致命陷阱:班级命名跨学期错位
异动明细表的「班级」列是春期(上期)班级;汇总数据表的班级是秋期(升级后)班级,两者差一级。
例:示例学生甲 在异动明细是 一科1,在汇总表是 二年级 二科1。
必须做的校验:把异动明细按年级汇总人数,与汇总表对应年级(+1级)比对,人数应自洽(仅教师子女会有差额)。
⚠️ 致命陷阱:岗位表版本
曾出现旧版岗位表一年级班主任录反(一科2=示例教师甲、一实1=示例教师乙),与异动明细冲突。
必须先比对「异动明细班主任」与「岗位表班主任」是否 0 处不一致;不一致就请用户重新提供岗位表,不要自己判断。
⚠️ 考核范围
考核表的班级列 = 岗位表 1–5 年级 24 个教学班(岗位表标题写明"共计24个教学班"),
不含六年级(毕业年级不考核)。若异动明细出现六年级班号且春期岗位表无此班号,
大概率是填表错误(如应为五年级),必须向用户确认,不要自行换算。
执行流程
第1步:解析与交叉校验
import openpyxl, xlrd # .xls 用 xlrd 2.0.1;.xlsx 用 openpyxl
# 岗位表:定位所有满足 row[0]=='年级' and row[1]=='班级' 的表头行,按段解析
# 注意列偏移:row = [B..O],row[0]=班级 row[1]=班主任 row[2]=语文 ... row[13]=信息科技
# 空值 '\' '/' '' 都要跳过(表示该班无此课程)
校验清单:
- [ ] 异动明细每条的班主任 == 岗位表该班班主任(必须 0 处不一致)
- [ ] 每个流失班级都能在考核表 24 列中找到
- [ ] 按年级汇总人数:异动明细 vs 汇总表(+1级)自洽
- [ ] 考核表名单无重名
第2步:确认口径(必须问,不要猜)
用 AskUserQuestion 问清以下 5 项:
- 叠加口径:班主任兼本班学科时,扣 1 分 还是 1+0.1=1.1 分?
- 教师子女:汇总表标注"(教师子女)"且未收入异动明细的学生,是否计入?
- 学籍不在我校:汇总表标注但已收入异动明细的学生,是否计入?
- 跨学期/六年级学生:班级号对不上时,请用户更正(往往是填错)。
- 名单差异处理:推荐"不删除任何原有行 + 末尾追加缺失教师"。
> 同一教师在同一班兼任多科时,按人计一次 0.1(不重复扣)。
> 动手前先跑一次核查,若不存在此类情况则无需询问。
第3步:计算
每班每流失 1 人:
班主任 -1.0
该班每位任课教师 -0.1 ← 含班主任本人(若兼本班学科,按叠加口径再扣0.1)
同一教师跨多班:累加
数据结构:score[教师][班级] = 扣分,同时记录 dsrc[教师] = [(班级, 学科/班主任, 扣分)] 供溯源。
第4步:三路交叉验算(缺一不可)
① 教师行「合计扣分」列求和 = T
② 24 个班级列分别求和 = T
③ 脱离中间结果、从源表独立复算每班理论值 = T
理论值 = n×1.0 + 0.1×n×该班任课教师去重人数
18 个班逐一比对,必须零差异
三路 T 必须完全相等才可交付。
第5步:填表与产出
shutil.copy2备份原表 →*_原始备份_填写前.xlsx- 回填:有扣分填数字,无扣分留空(保持清爽);新增「合计扣分」列(复制相邻列样式)
- 名单缺失教师追加在末尾(复制末行样式),绝不删除原有行
- 新增
扣分溯源明细工作表:各班流失与班主任扣分 / 教师逐条溯源 / 教师汇总降序 - 生成 HTML 核对页(浅色、打印友好、三区块:班级构成 / 教师扣分明细 / 学生逐人清单)
环境
Python: C:/Users/yizho/.workbuddy/binaries/python/versions/3.13.12/python.exe
已装: openpyxl 3.1.5, xlrd 2.0.1
踩坑记录
- openpyxl 列偏移:
row=[cells B..O]时 row[1] 才是班主任,row[2] 起是学科。用row[2+k]配subj[k]。 - 分段表头:每段学科名不同(低段有「乐高」,高段有「信息科技」),必须从各段表头行取,不能复用第一段的。
PermissionError:目标 xlsx 被 Excel 打开时无法保存,改存新文件名并告知用户。- heredoc +
&&串联rm:python - <<'PY' ... PY && rm -f tmp.json中 rm 可能先执行导致脚本读不到中间文件。
改为把数据生成与清理都放进同一个 Python 脚本。 - 浮点:全程
round(x, 2),比对用abs(a-b) < 1e-6。