主要实现从mysql数据库中取出想要的数据进行平均值计算,然后将取出的数据按特定字段分组后重新插入数据库中。复杂的问题可以先从简单点一步一步实现,拆解完成。
import pymysql
from pymysql import *
import pandas as pd
def select_data(sql, dict_data=True, host='xx',
port=8088, database='stuDatas', user='root', password='xx'):
try:
if dict_data:
conn = connect(host=host,
port=port,
database=database,
user=user,
password=password,
charset='utf8',
cursorclass=cursors.DictCursor,
)
else:
conn = connect(host=host,
port=port,
database=database,
user=user,
password=password,
charset='utf8',
# cursorclass=cursors.DictCursor,
)
with conn.cursor() as cur:
cur.execute(sql)
results = cur.fetchall()
conn.commit()
return results
except Exception as e:
return e
def get_conn():
conn = pymysql.connect(host='xxx', port=8088, user='root', passwd='xx', db='stuDatas', charset='utf8')
return conn
def insert(cur, sql, args):
cur.executemany(sql, args)
#将文件写入DB中
def fileToDb(dataList,dbTableName):
conn = get_conn()
cur = conn.cursor()
n = len(dataList[0])
str_s = ','.join(['%s' for _ in range(n)])
sql = 'insert into {} values({})'.format(dbTableName,str_s)
insert(cur, sql=sql, args=dataList)
conn.commit()
cur.close()
conn.close()
def get_insert(week):
sql1 = '''select grade_code,subject_code,avg(exam_score),avg(fb_interaction_num),avg(knowledge_answer_num)
,avg(knowledge_num),avg(knowledge_score_rate),avg(tutor_ask_num)
,avg(zy_score_rate),avg(answer_right_rate),avg(class_right_rate),avg(selflearning_true_rate)
from studentDatas
where week = "{}"
group by grade_code,subject_code '''
sql1 = sql1.format(week)
#print(sql1)
data = select_data(sql1)
#print(data)
df = pd.DataFrame(data,index=None)
df.columns = ['ave_answer_right_rate','ave_class_right_rate','ave_exam_score','ave_fb_interaction_num','ave_knowledge_answer_num','ave_knowledge_num','ave_knowledge_score_rate','ave_selflearning_true_rate','ave_tutor_ask_num','ave_zy_score_rate','grade_code','subject_code']
#df.head(5)
##将df中的Nan替换成none
#df = df.where(df.notnull(), None)
#将df格式的数据转化为list格式
dataList = df.values.tolist()
##### 注意 表不能加主键 另外df文件有列名,表中也要对应写好列名
fileToDb(dataList,'stu_in_teacher_ave_fin')
单条数据测试:
sql1 = '''select grade_code,subject_code,avg(exam_score),avg(fb_interaction_num),avg(knowledge_answer_num)
,avg(knowledge_num),avg(knowledge_score_rate),avg(tutor_ask_num)
,avg(zy_score_rate),avg(answer_right_rate),avg(class_right_rate),avg(selflearning_true_rate)
from studentDatas
where week = '2018-31'
group by grade_code,subject_code '''
data = select_data(sql1)
df = pd.DataFrame(data,index=None)
df.head(5)
取出周列表
sql0 = 'select distinct(week) from studentDatas'
dataweek = select_data(sql0)
dfweek = pd.DataFrame(dataweek,index=None)
weekList = dfweek.values.tolist()
循环遍历周然后查找出来插入进去
for week in weekList:
get_insert(week[0])