学生成绩操作

知识学习

iloc[]函数

作用

iloc函数是对数据进行位置索引,从而在数据表中提取出对应的数据。

使用

  1. df.iloc[a, b],其中a是行索引,b是列索引。
  2. df.iloc[a:b, c],取行索引a->b-1,列索引为c的所有数据,注意:这里的a:b是左闭右开
  3. df.iloc[a],取行索引为a,所有列索引的数据。
  4. iloc[].values,用values属性取值,返回ndarray,但是单个数值无法用values函数读取。

flatten参数

  • 对多维数据的降维函数。
  • 默认缺省参数是0。
  • python里的flatten(dim)表示,从第dim个维度开始展开,将后面的维度转化为一维.也就是说,只保留dim之前的维度,其他维度的数据全都挤在dim这一维。
  • 比如一个数据的维度是( S 0 , S 1 , S 2… , S n ) (S0,S1,S2…,Sn)(S0,S1,S2…,Sn), flatten(m)后的数据为( S 0 , S 1 , S 2 , . . . , S m − 2 , S m − 1 , S m ∗ S m + 1 ∗ S m + 2 ∗ . . . ∗ S n ) (S0,S1,S2,…,Sm-2,Sm-1,SmSm+1Sm+2*…*Sn)(S0,S1,S2,…,Sm−2,Sm−1,Sm∗Sm+1∗Sm+2∗…∗Sn)

linspace

通过定义均匀间隔创建数值序列。

np.linspace(start = , stop = , num = ,endpoint = )

需要指定间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);最终函数返回间隔类均匀分布的数值序列。
其中endpoint表示是否包含结尾值,缺省时为true,表示包含。

plt.figure()

figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
  • num:图像编号或名称,数字为编号 ,字符串为名称
  • figsize:指定figure的宽和高,单位为英寸;
  • dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
  • facecolor:背景颜色
  • edgecolor:边框颜色
  • frameon:是否显示边框

polar

polar(theta, r, **kwargs)
参数含义
theta每个标记所在射线与极径的夹角
r每个标记到原点的距离
marker标记点样式
markersize(ms)标记点的大小
markerfacecolor(mfc)标记点的填充颜色
markeredgecolor(mec)标记点的边界颜色
color线条颜色
linestyle(ls)ls=‘None’: 线条不显示
ls=‘None’: 线条不显示线条粗细

plt.thetagrids()

获取当前极坐标图上的theta网格线

plt.thetagrids(angles, labels=None,fmt=None, **kwargs)
  • Angles:
    将角度设置为theta网格的位置(这些网格线沿theta尺寸相等)

  • abels:如果不是None,则为len(angles)或在每个角度使用的标签字符串列表。如果标签为None,则标签为fmt%angle。

  • frac:它是极坐标半径在标签位置的分数(1是边)。例如1.25在轴外,而0.75在轴内。
    返回类型:返回值是元组列表(行,标签)

fill

fill函数的功能是根据结点之间连线的封闭区域绘制多边形。

matplotlib.pyplot.fill(*args, data=None, **kwargs)
  • *args:根据x,y位置确定结点绘制多边形,可添加一个可选的颜色标记。数据结构为x, y, [color]序列,支持多组x, y, [color]序列。必备参数。
plt.fill(x, y)                   
plt.fill(x, y, "b")               
plt.fill(x, y, x2, y2)           
plt.fill(x, y, "b", x2, y2, "r") 
  • data:带标签的数据对象。可索引对象。可选参数。
    例如:plt.fill(“time”, “signal”, data={“time”: [0, 1, 2], “signal”: [0, 1, 0]})
  • kwargs:matplotlib.patches.Polygon对象的相关属性。

nlargest()

df.nlargest()是一个DataFrame的方法,用于返回DataFrame中最大的n个值所在的行。

df.nlargest(n, columns, keep='first')

参数说明:

  • n:要返回的最大值的数量。
  • columns:用于排序的列名或列名列表
  • keep:指定如何处理具有相同值的行,默认值为’first’,表示保留第一个出现的行,如果这是为‘last’,则保留最后一个出现的行。
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom', 'Nick', 'John'],
        'Age': [20, 25, 30, 35, 40, 45],
        'Score': [90, 85, 80, 95, 90, 85]}
df = pd.DataFrame(data)
top_3_scores = df.nlarge(3, 'Score')
'''
输出结果
   Name  Age  Score
3   Tom   35     95
0   Tom   20     90
4  Nick   40     90
这里输出了前三个同学的分数,这里是按照score来进行排序的。keep是默认值,会保留第一个出现的行。
'''

柱状图 - plt.bar

柱状图实际上是用来表示分组(或离散)变量的可视化。

plt.bar(x, y, width, color, edgecolor, bottom, linewidth, align, tick_label, align)

参数说明:

  • x:指定x轴上的数值
  • y:指定y轴上的数值
  • width:表示柱状图的宽度,取之在0~1之间,默认值为0.8
  • color:柱状图的填充色
  • edgecolor:柱状图的边框颜色
  • bottom:柱状图底部离横轴的距离
  • linewidth:柱状图边框宽度
  • tick_label:柱状图的刻度标签,也可直接将标签赋值给x
  • align:指定x轴上对齐方式,‘center’'elge’边缘

plt.text

