任务:
题目1-读取第二课堂成绩,并写入到新文件:学号exls;
题目2- 画出自己的得分图形并计算得分百分位;
题目3-分别按照学号、单项得分、总分顺序输出前十(6大项,24小项)
题目4-分析平均得分最高和最低的项目(6大项,24小项)
题日5-按照学号顺序画出6个大项的得分曲线
题目6-统计6个大项和总分的得分分布,并画图
题目7-按照班级对数据切片,并存储到文件;
题目8-在自己所在班级内重复题目3-6.

# 导入pandas库
import pandas as pd

# 题目1:读取第二课堂成绩,并写入到新文件:学号exls
df = pd.read_excel('第二课堂成绩.xlsx') # 读取成绩表
df.to_excel('学号exls.xlsx', index=False) # 写入学号exls.xlsx文件,不包括索引列

# 题目2:画出自己的得分图形并计算得分百分位
my_score = df.loc[df['学号'] == 'your_student_id'] # 替换your_student_id为你的学号
my_score.plot(kind='bar', x='项目名称', y='总得分') # 用柱状图显示成绩
percentile = df['总得分'].rank(pct=True).loc[my_score.index].values[0] # 计算百分位
print(f"你的得分百分位为:{percentile:.2%}") # 显示百分位

# 题目3:分别按照学号、单项得分、总分顺序输出前十
top10_by_ID = df.sort_values('学号').head(10) # 按照学号排序,取前10个
top10_by_item = df.sort_values('总得分', ascending=False).head(10) # 按照总分排序,取前10个
top10_by_category = pd.concat([df.groupby(category)['总得分'].sum().sort_values(ascending=False).head(10) for category in ['区块链', '人工智能', '设计与艺术', '金融与经济', '文化与传媒', '生命科学']]) # 分别按照6大项计算总分,排序取前10个
print(f"按学号排序的前十名:\n{top10_by_ID}")
print(f"按总分排序的前十名:\n{top10_by_item}")
print(f"按6大项总分排序的前十名:\n{top10_by_category}")

# 题目4:分析平均得分最高和最低的项目
avg_score_by_item = df.groupby('项目名称')['总得分'].mean() # 按照项目名称计算平均分
highest_item = avg_score_by_item.idxmax() # 找到平均分最高的项目
lowest_item = avg_score_by_item.idxmin() # 找到平均分最低的项目
print(f"平均得分最高的项目是:{highest_item},平均分为:{avg_score_by_item[highest_item]:.2f}")
print(f"平均得分最低的项目是:{lowest_item},平均分为:{avg_score_by_item[lowest_item]:.2f}")

# 题目5:按照学号顺序画出6个大项的得分曲线
score_by_category = df.groupby(['学号', '类别'])['总得分'].sum().unstack() # 按照学号和类别计算总分,并转换为宽格式
score_by_category.loc['your_student_id'].plot(kind='line') # 替换your_student_id为你的学号


# 题目6: 统计6个大项和总分的得分分布,并画图
# 统计各大和总分的得分分布
df[['语文', '数学', '英语', '物理', '化学', '生物', '总分']].plot(kind='hist', subplots=True, layout=(3, 3), bins=20)
# 绘制总分的密度曲线
df[['总分']].plot(kind='density')

# 题目7:按照班级切片可以使用DataFrame的loc、iloc等函数来实现,然后再使用to_csv方法将数据保存到文件。
# 切片
class_1 = df.loc[df['班级']==1]

# 存储到文件
class_1.to_csv('class_1.csv', index=False)

# 题目8:在自己所在班级内重复题目3-6,只需要将班级号改为自己所在的班级即可。
# 按照自己所在班级进行切片
my_class = df.loc[df['班级']=='my_class_number']
# 统计各大项和总分的得分分布
my_class[['语文', '数学', '英语', '物理', '化学', '生物', '总分']].plot(kind='hist', subplots=True, layout=(3, 3), bins=20)
# 绘制总分的密度曲线
my_class[['总分']].plot(kind='density')
# 存储到文件
my_class.to_csv('my_class.csv', index=False)