1.1項目完成的功能與特點html
(1)功能:對2016—2018課程的平時、期中、期末三個不一樣的分數進行數據清洗和分析,最後以合適的柱狀圖、折線圖、餅圖等方式表示出來並在網頁上渲染html5
(2)特點:圖表可以清晰得呈現不一樣分數得高低,一目瞭然得看出最高分、最低分、平均分,觀察圖表的人可以迅速得獲取本身所想要的信息,經過圖的呈現可以很快發現本身班級的分數差距,清楚得掌握班級分數得差距。python
2、各模塊詳細描述(名稱,功能,運行截圖,關鍵源代碼)json
(1):對數據的清洗flask
self.data=xlrd.open_workbook(filedata)app
table=self.data.sheet_by_index(0)#獲取2016年的表echarts
nrows=table.nrows#獲取總行數框架
ncols=table.ncols#得到總列數dom
zero=table.col_values(0)#得到第一列的值工具
one=table.col_values(1)
two=table.col_values(2)
three=table.col_values(3)
five=table.col_values(4)#得到第四列的值
zero.pop(0)#去掉第一行
one.pop(0)#去掉第二行
two.pop(0)#去掉第三行
three.pop(0)#去掉第四行
five.pop(0)#去掉第五行
for i in zero:
if i not in self.class_list:
self.class_list.append(i)
list1=[]
for e in range(0,len(zero)):
#print(zero1[e],five1[e])
if five[e]!='缺考\xa0':
list1.append(zero[e])
list1.append(one[e])
list1.append(two[e])
list1.append(three[e])
list1.append(five[e])
self.data2016_list1.append(list1) # 存2016年表格得所有數據[[班級,性別,平時,期中,總評]],列表套列表
list1=[]
table=self.data.sheet_by_index(1)#得到2017年
nrows=table.nrows#獲取總行數
ncols=table.ncols#得到總列數
zero1=table.col_values(0)#得到第一列的值
one1=table.col_values(1)
two1=table.col_values(2)
three1=table.col_values(3)
five1=table.col_values(4)#得到第四列的值
zero1.pop(0)#去掉第一行
one1.pop(0)#去掉第二行
two1.pop(0)#去掉第三行
three1.pop(0)#去掉第四行
five1.pop(0)#去掉第五行
for i in zero1:
if i not in self.class_list1:
self.class_list1.append(i)
for e in range(0,len(zero1)):
if five1[e]!='缺考\xa0':
list1.append(zero1[e])
list1.append(one1[e])
list1.append(two1[e])
list1.append(three1[e])
list1.append(five1[e])
self.data2017_list1.append(list1)
list1=[]
table=self.data.sheet_by_index(2)#獲取2018年的表
nrows=table.nrows#獲取總行數
ncols=table.ncols#得到總列數
zero2=table.col_values(0)#得到第一列的值
one2=table.col_values(1)
two2=table.col_values(2)
three2=table.col_values(3)
five2=table.col_values(4)#得到第四列的值
zero2.pop(0)#去掉第一行
one2.pop(0)#去掉第二行
two2.pop(0)#去掉第三行
three2.pop(0)#去掉第四行
five2.pop(0)#去掉第五行
for i in zero2:
if i not in self.class_list2:
self.class_list2.append(i)
for e in range(len(zero2)):
if five2[e]!='缺考\xa0':
list1.append(zero2[e])
list1.append(one2[e])
list1.append(two2[e])
list1.append(three2[e])
list1.append(five2[e])
self.data2018_list1.append(list1)
list1=[]
(2):2016年各班級平均分,柱狀圖
list1=[]
score_list=[]
for i in range(len(self.class_list)):
sum1=0
count=0
score=[]
for j in range(len(self.data2016_list1)):
if self.class_list[i] in self.data2016_list1[j]:
sum1=sum1+int(self.data2016_list1[j][4])
count=count+1
if count>0:
avg=int(sum1/count)
score.append(self.class_list[i])
score.append(avg)
score_list.append(score)
avg_list=[]
for i in range(len(score_list)):
avg_list.append(score_list[i][1])
bar=Bar("標題:2016年各班級平均分","副標題:柱狀圖")
bar.add("圖注:分數(分)",self.class_list,avg_list)
bar.render('2016年各班級平均分.html')
(3):2017年各班級平均分柱狀圖
list1=[]
score_list2=[]
for i in range(len(self.class_list2)):
sum1=0
count=0
score2=[]
for j in range(len(self.data2018_list1)):
if self.class_list2[i] in self.data2018_list1[j]:
sum1=sum1+int(self.data2018_list1[j][4])
count=count+1
if count>0:
avg=float(sum1/count)
score2.append(self.class_list2[i])
score2.append(avg)
score_list2.append(score2)
avg_list2=[]#存放算出來的平均數
for i in range(len(score_list2)):
avg_list2.append(score_list2[i][1])
bar=Bar("標題:2018年各班級平均分","副標題:柱狀圖")
bar.add("圖注:分數(分)",self.class_list2,avg_list2)
bar.render('2018年各班級平均分柱狀圖.html')
(4):不一樣整體平均分狀況柱狀圖
self.sheet_list =self.data.sheet_names()#得到表名字,2016級,2017,2018三個
#print(sheet_list)
list2=[]
sum1=0
count=0
for e in self.data2016_list1:
if e:
sum1+=int(e[4])
count+=1
list2.append(int(sum1/count))
sum1=0
count=0
for e in self.data2017_list1:
if e:
sum1+=int(e[4])
count+=1
list2.append(int(sum1/count))
sum1=0
count=0
for e in self.data2018_list1:
if e:
sum1+=int(e[4])
count+=1
list2.append(int(sum1/count))
bar=Bar("標題:不一樣年份整體平均分狀況","副標題:柱狀圖")
bar.add("圖注:分數(分)",self.sheet_list,list2)
bar.render('不一樣整體平均分狀況.html')
(5):2016-2018男女平生時分平均成績折線圖
line=Line('2016-2018男女平生時分平均成績','折線圖')
line.add("女平生時分平均分數(分)",self.sheet_list,avglist1,is_label_show=True)
line.add("男平生時分平均分數(分)",self.sheet_list,avglist4,is_label_show=True)
line.render('2016-2018男女平生時分平均成績折線圖.html')
(6):2016年平時、期中、期末餅狀圖
pie = Pie("餅狀圖", "2016年平時、期中、期末餅狀圖",title_pos='center',width=900)
#上方的colums選項取消顯示,顯示label標籤
pie.add("2016年各個項目,courselist,avglist11 ,is_legend_show=False,is_label_show=True)
#保存圖表
pie.render('2016年各項平均分餅狀圖.html')
(7):2016年男女生總評堆積柱狀圖
bar = Bar("2016年男女生總評堆積柱狀圖")
bar.add("男生", self.sheet_list, avglist3, is_stack=True)
bar.add('女生', self.sheet_list, avglist6, is_stack=True)
bar.render('2016年男女生總評堆積柱狀圖.html')
(8):2016—2018年女平生時、期中、總評成績柱狀圖、顯示最大值和最小值、平均分數線
data1 = [12,13,14,25,67]
data2 = [34,56,78,45,67]
labels = ['A', 'B', 'C', 'D', 'E']
bar=Bar("標題:2016年女生各項平均成績","副標題:標記和點柱狀圖")
bar.add('平時', self.sheet_list, avglist1, mark_point=['average'])
bar.add('期中', self.sheet_list, avglist2, mark_point=['max'], mark_line=['min', 'max'])
bar.add('總評', self.sheet_list, avglist3)
bar.render('2016年女生成績標記和點柱狀圖.html')
(9):2016男生各項平均成績玫瑰花樣式餅圖
pie2 = Pie("2016男生各項平均成績玫瑰花樣式餅圖", title_pos='center', width=900)
pie2.add("2016男生", courselist, avglist41,is_random=True, radius=[25, 60], rosetype='area', is_legend_show=False, is_label_show=True)
pie2.show_config()
pie2.render('2016男生各項平均成績玫瑰花樣式餅圖.html')
(10):2016-2018年男生各項平均成績時間軸餅圖
pie_1 = Pie("2016年男生各項平均成績")
pie_1.add("男生", courselist, avglist41,is_label_show=True, radius=[30, 55], rosetype='radius')
pie_2 = Pie("2017年男生各項平均成績")
pie_2.add("男生", courselist,avglist51,is_label_show=True, radius=[30, 55], rosetype='radius')
pie_3 = Pie("2018年男生各項平均成績")
pie_3.add("男生", courselist,avglist61,is_label_show=True, radius=[30, 55], rosetype='radius')
timeline = Timeline(is_auto_play=True, timeline_bottom=0)
timeline.add(pie_1, '2016 年')
timeline.add(pie_2, '2017 年')
timeline.add(pie_3, '2018 年')
timeline.render('2016-2018年男生各項平均成績時間軸餅圖.html')
(11):網頁渲染:
from flask import Flask, jsonify, render_template, request, url_for
from werkzeug.utils import redirect
app = Flask(__name__)
@app.route("/index")
def index():
return render_template("index.html")
@app.route("/gra", methods=['GET', 'POST'])
def getValues():
text = request.form.get('課程成績')
if text == '課程成績1':
return render_template("2016年各班級平均分.html")
elif text=='課程成績2':
return render_template("2017年各班級平均分柱狀圖.html")
elif text=="課程成績3":
return render_template("2018年各班級平均分柱狀圖.html")
elif text=="課程成績4":
return render_template("不一樣整體平均分狀況.html")
elif text=="課程成績5":
return render_template("2016-2018男女平生時分平均成績折線圖.html")
elif text=="課程成績6":
return render_template("2016男生各項平均成績玫瑰花樣式餅圖.html")
elif text=="課程成績7":
return render_template("2016年各項平均分餅狀圖.html")
elif text=="課程成績8":
return render_template("2016年女生成績標記和點柱狀圖.html")
elif text=="課程成績9":
return render_template("2016年男女生總評堆積柱狀圖.html")
elif text=="課程成績10":
return render_template("2016-2018年男生各項平均成績時間軸餅圖.html")
else:
return "不存在"
if __name__ == '__main__':
app.run(host='127.9.9.7', port=8888, debug=True)
3、運用到的知識
(1)運用flask框架、python語言、html5語言。
(2)Numpy:加強了Python的科學計算和數據處理能力。
(3)Matplotlab:專業畫圖工具
(4)Pandas:爲數據的讀取、數據清洗、數據快速分析提供強大的便捷。
(5)pyecharts:可將圖表生成html文件,直接用於交互式的頁面可視化,也能夠生成Jupyter Notebook格式。將數據清晰得展現出來。