基于pandas的成绩分析可视化

文章目录

    • 各科目挂科人数分析
    • 各科挂科人数占比及各班挂科人数
    • 各班绩点分布
    • 班级平均绩点
    • 单人挂科数量分析
    • 最终成绩分析报告

期末考试结束,辅导员让我做个成绩分析,于是就简单的写个python做做,写的很乱,将就看吧。
用到了pandas,pyecharts,csv,matplotlib这些包
我的数据样本为这样(一个班的数据为一个表):
在这里插入图片描述

各科目挂科人数分析

# @Time:2022/1/2123:35
# @Author:中意灬
# @File:各班挂科人数分析.py
# @ps:tutu qqnum:2117472285
import copy
import csvfrom pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def Num_eaxm(class_name,columns,Data,file):df=pd.read_csv(file,encoding='GBK',index_col=0)#读取文件,不将第一列作为索引item=list(df.columns)[3:]class_name=class_namecolumns=columnsdf.rename(columns=columns, inplace = True)data=copy.deepcopy(Data)lis=list(data.keys())data[lis[0]]+=df[df.a<60].count()[0]data[lis[1]]+=df[df.b<60].count()[0]data[lis[2]]+=df[df.c<60].count()[0]data[lis[3]]+=df[df.d<60].count()[0]data[lis[4]]+=df[df.e<60].count()[0]data[lis[5]]+=df[df.f<60].count()[0]data[lis[6]]+=df[df.g<60].count()[0]data[lis[7]]+=df[df.h<60].count()[0]data[lis[8]]+=df[df.j<60].count()[0]data[lis[9]]+=df[df.m<60].count()[0]return dataif __name__ == '__main__':Data = {'概率论': 0, '数据库原理与应用': 0, '离散数学': 0, 'Python程序开发语言课程设计': 0, '毛泽东思想和中国特色社会主义理论体系概论Ⅰ': 0, 'Python程序开发语言': 0, '形势与政策Ⅲ': 0,'大学物理BⅠ': 0,'高级办公自动化':0,'大学英语Ⅲ':0}class_name = ['概率论', '数据库原理与应用', '离散数学', 'Python程序开发语言课程设计', '毛泽东思想和中国特色社会主义理论体系概论Ⅰ', 'Python程序开发语言', '形势与政策Ⅲ', '大学物理BⅠ', '高级办公自动化', '大学英语Ⅲ']columns = {'概率论': 'a', '数据库原理与应用': 'b', '离散数学': 'c', 'Python程序开发语言课程设计': 'd', '毛泽东思想和中国特色社会主义理论体系概论Ⅰ': 'e', 'Python程序开发语言': 'f', '形势与政策Ⅲ': 'g','大学物理BⅠ': 'h','高级办公自动化':'j','大学英语Ⅲ':'m'}# 各科目参加考试人数计算data1= Num_eaxm(class_name, columns, Data, '大数据2020-1级.csv')data2= Num_eaxm(class_name, columns, Data, '大数据2020-2级.csv')data3= Num_eaxm(class_name, columns, Data, '大数据2020-3级.csv')d1=[int(i) for i in list(data1.values())]d2=[int(i) for i in list(data2.values())]d3=[int(i) for i in list(data3.values())]with open('各科挂科人数.csv', mode='w', encoding='utf-8',newline='') as f:writer = csv.writer(f)writer.writerow(['班级']+class_name)writer.writerow(['一班']+d1)writer.writerow(['二班']+d2)writer.writerow(['三班']+d3)bar = (Bar(init_opts=opts.InitOpts(width="1350px")).add_xaxis(class_name)  # x轴数据.add_yaxis('一班', d1) # y轴数据.add_yaxis('二班', d2).add_yaxis('三班', d3).set_global_opts(title_opts=opts.TitleOpts(title="2020级各班挂科人数统计"),xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 350})).set_series_opts(label_opts=opts.LabelOpts(is_show=True)))bar.render('2020级各班各科目挂科人数.html')

结果:
在这里插入图片描述

各科挂科人数占比及各班挂科人数

