前言
女朋友想考中传,帮女朋友看中传官网那个成绩统计的是个啥啊… …全糊在一坨都不分专业录取,还是我邮好,各个专业每年的录取统计的命明明白白的。然后看到一个可能是录取了的小哥的github吧,分析了下学生考号组成,我算是搞懂了怎么给他分专业分析录取了,用python代码实现了下。
小哥的github:参考了部分代码
首先解析这一坨的全部成绩
import re
import os
import pandas as pd
def selcet(rule, read_path, write_path):
'''
rule: 匹配规则(正则)
read_path: 输入文件路径
write_path: 输出文件路径
'''
with open(read_path, encoding="gbk") as file:
data = pd.read_csv(file)
cnt = 0
for i in range(len(data)):
# 取到15位准考证号
number = data.iloc[[i], 0].to_string()[-15:]
if re.match(rule, number):
cnt += 1 # 计数
df = data.iloc[[i], :]
# 打印到控制台
# print(df)
# 输出到csv文件,index要设置为False,否则会多一列索引值
df.to_csv(write_path, mode="a", index=False,
header=None, encoding="gbk")
print("一共找到了{}个数据".format(cnt))
if __name__ == "__main__":
# 实例:10033 0001 16 1 005
# 原理:学校号 地区号 学院号 方向 流水
front_rule = "^10033[0-9]{4}"
last_rule = "[0-9]{4}$"
for college_number in range(20):
new_rule = front_rule + str(college_number).rjust(2,'0') + last_rule
# 输入,输出文件目录
read_path = os.getcwd() + r'\data\完整成绩.csv'
write_path = os.getcwd() + r'\data\outdata' + str(college_number).rjust(2,'0') + '.csv'
# 根据需要改三个参数
selcet(new_rule, read_path, write_path)
这里小改了他的代码,读取了一个完整成绩的csv然后将20个专业方向都分别输出到对应的csv里面了:
里面长这样:
然后用py画成散点图分析平均分和中位数
import csv
import numpy as np
import matplotlib.pyplot as plt
import os
def myPlot(number,score,label,picname):
savepath = picname + label + ".png"
x = range(number)
p = plt.scatter(x, score, marker='*', color='r', s=30)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
average = np.mean(score)
median = np.median(score)
plt.hlines(average, 0, number, 'r', '--', label='average:' + str(round(average,2)))
plt.hlines(median, 0, number, 'b', '--', label='median:' + str(round(median,2)))
plt.legend(loc='lower right')
plt.title(label)
plt.xticks(x)
my_y_ticks = np.arange(min(score), max(score) + (max(score) - min(score))/10, (max(score) - min(score))/10 )
plt.yticks(my_y_ticks)
plt.savefig(savepath)
plt.close()
#plt.show() # show不得.......
base_dir = r'.\data\outdata'
dataForm = r'.csv'
for collegeNumber in range(20):
currentCSV = base_dir + str(collegeNumber).rjust(2,'0') + dataForm
print("当前处理" + currentCSV)
with open(currentCSV) as f:
render = csv.reader(f) # reader(迭代器对象)--> 迭代器对象
lesson1,lesson2,lesson3,lesson4,score = [],[],[],[],[]
for row in render:
lesson1.append(int(row[2]))
lesson2.append(int(row[3]))
lesson3.append(int(row[4]))
lesson4.append(int(row[5]))
score.append(int(row[6]))
save_path = ".\data\outdata" + str(collegeNumber).rjust(2,'0') + "\\"
if not os.path.exists(save_path):
os.mkdir(save_path)
myPlot(len(score), score,'总成绩',save_path)
myPlot(len(lesson1), lesson1, '政治', save_path)
myPlot(len(lesson2), lesson2, '英语', save_path)
myPlot(len(lesson3), lesson3, '科一', save_path)
myPlot(len(lesson4), lesson4, '科二', save_path)
效果如下(以学院16为例子):
完整解析的数据下载
内含各个专业录取人数和分数以及上述数据处理图片:传送门