中国传媒大学研究生各专业招生情况分析(python)

前言

女朋友想考中传,帮女朋友看中传官网那个成绩统计的是个啥啊… …全糊在一坨都不分专业录取,还是我邮好,各个专业每年的录取统计的命明明白白的。然后看到一个可能是录取了的小哥的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为例子):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

完整解析的数据下载

内含各个专业录取人数和分数以及上述数据处理图片:传送门

猜你喜欢

转载自blog.csdn.net/qq_37668436/article/details/106463994