21.4月3日 项目:学生成绩分析—代码修正并优化使用体验
此部分是完成上节课留下的尾巴
上节课的基础
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import pymysql
import seaborn as sns
def get_database_connection():
connection = pymysql.connect(host='192.168.120.129',
user='xd',
password='123',
db='scores',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
return connection, connection.cursor()
def get_student_scores():
conn, cursor = get_database_connection()
try:
cursor.execute("select * from student_scores;")
# 一次性获取所有结果
data = cursor.fetchall()
# 将数据转换为 DataFrame
df = pd.DataFrame(data)
# 将"-4"替换为NaN
df.replace(-4, np.nan, inplace=True)
df.dropna(inplace=True)
return df
finally:
conn.close() # 关闭连接
def draw_kde(nj,bj):
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(8, 6))
plt.xlabel('期中语文成绩')
plt.ylabel('密度')
plt.title('期中语文成绩分布图')
plt.xlim(0,100)
# 绘制核密度估计曲线
sns.kdeplot(
data=nj,
x="mid_term_chinese",
label="语文期中考试成绩" ,
color="blue",
)
sns.kdeplot(
data=bj,
x="mid_term_chinese",
label="23401班语文期中考试成绩" , # 设置图例标签
color='red',
linestyle="--", # 虚线
alpha=0.5,
)
# 绘制实际数据分布
sns.rugplot(
data=nj,
x="mid_term_chinese",
height=0.05, # 控制 rug plot 的高度
color="blue",
)
sns.rugplot(
data=bj,
x="mid_term_chinese",
height=0.08, # 控制 rug plot 的高度
color="red",
alpha=0.5,
)
nj_mean=nj['mid_term_chinese'].mean()
bj_mean=bj['mid_term_chinese'].mean()
plt.axvline(nj_mean, color="blue",linestyle=":")
plt.text(nj_mean+2,0.022, '年级语文平均成绩:%.1f' %(nj_mean),color="blue",)
plt.axvline(bj_mean, color="red",linestyle=":")
plt.text(bj_mean+3,0.024, '23401语文平均成绩:%.1f' %(bj_mean),color="red",)
plt.grid(True)
plt.show()
df = get_student_scores()
mid_chinese=df[['class','name','mid_term_chinese']]
mid_chinese_23401=mid_chinese[mid_chinese['class']=='23401']
draw_kde(mid_chinese,mid_chinese_23401)
本次课程需要,使得代码能够灵活的选择绘制班级。并且能将图片进行存储。
本课需要实现的功能
通过用户输入决定程序响应
通过用户输入决定程序响应
使用python的questionary库
questionary库介绍
questionary 是一个用于创建命令行交互式提示的 Python 库。它提供了一种简单而强大的方式来与用户进行交互,并从用户那里获取输入。下面是一些 questionary 库的特点和功能:
-
简单易用:
questionary提供了一个直观的 API,使得创建各种类型的交互式提示变得非常简单。 -
多种类型的问题:它支持多种类型的问题,包括选择题、多选题、文本输入、密码输入等。
-
丰富的选项:对于每种类型的问题,您都可以指定许多选项,例如选项列表、默认值、验证器等。
-
自定义外观:您可以自定义提示的外观,包括提示文字、选项的样式等,以便与您的应用程序风格相匹配。
步骤一:引入库
需要安装,下载库:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xxxxxxx
from questionary import select
步骤二:创建选择
question = select("选择分析的班级:", choices=["23401", "23402", "23403"])
步骤四:获取用户选择
choice_class = question.ask()
print("您选择的班级是:", choice_class)
步骤五:根据选择,调整整个代码
draw_kde函数当前存在一定问题,其中的label显示的文本是固定死的,需要随着选项进行改变。
修改draw_kde函数,使其支持显示选项改变
主程序部分:
draw_kde(mid_chinese, mid_chinese_23401,choice_class)
函数修改:
def draw_kde(nj, bj,class_name):
# ......
sns.kdeplot(
data=bj,
x="mid_term_chinese",
label=class_name+"班语文期中考试成绩", # 设置图例标签
color='red',
linestyle="--", # 虚线
alpha=0.5,
)
# ......
plt.text(bj_mean + 3, 0.024, class_name+'班语文平均成绩:%.1f' % (bj_mean), color="red", )
# ......
步骤六:结果保存
当程序调试完成后,不再显示图片(显示图会影响程序执行效率)
改为将图片进行保存。
使用plt.savefig()实现,很简单括号里放路径和文件名
# plt.show()
plt.savefig(class_name+'.png')
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 现代职校董良
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果