基于历史数据的Python教师培训名额预测算法及代码求助
推荐算法与Python实现方案
推荐算法:基于历史参训频次的加权随机选择
核心逻辑兼顾公平性与随机性:
- 优先筛选从未参加过对应学科weekly培训的教师,保障未参训教师的参与机会
- 若未参训人数不足18,从参训次数最少的教师中补充
- 最终从候选池中随机抽取18人,避免固定排序导致的不公平
Python代码实现
代码适配初学者,依赖pandas和sqlite3(若Top_10k是CSV可直接替换):
import pandas as pd import sqlite3 import random # 配置目标参数,可按需修改 TARGET_DATE = "01/07/2023" TARGET_SUBJECT = "Physics" # 支持Mathematics/Chemistry等指定学科 TARGET_DURATION = "weekly" QUOTA = 18 # 1. 加载历史培训CSV数据 history_df = pd.read_csv("training_history.csv") # 过滤出当前学科+weekly时长的历史参训记录 subject_weekly_records = history_df[ (history_df["Subject"] == TARGET_SUBJECT) & (history_df["Training_duration"] == TARGET_DURATION) ] # 2. 获取所有教师学号(假设Top_10k是SQLite数据库表,CSV则替换为pd.read_csv) conn = sqlite3.connect("teachers_database.db") all_teachers = pd.read_sql("SELECT Rollno FROM Top_10k", conn) conn.close() # 3. 统计每位教师的参训次数 # 合并数据,标记参训次数(未参训设为0) participation_stats = pd.merge( all_teachers, subject_weekly_records.groupby("Selected_Rollno").size().reset_index(name="join_count"), left_on="Rollno", right_on="Selected_Rollno", how="left" ).fillna({"join_count": 0}) # 4. 按参训次数排序,优先选未参训教师 participation_stats = participation_stats.sort_values("join_count") # 5. 抽取符合名额的教师 non_join_teachers = participation_stats[participation_stats["join_count"] == 0]["Rollno"].tolist() if len(non_join_teachers) >= QUOTA: selected = random.sample(non_join_teachers, QUOTA) else: # 未参训人数不足,补充参训次数最少的教师 remaining = QUOTA - len(non_join_teachers) other_candidates = participation_stats[participation_stats["join_count"] > 0]["Rollno"].tolist() selected = non_join_teachers + random.sample(other_candidates, remaining) # 输出结果 print(f"[{TARGET_DATE}] {TARGET_SUBJECT} weekly培训入选教师学号:") for i, rollno in enumerate(selected, 1): print(f"{i}. {rollno}")
注意事项
- 若Top_10k是CSV文件,将数据库连接代码替换为:
all_teachers = pd.read_csv("Top_10k.csv"),确保文件中教师学号列名为Rollno - 可直接修改
TARGET_SUBJECT切换目标学科,适配所有指定学科的weekly培训筛选 - 若需避免教师在同一天参加多场培训,可额外添加逻辑过滤已有排期记录(需提前导入对应数据)
内容的提问来源于stack exchange,提问作者user2472463
相关产品推荐
相关产品推荐