# @Time:2022/1/2213:26
# @Author:中意灬
# @File:各个科目挂科人数比.py
# @ps:tutu qqnum:2117472285
import copy
from matplotlib import pyplot as plt
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def Num_eaxm(class_name,columns,data,file):df=pd.read_csv(file,encoding='GBK',index_col=0)#读取文件,不将第一列作为索引item=list(df.columns)[3:]class_name=class_namea=df[class_name].count()df.fillna(value=60)columns=columnsdf.rename(columns=columns, inplace = True)num = df[(df.a < 60) | (df.b < 60) | (df.c < 60) | (df.e < 60) | (df.f < 60) | (df.g < 60) | (df.h < 60)].count()[0]  # 挂科人数lis=list(data.keys())data[lis[0]]+=df[df.a<60].count()[0]data[lis[1]]+=df[df.b<60].count()[0]data[lis[2]]+=df[df.c<60].count()[0]data[lis[3]]+=df[df.d<60].count()[0]data[lis[4]]+=df[df.e<60].count()[0]data[lis[5]]+=df[df.f<60].count()[0]data[lis[6]]+=df[df.g<60].count()[0]data[lis[7]]+=df[df.h<60].count()[0]data[lis[8]]+=df[df.j<60].count()[0]data[lis[9]]+=df[df.m<60].count()[0]return a,num
if __name__ == '__main__':data = {'概率论': 0, '数据库原理与应用': 0, '离散数学': 0, 'Python程序开发语言课程设计': 0, '毛泽东思想和中国特色社会主义理论体系概论Ⅰ': 0, 'Python程序开发语言': 0, '形势与政策Ⅲ': 0,'大学物理BⅠ': 0,'高级办公自动化':0,'大学英语Ⅲ':0}#初始挂科人数class_name = ['概率论', '数据库原理与应用', '离散数学', 'Python程序开发语言课程设计', '毛泽东思想和中国特色社会主义理论体系概论Ⅰ', 'Python程序开发语言', '形势与政策Ⅲ', '大学物理BⅠ', '高级办公自动化', '大学英语Ⅲ']#课程名称columns = {'概率论': 'a', '数据库原理与应用': 'b', '离散数学': 'c', 'Python程序开发语言课程设计': 'd', '毛泽东思想和中国特色社会主义理论体系概论Ⅰ': 'e', 'Python程序开发语言': 'f', '形势与政策Ⅲ': 'g','大学物理BⅠ': 'h','高级办公自动化':'j','大学英语Ⅲ':'m'}#重命名#各科目参加考试人数计算a1,num1=Num_eaxm(class_name,columns,data,'大数据2020-1级.csv')a2,num2=Num_eaxm(class_name,columns,data,'大数据2020-2级.csv')a3,num3=Num_eaxm(class_name,columns,data,'大数据2020-3级.csv')a5 = [int(i + j) for i, j in zip(a1, a2)]a = [int(i + j) for i, j in zip(a3, a5)]#各科目参考人数d=list(data.values())#各科目挂科人数ratio=[round(j/i*100) for i ,j in zip(a,d)]#绘图title=['概率论', '数据库原理与应用', '离散数学', 'Python课程设计', '毛概Ⅰ', 'Python程序开发语言', '形势与政策Ⅲ', '大学物理BⅠ', '高级办公自动化', '大学英语Ⅲ']plt.rcParams['font.sans-serif'] = ['SimHei']  # 处理中文显现问题plt.figure()base_num = plt.bar(title,width=0.5, height=a)  # 绘制条形图,height表示高度edu_num = plt.bar(title,width=0.5, height=d,color='r')  # 绘制条形图,height表示高度for x, y in zip(title, ratio):plt.text(x, y, '%.0f%%' % y, ha='center', va='center', fontsize=10,c='black')  # ha表示水平对齐方式,va表示锤子对其方式,fontsize表示字体大小for x, y in zip(title, a):plt.text(x, y, y, ha='center', va='bottom', fontsize=10)plt.xticks(rotation=350)plt.xlabel('科目',fontsize=10)  # 设置x轴标签plt.ylabel('人数',fontsize=10)  # 设置y轴标签plt.title('2020级各科目挂科人数占比')  # 设置题目plt.legend([base_num, edu_num], labels=['参考人数', '挂科人数'], bbox_to_anchor=(0.8, 0.99))  # 设置标签,bbox_to_anchor设置绝对位置plt.tight_layout  # 调整多图被截断或遮挡等情况plt.show()#各班挂科人数柱状图calssNum=['一班','二班','三班']faiel_num=[int(num1),int(num2),int(num3)]bar = (Bar(init_opts=opts.InitOpts(width="1000px")).add_xaxis(calssNum)  # x轴数据.add_yaxis('挂科人数', faiel_num,bar_width='20%')  # y轴数据.set_global_opts(title_opts=opts.TitleOpts(title="2020级各班挂科人数"),xaxis_opts=opts.AxisOpts(name_rotate=30, axislabel_opts={"rotate": 0}))  # 设置一些标题,坐标轴参数.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) # 是否显示数据值)bar.render('2020级各班挂科人数.html')plt.rcParams['font.sans-serif'] = 'SimHei'  # 中文问题plt.figure()shuju=[19,20 ,11 ,15,16,12,3 ]lable=['概率论', '数据库原理与应用', '离散数学', 'Python程序开发语言', '大学物理B','高级办公自动化', '大学英语Ⅲ']explode = [0.01, 0.01, 0.01, 0.01,0.01,0.01,0.01]color = ['red', 'orange', 'green', 'blue','m','c','pink']plt.pie(shuju, labels=lable, explode=explode, autopct='%1.1f%%', colors=color,shadow=True)  # labels表示标签,explode表示各板块离开中心的距离,autopct标签饼图百分比设置,colors表示颜色,shadow表示阴影(增加立体感)plt.legend(loc='upper left', bbox_to_anchor=(1, 1.01))  # 设置标签,bbox_to_anchor表示设置的绝对位置plt.title('2020级各科挂科人数情况')  # 设置标题plt.tight_layout  # 调整多图被截断或遮挡等情况plt.show()

