1 在sqlite中新建一个数据库data.db 2 在data.db中新建表score 3 将dafen.txt中数据输入到score中 4 建立一个python文件statistic.py,其具有以下功能:
A 连接数据库data.db,读取其中表score中的数据到列表; B 通过numpy.std(a, axis=None),计算每个裁判员的标准差,输出标准差最大的前3个裁判员的序号; C 利用matplotlib…pyplot中的polt和scatter的方法绘制曲线图和散点图在同一坐标内。
代码:
#使用sqlite3模块链接和操作SQLite数据库
#步骤一:导入相应的数据库模块和画图软件模块
import sqlite3,numpy
import matplotlib.pyplot as plt
def connection_database():#连接数据库函数并插入数据
#步骤一:导入相应的数据库模块
# 步骤二:建立数据库连接,返回Connection对象 这里我创建的数据库叫做db1.db
#1.如果数据库存在,则访问数据可 2.数据库如果不存在,则在对应的路径下,建立一个名叫db1.db数据库
#这里连接数据库时,数据库还没有创建,则创建数据库
con = sqlite3.connect(r"路径/数据库名称")
# 步骤三:直接使用连接对象con执行connection对象中的方法
#创建一个score1表 sportman_ID 表示 运动员序号 judgei 表示 裁判序号
con.execute(
"create table score1(sportman_ID primary key ,judge1,judge2,judge3,judge4,judge5,judge6,judge7,judge8,judge9,judge10,judge11,judge12)")
#这返回游标cur 和 连接对象con
#调用数据处理函数
lis = processing_data()
# 这里在score1表中插入多行数据 sportman_ID 表示 运动员序号 judgei 表示 裁判序号
con.executemany(
"insert into score1(sportman_ID,judge1,judge2,judge3,judge4,judge5,judge6,judge7,judge8,judge9,judge10,judge11,judge12) values (?,?,?,?,?,?,?,?,?,?,?,?,?)",
lis)
# 提交
con.commit()
def processing_data():#读取文件并处理数据函数
# 读入文件
f = open("dafen.txt", 'r')
# 将文件存储在lis列表中
lis = []
for line in f:
# 使用map函数将每一行分数中的每个分数转化为float类型,然后在转化成list类型赋值给 l
l = list(map(float, line.split()))
lis.append(l)
for i in range(10):# 这里在每一个运动员成绩的第一个位置插入运动员自己的编号
lis[i].insert(0, i + 1) #这里插入数据是为了直观的反应每个运动员的分数
return lis
def read_database():#读取数据库里面的数据 函数
#这里连接数据库时,db1.db数据库已经建立了,则直接打开数据库
con = sqlite3.connect(r"路径/数据库名称")
#查询数据返回 存储在 lis1列表中中
lis1=list(con.execute("select sportman_ID,judge1,judge2,judge3,judge4,judge5,judge6,judge7,judge8,judge9,judge10,judge11,judge12 from score1 "))
#建立一个judge_score二维数组用来裁判员打的分数
judge_score = [[0] * 10 for i in range(12)]
#原始数据中,同一个裁判对不同运动员打的分数是一列一列的
#这两个for循环是为了将 一列的分数 转化为 一行的分数,
#做这一步是为了下面直接调用numpy里面的求标准差的函数
for i in range(12): # 裁判
for j in range(10): # 分数
judge_score[i][j] = lis1[j][i + 1]
#返回数据
return judge_score
def standard_deviation(): #求标准差函数
#调用 读取数据库里面的数据 函数
judge = read_database()
# 存放每个裁判的标准差和裁判的序号
standard_sort = [] # 列表中的元素时元组类型 (a,b) a是裁判序号 b是裁判的标准差 ,这个为了排序
standard_plot = [] # 这个列表是为了画图用
for i in range(10):
standard_plot.append(round(numpy.std(judge[i], ddof=1), 3))
standard_sort.append((i, round(numpy.std(judge[i], ddof=1), 3)))
#调用sort 函数 降序排列
standard_sort.sort(key=lambda x:x[1],reverse = True)
return standard_plot,standard_sort
def plot():#画图函数
# 解决坐标轴中文乱码问题
standard_plot,standard_sort = standard_deviation()
for i in range(10):
print("第{0:3}名 {1:4}号裁判 标准差:{2:5.2f}".format(i+1,standard_sort[i][0]+1,standard_sort[i][1]))
xlist =[] # x 轴坐标的取值
for i in range(1,11):
xlist.append(i)
# 解决坐标轴中文乱码问题
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'SimHei'
# 设置坐标轴标签
plt.xlabel("裁判序号")
plt.ylabel("标准差")
plt.plot(xlist, standard_plot)
plt.scatter(xlist, standard_plot)
plt.show()
if __name__=="__main__":
connection_database()
read_database()
standard_deviation()
plot()
我这个代码从数据库的建立,数据的输入,数据的读取,求标准差,画图都是在代码中实现的。
这段代码中的“路径/数据库名”,自己当时的情况所建立
con = sqlite3.connect(r"路径/数据库名称")
在数据库中插入多行数据时,这里注意一点,自己在建立数据库时,创建表的时候,自己创建了多少个字段名,values后面就要加多少个问好。我在创建字段的时候一共创建了13个字段,所以我后面一共有13个问号。
con.executemany(
"insert into score1(sportman_ID,judge1,judge2,judge3,judge4,judge5,judge6,judge7,judge8,judge9,judge10,judge11,judge12) values (?,?,?,?,?,?,?,?,?,?,?,?,?)",
lis)
画图时,在给坐标轴添加标签时,要注意中文乱码的问题
# 解决坐标轴中文乱码问题
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'SimHei'
# 设置坐标轴标签
plt.xlabel("裁判序号")
plt.ylabel("标准差")
这段代码我是直接输出了所有裁判标准差的排序
for i in range(10):
print("第{0:3}名 {1:4}号裁判 标准差:{2:5.2f}".format(i+1,standard_sort[i][0]+1,standard_sort[i][1]))
结果:
数据库
结果
总结
仅供参考!欢迎大家批评指正!!!!