main.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. """
  2. 功能:计算成绩数据
  3. """
  4. import pandas as pd
  5. import numpy as np
  6. import config
  7. scoredata = pd.read_excel(config.scorepath)
  8. scoredata = scoredata[scoredata["卷面总分"] > 0]
  9. paperdata = pd.read_excel(config.paperpath)
  10. paperdisdata = pd.read_excel(config.paperdistributionpath)
  11. def excute1(courseCode, papertype, paperName):
  12. """
  13. 计算试卷特征量数
  14. """
  15. # 根据试卷类型,试卷名称,科目划分成绩
  16. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  17. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  18. courseName = groupdata["科目名称"].values[0]
  19. # 获取当前试卷的试题结构
  20. current_paper = paperdata[
  21. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  22. # 信度1,信度2
  23. # 做统一处理
  24. # 试题数量
  25. k = current_paper.shape[0]
  26. # 计算客观题
  27. # 每题方差的和
  28. var = 0
  29. def solve(x):
  30. if x.isnull().loc["客观分得分明细"]:
  31. pass
  32. else:
  33. # 拆分客观题
  34. idx = 1
  35. for y in x["客观分得分明细"].split(";"):
  36. x["object_" + str(idx)] = float(y.split(":")[1])
  37. idx = idx + 1
  38. if x.isnull().loc["主观分得分明细"]:
  39. pass
  40. else:
  41. idx = 1
  42. for y in x["主观分得分明细"].split(";"):
  43. x["subject_" + str(idx)] = float(y)
  44. idx = idx + 1
  45. return x
  46. groupdata_new = groupdata.apply(solve, axis=1)
  47. columns = set(groupdata_new.columns)
  48. var_1 = 0
  49. var_2 = 0
  50. for column in columns:
  51. if "subject" in column or "object" in column:
  52. var = var + groupdata_new[column].var(ddof=0)
  53. if int(column.split("_")[1]) % 2 != 0:
  54. var_1 = var_1 + groupdata_new[column]
  55. else:
  56. var_2 = var_2 + groupdata_new[column]
  57. trust_1 = round((k / (k - 1)) * (1 - var / groupdata["卷面总分"].var(ddof=0)), 2)
  58. # trust_2有问题
  59. trust_2 = round(2 * (1 - ((var_1.std(ddof=0) / var_1.mean() + var_2.std(ddof=0) / var_2.mean()) / (
  60. groupdata["卷面总分"].std(ddof=0) / groupdata["卷面总分"].mean()))), 2)
  61. print(courseCode, courseName, papertype, paperName, current_paper["小题满分"].sum(), groupdata["卷面总分"].max(),
  62. groupdata["卷面总分"].max() - groupdata["卷面总分"].min(),
  63. round(groupdata["卷面总分"].mean(), 2)
  64. , round(groupdata["卷面总分"].std(ddof=0), 2),
  65. round(groupdata["卷面总分"].std(ddof=0) / groupdata["卷面总分"].mean() * 100, 2), trust_1, trust_2,
  66. round(groupdata["卷面总分"].mean() / current_paper["小题满分"].sum(), 2)
  67. )
  68. def excute2(courseCode, papertype, paperName, pingdu=10, customline=[0, 110, 122, 227]):
  69. """
  70. 计算科目成绩总分频率分布,频度默认10,如需修改,请自行修改
  71. 分数线默认[0,100,120,227],如需修改,请修改customline
  72. """
  73. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  74. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  75. courseName = groupdata["科目名称"].values[0]
  76. # 获取当前试卷的试题结构
  77. current_paper = paperdata[
  78. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  79. pingdudatarange = [x for x in range(0, current_paper["小题满分"].sum(), pingdu)]
  80. pingdudatarange.append(float('inf'))
  81. # groupdata["分数段"]=pd.cut(groupdata["卷面总分"],bins=pingdudatarange,right=False)
  82. # groupdata.sort_values(by="分数段",inplace=True)
  83. # table_1=groupdata["分数段"].value_counts().sort_index()
  84. # dict_table={"分数段":table_1.index,"个数":table_1.values}
  85. # data_1=pd.DataFrame(dict_table)
  86. # data_1["频率"]=data_1["个数"]/data_1["个数"].sum()
  87. # data_1["累计个数"]=data_1["个数"].cumsum()
  88. # data_1["累计频率"]=data_1["累计个数"]/data_1["个数"].sum()
  89. data_1 = scorefenduan(groupdata, pingdudatarange)
  90. print(data_1)
  91. # 计算自定义分数段
  92. customline.append(float('inf'))
  93. data_2 = scorefenduan(groupdata, customline)
  94. print(data_2)
  95. def scorefenduan(data, cutline):
  96. data["分数段"] = pd.cut(data["卷面总分"], bins=cutline, right=False)
  97. data.sort_values(by="分数段", inplace=True)
  98. table_1 = data["分数段"].value_counts().sort_index()
  99. dict_table = {"分数段": table_1.index, "个数": table_1.values}
  100. data_1 = pd.DataFrame(dict_table)
  101. data_1["频率"] = data_1["个数"] / data_1["个数"].sum()
  102. data_1["累计个数"] = data_1["个数"].cumsum()
  103. data_1["累计频率"] = data_1["累计个数"] / data_1["个数"].sum()
  104. return data_1
  105. def exctute3(courseCode, papertype, paperName, customline=[0, 110, 122, 227]):
  106. """
  107. 科目成绩占初试总分权重
  108. """
  109. # 先取该科目成绩
  110. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  111. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  112. # 统计该科目学号下的每个人的成绩总和
  113. total_score_data = scoredata[scoredata["学号"].isin(list(groupdata["学号"]))]
  114. current_paper = paperdata[
  115. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  116. # 开始进行分箱
  117. customline.append(float('inf'))
  118. total_score_data["分数段"] = pd.cut(total_score_data["卷面总分"], bins=customline, right=False)
  119. total_score_data.sort_values(by="分数段", inplace=True)
  120. result = pd.DataFrame(columns=["分数段", "人数占比", "初始总分平均分", "本科目成绩平均分", "本科目难度", "占总分权重%"])
  121. scorelist = set(total_score_data["分数段"])
  122. for scorerange in scorelist:
  123. cur_score_data = total_score_data[total_score_data["分数段"] == scorerange]
  124. total_avg = cur_score_data["卷面总分"].mean()
  125. cur_course_avg = cur_score_data[cur_score_data["科目代码"] == courseCode]["卷面总分"].mean()
  126. cur_course_diffcult = cur_score_data[cur_score_data["科目代码"] == courseCode]["卷面总分"].mean() / \
  127. current_paper["小题满分"].sum()
  128. zongfen_quanzhong = total_avg / cur_course_avg * 100
  129. result = result.append(
  130. {"分数段": scorerange, "人数占比": cur_score_data.shape[0] / total_score_data.shape[0], "初始总分平均分": total_avg,
  131. "本科目成绩平均分": cur_course_avg, "本科目难度": cur_course_diffcult, "占总分权重%": zongfen_quanzhong}, ignore_index=True)
  132. result = result.append(
  133. {"分数段": "全体考生", "人数占比": 1, "初始总分平均分": total_score_data["卷面总分"].mean(),
  134. "本科目成绩平均分": total_score_data[total_score_data["科目代码"] == courseCode]["卷面总分"].mean(),
  135. "本科目难度": total_score_data["卷面总分"].mean() / current_paper["小题满分"].sum(),
  136. "占总分权重%": total_score_data["卷面总分"].mean() / total_score_data[total_score_data["科目代码"] == courseCode][
  137. "卷面总分"].mean() * 100}, ignore_index=True)
  138. #
  139. print(result)
  140. def excute4(courseCode, papertype, paperName):
  141. """
  142. 试卷项目编排
  143. """
  144. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  145. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  146. courseName = groupdata["科目名称"].values[0]
  147. # 获取当前试卷的试题结构
  148. current_paper = paperdata[
  149. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  150. def solve(x):
  151. if x.isnull().loc["客观分得分明细"]:
  152. pass
  153. else:
  154. # 拆分客观题
  155. idx = 1
  156. for y in x["客观分得分明细"].split(";"):
  157. x["object_" + str(idx)] = float(y.split(":")[1])
  158. idx = idx + 1
  159. if x.isnull().loc["主观分得分明细"]:
  160. pass
  161. else:
  162. idx = 1
  163. for y in x["主观分得分明细"].split(";"):
  164. x["subject_" + str(idx)] = float(y)
  165. idx = idx + 1
  166. return x
  167. groupdata_new = groupdata.apply(solve, axis=1)
  168. # 统计每一个子题号的难度指数,按照大题题号,小题号进行分组
  169. number_group = current_paper.groupby(by=["大题号", "小题号"])
  170. result = pd.DataFrame(columns=["大题号", "小题号", "难度"])
  171. object_index_number = 1
  172. subject_index_number = 1
  173. for index, questiondata in number_group:
  174. main_number = index[0]
  175. sub_number = index[1]
  176. object_question_data = questiondata[questiondata["是否客观题"] == 1]
  177. subject_question_data = questiondata[questiondata["是否客观题"] == 0]
  178. total_score = questiondata["小题满分"].sum()
  179. sum_var = 0
  180. for i in range(0, object_question_data.shape[0]):
  181. sum_var = sum_var + groupdata_new["object_" + str(object_index_number)]
  182. object_index_number = object_index_number + 1
  183. for i in range(0, subject_question_data.shape[0]):
  184. sum_var = sum_var + groupdata_new["subject_" + str(subject_index_number)]
  185. subject_index_number = subject_index_number + 1
  186. avg = sum_var.mean()
  187. diffcult = avg / total_score
  188. result = result.append({"大题号": main_number, "小题号": sub_number, "难度": diffcult}, ignore_index=True)
  189. print(result)
  190. def excute5(courseCode, papertype, paperName):
  191. """
  192. 试卷特征量数
  193. """
  194. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  195. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  196. courseName = groupdata["科目名称"].values[0]
  197. # 获取当前试卷的试题结构
  198. current_paper = paperdata[
  199. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  200. def solve(x):
  201. if x.isnull().loc["客观分得分明细"]:
  202. pass
  203. else:
  204. # 拆分客观题
  205. idx = 1
  206. for y in x["客观分得分明细"].split(";"):
  207. x["object_" + str(idx)] = float(y.split(":")[1])
  208. idx = idx + 1
  209. if x.isnull().loc["主观分得分明细"]:
  210. pass
  211. else:
  212. idx = 1
  213. for y in x["主观分得分明细"].split(";"):
  214. x["subject_" + str(idx)] = float(y)
  215. idx = idx + 1
  216. return x
  217. groupdata_new = groupdata.apply(solve, axis=1)
  218. # 统计每一个子题号的难度指数,按照大题题号,小题号进行分组
  219. number_group = current_paper.groupby(by=["大题号", "小题号"])
  220. result = pd.DataFrame(columns=["大题号", "小题号", "满分", "最高分", "最低分", "平均分", "差异系数", "区分度", "零分人数", "有效卷数"])
  221. object_index_number = 1
  222. subject_index_number = 1
  223. for index, questiondata in number_group:
  224. main_number = index[0]
  225. sub_number = index[1]
  226. object_question_data = questiondata[questiondata["是否客观题"] == "是"]
  227. subject_question_data = questiondata[questiondata["是否客观题"] == "否"]
  228. total_score = questiondata["小题满分"].sum()
  229. sum_var = 0
  230. for i in range(0, object_question_data.shape[0]):
  231. sum_var = sum_var + groupdata_new["object_" + str(object_index_number)]
  232. object_index_number = object_index_number + 1
  233. for i in range(0, subject_question_data.shape[0]):
  234. sum_var = sum_var + groupdata_new["subject_" + str(subject_index_number)]
  235. subject_index_number = subject_index_number + 1
  236. avg = sum_var.mean()
  237. diffcult = avg / total_score
  238. import math
  239. result = result.append(
  240. {"大题号": main_number, "小题号": sub_number, "满分": questiondata["小题满分"].sum(), "最高分": sum_var.max(),
  241. "最低分": sum_var.min(),
  242. "平均分": round(sum_var.mean(), 2), "标准差": sum_var.std(ddof=0),
  243. "差异系数": round(sum_var.std(ddof=0) / sum_var.mean(), 2)
  244. , "区分度": (((sum_var * groupdata_new["卷面总分"]).sum()) - (
  245. sum_var.sum() * groupdata_new["卷面总分"].sum() / sum_var.shape[0])) / math.sqrt(
  246. ((sum_var ** 2).sum() - sum_var.sum() ** 2 / sum_var.shape[0]) * (
  247. (groupdata_new["卷面总分"] ** 2).sum() - ((
  248. groupdata_new["卷面总分"].sum()) ** 2) / sum_var.shape[
  249. 0])),
  250. "零分人数": (sum_var == 0).astype(int).sum(), "有效卷数": sum_var.shape[0]}, ignore_index=True)
  251. print(result)
  252. # excute5("CS2021001", "A", "Y2021090201")
  253. def excute6(courseCode, papertype, paperName, type):
  254. """
  255. 题型难度分布 type为 题型1,题型2,题型3,内容1,2,3等,参考导入模板
  256. """
  257. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  258. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  259. courseName = groupdata["科目名称"].values[0]
  260. # 获取当前试卷的试题结构
  261. current_paper = paperdata[
  262. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  263. current_paper_dis = paperdisdata[
  264. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  265. # 题型难度一
  266. current_paper_dis["idx"] = np.array([i for i in range(1, current_paper_dis.shape[0] + 1)])
  267. current_paper["idx"] = np.array([i for i in range(1, current_paper.shape[0] + 1)])
  268. question_dis_group_1 = current_paper_dis.groupby(type)
  269. def solve(x):
  270. idx = 1
  271. if x.isnull().loc["客观分得分明细"]:
  272. pass
  273. else:
  274. # 拆分客观题
  275. for y in x["客观分得分明细"].split(";"):
  276. x["object_" + str(idx)] = float(y.split(":")[1])
  277. idx = idx + 1
  278. if x.isnull().loc["主观分得分明细"]:
  279. pass
  280. else:
  281. for y in x["主观分得分明细"].split(";"):
  282. x["subject_" + str(idx)] = float(y)
  283. idx = idx + 1
  284. return x
  285. groupdata_new = groupdata.apply(solve, axis=1)
  286. print("题型,题量,满分,难度")
  287. for title, data in question_dis_group_1:
  288. qustion_data = current_paper[current_paper["大题号"].isin(data["大题号"]) & current_paper["小题号"].isin(data["小题号"])]
  289. sum_var = 0
  290. hard_num = 0
  291. hard_score = 0
  292. normal_num = 0
  293. normal_score = 0
  294. easy_num = 0
  295. easy_score = 0
  296. for index, ques in qustion_data.iterrows():
  297. question_index = ques["idx"]
  298. if "object_" + str(question_index) in groupdata_new.columns:
  299. cur_questiton = groupdata_new["object_" + str(question_index)]
  300. sum_var = sum_var + cur_questiton
  301. elif "subject_" + str(question_index) in groupdata_new.columns:
  302. cur_questiton = groupdata_new["subject_" + str(question_index)]
  303. sum_var = sum_var + cur_questiton
  304. diffcult = cur_questiton.mean() / ques["小题满分"]
  305. if diffcult < 0.4:
  306. # 高难度
  307. hard_num = hard_num + 1
  308. hard_score = hard_score + ques["小题满分"]
  309. elif 0.4 <= diffcult <= 0.6:
  310. normal_num = normal_num + 1
  311. normal_score = normal_score + ques["小题满分"]
  312. elif diffcult > 0.6:
  313. easy_num = easy_num + 1
  314. easy_score = easy_score + ques["小题满分"]
  315. print(title, data.shape[0], qustion_data["小题满分"].sum(), sum_var.mean() / qustion_data["小题满分"].sum())
  316. print("高难度")
  317. print("题量", "分值", "%")
  318. print(hard_num, hard_score, hard_num / data.shape[0])
  319. print("中难度")
  320. print("题量", "分值", "%")
  321. print(normal_num, normal_score, normal_num / data.shape[0])
  322. print("低难度")
  323. print("题量", "分值", "%")
  324. print(easy_num, easy_score, easy_num / data.shape[0])
  325. def excute7(courseCode, papertype, paperName, pingdu=10, customline=[0, 110, 122, 227]):
  326. """
  327. 试题难度分组分布,10分一段
  328. """
  329. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  330. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  331. courseName = groupdata["科目名称"].values[0]
  332. # 获取当前试卷的试题结构
  333. current_paper = paperdata[
  334. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  335. current_paper_dis = paperdisdata[
  336. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  337. # 题型难度一
  338. current_paper_dis["idx"] = np.array([i for i in range(1, current_paper_dis.shape[0] + 1)])
  339. current_paper["idx"] = np.array([i for i in range(1, current_paper.shape[0] + 1)])
  340. question_dis_group_1 = current_paper_dis.groupby(type)
  341. def solve(x):
  342. idx = 1
  343. if x.isnull().loc["客观分得分明细"]:
  344. pass
  345. else:
  346. # 拆分客观题
  347. for y in x["客观分得分明细"].split(";"):
  348. x["object_" + str(idx)] = float(y.split(":")[1])
  349. idx = idx + 1
  350. if x.isnull().loc["主观分得分明细"]:
  351. pass
  352. else:
  353. for y in x["主观分得分明细"].split(";"):
  354. x["subject_" + str(idx)] = float(y)
  355. idx = idx + 1
  356. return x
  357. groupdata_new = groupdata.apply(solve, axis=1)
  358. # 按总分进行切片
  359. pingdudatarange = [x for x in range(0, current_paper["小题满分"].sum(), pingdu)]
  360. pingdudatarange.append(float('inf'))
  361. score_fenduan_1(groupdata_new, pingdudatarange, current_paper)
  362. customline.append(float('inf'))
  363. score_fenduan_1(groupdata_new, customline, current_paper)
  364. def score_fenduan_1(data, cutline, paper):
  365. data["分数段"] = pd.cut(data["卷面总分"], bins=cutline, right=False)
  366. group_fenduan = data.groupby(by=["分数段"])
  367. for index, current_ques in paper.iterrows():
  368. print("大题号,小题号")
  369. print(current_ques["大题号"], current_ques["小题号"])
  370. question_index = current_ques["idx"]
  371. for scorerange, group_data in group_fenduan:
  372. if group_data.shape[0] != 0:
  373. if "object_" + str(question_index) in group_data.columns:
  374. cur_questiton_score = group_data["object_" + str(question_index)]
  375. elif "subject_" + str(question_index) in group_data.columns:
  376. cur_questiton_score = group_data["subject_" + str(question_index)]
  377. avg = cur_questiton_score.mean()
  378. else:
  379. avg = 0
  380. # print(cur_questiton_score)
  381. print(scorerange, avg / current_ques["小题满分"])
  382. # groupdata_new.sort_values(by="分数段", inplace=True)
  383. def excute8(courseCode, papertype, paperName, type):
  384. """
  385. 题型区分度分布 type为 题型1,题型2,题型3,内容1,2,3等,参考导入模板
  386. """
  387. score_groups = scoredata.groupby(by=["科目代码", "试卷类型", "试卷名称"])
  388. groupdata = score_groups.get_group((courseCode, papertype, paperName))
  389. courseName = groupdata["科目名称"].values[0]
  390. # 获取当前试卷的试题结构
  391. current_paper = paperdata[
  392. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  393. current_paper_dis = paperdisdata[
  394. (paperdata["科目代码"] == courseCode) & (paperdata["试卷类型"] == papertype) & (paperdata["试卷名称"] == paperName)]
  395. # 题型难度一
  396. current_paper_dis["idx"] = np.array([i for i in range(1, current_paper_dis.shape[0] + 1)])
  397. current_paper["idx"] = np.array([i for i in range(1, current_paper.shape[0] + 1)])
  398. question_dis_group_1 = current_paper_dis.groupby(type)
  399. def solve(x):
  400. idx = 1
  401. if x.isnull().loc["客观分得分明细"]:
  402. pass
  403. else:
  404. # 拆分客观题
  405. for y in x["客观分得分明细"].split(";"):
  406. x["object_" + str(idx)] = float(y.split(":")[1])
  407. idx = idx + 1
  408. if x.isnull().loc["主观分得分明细"]:
  409. pass
  410. else:
  411. for y in x["主观分得分明细"].split(";"):
  412. x["subject_" + str(idx)] = float(y)
  413. idx = idx + 1
  414. return x
  415. groupdata_new = groupdata.apply(solve, axis=1)
  416. print("题型,题量,满分,难度")
  417. for title, data in question_dis_group_1:
  418. qustion_data = current_paper[current_paper["大题号"].isin(data["大题号"]) & current_paper["小题号"].isin(data["小题号"])]
  419. sum_var = 0
  420. hard_num = 0
  421. hard_score = 0
  422. normal_num = 0
  423. normal_score = 0
  424. easy_num = 0
  425. easy_score = 0
  426. bad_num=0
  427. bad_score=0
  428. for index, ques in qustion_data.iterrows():
  429. question_index = ques["idx"]
  430. if "object_" + str(question_index) in groupdata_new.columns:
  431. cur_questiton = groupdata_new["object_" + str(question_index)]
  432. sum_var = sum_var + cur_questiton
  433. elif "subject_" + str(question_index) in groupdata_new.columns:
  434. cur_questiton = groupdata_new["subject_" + str(question_index)]
  435. sum_var = sum_var + cur_questiton
  436. # diffcult=cur_questiton.mean()/ques["小题满分"]
  437. import math
  438. dimeistion = round(sum_var.std(ddof=0) / sum_var.mean(), 2)
  439. if dimeistion >= 0.4:
  440. # 高难度
  441. hard_num = hard_num + 1
  442. hard_score = hard_score + ques["小题满分"]
  443. elif 0.3 <= dimeistion < 0.4:
  444. normal_num = normal_num + 1
  445. normal_score = normal_score + ques["小题满分"]
  446. elif 0.2 <= dimeistion < 0.3:
  447. easy_num = easy_num + 1
  448. easy_score = easy_score + ques["小题满分"]
  449. elif dimeistion < 0.2:
  450. bad_num = bad_num + 1
  451. bad_score = bad_score + ques["小题满分"]
  452. print(title, data.shape[0], qustion_data["小题满分"].sum(), sum_var.mean() / qustion_data["小题满分"].sum())
  453. print("优")
  454. print("题量", "分值", "%")
  455. print(hard_num, hard_score, hard_num / data.shape[0])
  456. print("良")
  457. print("题量", "分值", "%")
  458. print(normal_num, normal_score, normal_num / data.shape[0])
  459. print("中")
  460. print("题量", "分值", "%")
  461. print(easy_num, easy_score, easy_num / data.shape[0])
  462. print("差")
  463. print("题量", "分值", "%")
  464. print(bad_num, bad_score, bad_num / data.shape[0])
  465. excute5(242,"#",242)
  466. # excute6("CS2021001","A","Y2021090201","内容1")
  467. # excute7("CS2021001","A","Y2021090201")
  468. # excute1("CS2021001","A","Y2021090201")
  469. # excute2("CS2021001","A","Y2021090201")