结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

各班绩点分布

# @Time:2022/1/2216:10
# @Author:中意灬
# @File:各班绩点分布.py
# @ps:tutu qqnum:2117472285
import copy
import csvfrom pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def sorce(file):df = pd.read_csv(file, encoding='GBK', index_col=0)  # 读取文件,不将第一列作为索引a1=df[(df.平均绩点<1)&(df.平均绩点>=0)].count()[0]a2=df[(df.平均绩点<1.5)&(df.平均绩点>=1)].count()[0]a3=df[(df.平均绩点<2)&(df.平均绩点>=1.5)].count()[0]a4=df[(df.平均绩点<2.5)&(df.平均绩点>=2)].count()[0]a5=df[(df.平均绩点<3)&(df.平均绩点>=2.5)].count()[0]a6=df[(df.平均绩点<3.5)&(df.平均绩点>=3)].count()[0]a7=df[(df.平均绩点<4)&(df.平均绩点>=3.5)].count()[0]a8=df[(df.平均绩点<4.5)&(df.平均绩点>=4)].count()[0]a9=df[(df.平均绩点<=5)&(df.平均绩点>4.5)].count()[0]a=[int(a1),int(a2),int(a3),int(a4),int(a5),int(a6),int(a7),int(a8),int(a9)]return a
if __name__ == '__main__':title=['[0,1)','[1,1.5)','[1.5,2)','[2,2.5)','[2.5,3)','[3,3.5)','[3.5,4)','(4,4.5)','[4.5,5]']a1=sorce('大数据2020-1级.csv')a2=sorce('大数据2020-2级.csv')a3=sorce('大数据2020-3级.csv')with open('各班绩点分布.csv',mode='w',encoding='utf-8',newline='')as f:writer=csv.writer(f)writer.writerow(['班级']+title)writer.writerow(['一班']+a1)writer.writerow(['二班']+a2)writer.writerow(['三班']+a3)bar = (Bar(init_opts=opts.InitOpts(width="1350px")).add_xaxis(title)  # x轴数据.add_yaxis('一班', a1) # y轴数据.add_yaxis('二班', a2).add_yaxis('三班', a3).set_global_opts(title_opts=opts.TitleOpts(title="2020级分班级绩点分布情况"),xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0})).set_series_opts(label_opts=opts.LabelOpts(is_show=True)))bar.render('2020级分班级绩点分布情况.html')line = (Line(init_opts=opts.InitOpts(width="1300px")).add_xaxis(title).add_yaxis('一班', a1,is_smooth=True)  # y轴数据.add_yaxis('二班', a2,is_smooth=True).add_yaxis('三班', a3,is_smooth=True).set_global_opts(title_opts=opts.TitleOpts(title="2020级分班级绩点分布情况"),xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0})).set_series_opts(abel_opts=opts.LabelOpts(is_show=True)))line.render('2020级分班级绩点分布折线图.html')

结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

班级平均绩点

# @Time:2022/1/2216:32
# @Author:中意灬
# @File:班级平均绩点.py
# @ps:tutu qqnum:2117472285
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def avg_sorce(file):df = pd.read_csv(file, encoding='GBK', index_col=0)  # 读取文件,不将第一列作为索引avg=df['平均绩点'].mean()s=df['平均绩点'].sum()cout=df['平均绩点'].count()return avg,s,cout
def count_sorece_num(file,avg):df=pd.read_csv(file,encoding='GBK',index_col=0)high=int(df[df.平均绩点>=avg].count()[0])low=int(df[df.平均绩点<avg].count()[0])return high,low
if __name__ == '__main__':a1,s1,c1=avg_sorce('大数据2020-1级.csv')a2,s2,c2=avg_sorce('大数据2020-2级.csv')a3,s3,c3=avg_sorce('大数据2020-3级.csv')a5=(s1+s2+s3)/(c2+c3+c1)#本专业得平均绩点a=[float(round(a1,2)),float(round(a2,2)),float(round(a3,2)),float(round(a5,2))]title=['一班','二班','三班','本专业']bar = (Bar(init_opts=opts.InitOpts(width="1000px")).add_xaxis(title)  # x轴数据.add_yaxis('绩点', a,bar_width='30%',color='#4169E1')  # y轴数据.set_global_opts(title_opts=opts.TitleOpts(title="2020级各班级平均绩点情况"),xaxis_opts=opts.AxisOpts(name_rotate=30, axislabel_opts={"rotate": 0}))  # 设置一些标题,坐标轴参数.set_series_opts(label_opts=opts.LabelOpts(is_show=True),markline_opts=opts.MarkLineOpts(# 标记线数据data=[# MarkLineItem:标记线数据项opts.MarkLineItem(name="本专业平均绩点",y = a5,)])))bar.render('2020级各班级平均绩点.html')z1=[]z2=[]z3=[]z1.extend(count_sorece_num('大数据2020-1级.csv',a5))z2.extend(count_sorece_num('大数据2020-2级.csv',a5))z3.extend(count_sorece_num('大数据2020-3级.csv',a5))title=['高于本专业','低于本专业']bar = (Bar(init_opts=opts.InitOpts(width="1000px")).add_xaxis(title)  # x轴数据.add_yaxis('一班', z1)  # y轴数据.add_yaxis('二班', z2)  # y轴数据.add_yaxis('三班', z3)  # y轴数据.reversal_axis().set_global_opts(title_opts=opts.TitleOpts(title="2020级各班级绩点情况"),xaxis_opts=opts.AxisOpts(name_rotate=30, axislabel_opts={"rotate": 0}))  # 设置一些标题,坐标轴参数.set_series_opts(label_opts=opts.LabelOpts(position="right")))bar.render('2020级与本专业绩点比较情况.html')

结果:
在这里插入图片描述
在这里插入图片描述

单人挂科数量分析

# @Time:2022/1/2219:20
# @Author:中意灬
# @File:单人挂科数量统计.py
# @ps:tutu qqnum:2117472285
import csv
from matplotlib import pyplot as plt
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def single_faile_num(file):df=pd.read_csv(file,encoding="GBK",index_col=0)d=df.fillna(value=60)lis=[]for i in range(len(df)):a=0for j in list(d.iloc[i][3:]):if j <60:a=a+1lis.append(a)return lis
def fun(lis,n):a=0b=0c=0d=0e=0for i in lis:if i==0:a=a+1if i==1:b=b+1if i==2:c=c+1if i>2:d=d+1List=[a-n,b,c,d]return List
if __name__ == '__main__':lis1=single_faile_num('大数据2020-1级.csv')lis2=single_faile_num('大数据2020-2级.csv')lis3=single_faile_num('大数据2020-3级.csv')#每班单人挂科数量情况title=["0科","1科","2科","3科及其以上"]a1=fun(lis1,2)a2=fun(lis2,1)a3=fun(lis3,1)with open('个人挂科数量情况.csv',mode='w',encoding='utf-8',newline='')as f:writer=csv.writer(f)writer.writerow(['班级']+title)writer.writerow(['一班']+a1)writer.writerow(['二班']+a2)writer.writerow(['三班']+a3)#画图bar = (Bar(init_opts=opts.InitOpts(width="1350px")).add_xaxis(title)  # x轴数据.add_yaxis('一班', a1) # y轴数据.add_yaxis('二班', a2).add_yaxis('三班', a3).set_global_opts(title_opts=opts.TitleOpts(title="2020级各班单人挂科数量情况"),xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0})).set_series_opts(label_opts=opts.LabelOpts(is_show=True)))bar.render("2020级各班单人挂科情况柱状图.html")line = (Line(init_opts=opts.InitOpts(width="1350px")).add_xaxis(title)  # x轴数据.add_yaxis('一班', a1)  # y轴数据.add_yaxis('二班', a2).add_yaxis('三班', a3).set_global_opts(title_opts=opts.TitleOpts(title="2020级各班单人挂科数量情况"),xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0})).set_series_opts(label_opts=opts.LabelOpts(is_show=True)))line.render("2020级各班单人挂科情况折线图.html")plt.rcParams['font.sans-serif'] = 'SimHei'  # 中文问题plt.figure()a=[a1[0]+a2[0]+a3[0],a1[1]+a2[1]+a3[1],a1[2]+a2[2]+a3[2],a1[3]+a2[3]+a3[3]]explode = [0.2, 0.0, 0.0, 0.0]color = ['c', 'orange', 'green', 'red']plt.pie(a, labels=title, explode=explode,autopct='%1.0f%%', colors=color,shadow=True)  # labels表示标签,explode表示各板块离开中心的距离,autopct标签饼图百分比设置,colors表示颜色,shadow表示阴影(增加立体感)plt.legend(loc='upper left', bbox_to_anchor=(1, 1.01))  # 设置标签,bbox_to_anchor表示设置的绝对位置plt.title('2020级各班单人挂科数数量')  # 设置标题plt.tight_layout  # 调整多图被截断或遮挡等情况plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最终成绩分析报告

成绩分析报告


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部