需求
现有一批学生成绩,需要分析不同月份各科考试成绩波动情况,根据数据可知,即按照考试月份及考试科目对成绩汇总求平均成绩。


问题解决
根据数据源结构可知,主要难点如下:
- 源数据中的
日期列格式为年/月/日,为便于汇总,需转换为年/月格式。 - 需要按
日期、考试科目对分数进行分组并求均值。 - 需要将分析结果以柱状图的形式进行展示
关键中间结果
读取数据
data = pd.read_excel("考试分数.xlsx")
df = data[['日期','考试科目','分数']]

转换日期
df["日期"]=pd.to_datetime(df["日期"],format='%Y/%m/%d',errors='coerce').dt.to_period('m')

分组汇总
data=df.groupby([df['日期'],df['考试科目']]).agg('mean')

转换分组结果
data=df.groupby([df['日期'],df['考试科目']]).agg('mean').unstack()

data.index
输出:
PeriodIndex(['2013-11', '2013-12', '2014-01', '2014-02', '2014-03', '2014-04',
'2014-05'],
dtype='period[M]', name='日期2', freq='M')
data.columns
输出:
MultiIndex([('分数', '数学'),
('分数', '科学'),
('分数', '阅读')],
names=[None, '考试科目'])
完整代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 设置字体
plt.rcParams['font.family'] = 'simhei'
# 读取数据
data = pd.read_excel("考试分数.xlsx")
df = data[['日期','考试科目','分数']]
# 将日期转换为年-月格式
df["日期"]=pd.to_datetime(df["日期"],format='%Y/%m/%d',errors='coerce').dt.to_period('m')
# 先按年月、考试科目分组数据,再求平均分数
data=df.groupby([df['日期'],df['考试科目']]).agg('mean').unstack().round(2)
# 使用pandas绘制并列柱状图
data.plot(kind='bar')
# 使用matplotlib绘制并列柱状图
# x = np.arange(len(data.index))
# labels = data.index
# plt.xticks(x, labels)
# width = 0.25
# b1=plt.bar(x - width, data['分数','数学'], width, label='1')
# plt.bar_label(b1, label_type='edge',fontsize=8)
# b2=plt.bar(x, data['分数','科学'], width, label='2')
# plt.bar_label(b2, label_type='edge')
# b3=plt.bar(x + width, data['分数','阅读'], width, label='3')
# plt.bar_label(b3, label_type='edge')
plt.show()

博客围绕分析学生成绩波动展开,需求是按考试月份和科目汇总求平均成绩,以分析不同月份各科成绩波动。解决问题时,要转换日期格式、按条件分组求均值,最后用柱状图展示结果,还给出了关键中间结果和完整代码。

被折叠的 条评论
为什么被折叠?