plt.text()函数允许我们在图表的指定位置添加文本标签。无论是标注数据点、添加图例说明还是进行图表的详细解释。

plt.text(x, y, string, fontsize=None, verticalalignment=None, horizontalalignment=None, **kwargs)

参数说明:

  • x,y:文本标签的坐标位置。
  • string:要显示的文本内容
  • fontsize:字体大小
  • verticalalignment 或 va: 垂直对齐方式(‘top’, ‘center’, ‘bottom’, ‘baseline’ 等)。
  • horizontalalignment 或 ha: 水平对齐方式(‘left’, ‘center’, ‘right’ 等)。

sorte()函数

sorted(iterable, key=None, reverse=False)

参数说明:

  • iterable:表示需要排序的可迭代对象,例如列表、元组、集合等。
  • key:指定一个函数,用于生成排序的比较键。默认为None,表示直接比较元素本身。
  • reverse:一个布尔值,用于指定排序顺序。默认为False,表示升序排序;设置为True,则表示降序排序。

饼图- plt.pie()

plt.pie(sizes, labels, autopct, startangle)

参数说明:

  • sizes:一个包含各个部分大小的列表
  • labels:一个包含各个部分标签的列表
  • autopct:用于在饼图中显示每个部分的百分比标签,'%1.1f%%'表示以浮点数格式显示,保留以为小数,并添加百分号。
  • startangle:指定其实角度,通常使用 90 度仪确保饼图从上方开始。
    其他参数:
    colors: 用于指定各部分的颜色。可以传入一个颜色列表。
    explode: 用于指定是否将某一部分突出显示,以强调它。可以传入一个列表,其中值为0表示不突出,大于0表示突出。
  • shadow: 布尔值,表示是否添加阴影效果。
  • startangle: 起始角度,以度为单位,默认为0度,即从正上方开始。
  • pctdistance: 百分比标签与圆心的距离,默认为0.6,可以调整位置。
  • labeldistance: 标签与圆心的距离,默认为1.1,可以调整位置。
  • autopct: 控制百分比标签的格式。可以使用字符串格式化来自定义显示方式。
  • wedgeprops: 用于指定扇形部分的属性,如边框颜色、边框宽度等。
  • textprops: 用于指定标签文本的属性,如字体大小、字体颜色等。

1.输入任意一个学号,将该学号对应的成绩,通过雷达图显示。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('score.csv')
# print(df.head(5))
student_id = input('请输入学号:')

# 获取指定学号的成绩数据
scores = df[df['学号'] == int(student_id)].iloc[:, 1:].values.flatten().tolist()
# print(scores)

# 科目名称
courses = df.columns[1:]
# 绘制雷达图
data_length = len(courses)
angles = np.linspace(0, 2 * np.pi, data_length, endpoint = False)
scores.append(scores[0])
# print(scores)
angles = np.append(angles, angles[0])

plt.figure(figsize = (6, 6))    
plt.polar(angles, scores, 'rD-', linewidth = 2) # 绘制雷达图
plt.thetagrids(angles[:-1] * 180 / np.pi, courses, fontproperties = 'SimHei', fontsize = 10)
plt.fill(angles, scores, facecolor = 'b', alpha = 0.6)
plt.title(f"学号为{student_id}的成绩雷达图", fontproperties = 'SimHei', fontsize = 14)
plt.show()

2. 统计所有同学的成绩总分,将总分在前6名的同学总分用柱形图显示出来。(纵坐标标签是“总分”,横坐标标签是“学号”,每个柱形上方显示具体的成绩总分)

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_csv('score.csv')
# print(df.head(5))

df['总分'] = df.iloc[:, 1 : 7].sum(axis = 1) # 每一行求和
# print(df['总分'])
top_6 = df.nlargest(6, '总分')

plt.figure(figsize = (10, 4))
plt.bar(top_6['学号'].astype(str), top_6['总分'], color = 'pink')

# 在每个柱形上方显示具体的成绩总分
for i in range(len(top_6['总分'])):
    plt.text(i, top_6['总分'].iloc[i], str(top_6['总分'].iloc[i]), ha = 'center', va = 'bottom')

plt.xlabel('学号')
plt.ylabel('总分')
plt.show()

3.编写程序,输入任意课程名称,统计该课程的各个成绩等级的比例,用饼状图显示。(优秀:90100;良好:8089;中等:7079;及格:6069;不及格:0~59)

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_csv('score.csv')
course_name = input('请输入课程名称:')

# 根据输入的课程名称获取对应的成绩列表
if course_name in df.columns:
    scores = df[course_name]
else:
    print(f'未找到课程{course_name}')
    exit()

grades = {90 : '优秀', 89 : '良好', 79 : '中等', 69 : '及格', 59 : '不及格'}

# 统计各个成绩等级的数量
labels = []
sizes = []

for grade in sorted(grades, reverse = True):#
    # 因为成绩不可能低于0,所以不及格的下限是0
    if grade == 59:
        labels.append(grades[grade])
        sizes.append(scores[scores <= grade].count())
    else:
        labels.append(grades[grade])
        sizes.append(scores[(scores >= grade) & (scores < (grade + 10))].count())

plt.pie(sizes, labels = labels, autopct = '%1.1f%%', startangle = 140, colors = plt.cm.tab20.colors)
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值