プロジェクトの1.1の機能と特長完了
(1)機能:2016から2018三つの異なるスコア通常もちろん、期間、データ分析および洗浄の終わり、適切な最終のヒストグラム、折れ線グラフ、円グラフなど、およびレンダリングされたウェブページ上に表示
(2)特徴:チャートは明らかに一目で最高スコア、最低スコア、平均スコアを見ることが、低すぎる異なるスコアを表示することができ、プレゼンテーションがすぐにマッピングすることができますを通じて1は、すぐに彼らが望む情報を入手して、チャートを観察することができます彼のクラスとの点数差を見つけ、明らかに私たちは、マスタークラスに点数差を持っていました。
第二に、各モジュールの詳細な説明(名前、機能、操作テーマ、キーソースコード)
(1):データのクリーニング
self.data = xlrd.open_workbook(FILEDATA)
テーブルのテーブル= self.data.sheet_by_index(0)#2016取得
NROWS = table.nrows#行数を取得します。
ncolsの= table.ncols#列の合計数を取得します
ゼロ= table.col_values(0)#GET最初の列の値
1 = table.col_values(1)
2 = table.col_values(2)
3 = table.col_values(3)
5 = table.col_values(4)#GET第4列の値
zero.pop(0)#は、最初の行を削除します
one.pop(0)#2行目から削除します
two.pop(0)#三行除去
three.pop(0)#4行除去
(0)five.pop#5番目の行を削除
ゼロで私がのために:
私ではないself.class_listであれば:
self.class_list.append(I)
LIST1 = []
範囲のE(0、lenの(ゼロ))のために:
#print(ZERO1 [E]、five1 [E])
5 [E] = '不在\ XA0' もし!:
list1.append(ゼロ[E])
list1.append(1 [E])
list1.append(2 [E])
list1.append(3 [E])
list1.append(5 [E])
self.data2016_list1.append(リスト1)#2016フォームは、すべてのデータ[[クラス、性別、平時、期間、総合評価]]、リストセットリストを堆積させる必要があります
LIST1 = []
2017年に得られた表= self.data.sheet_by_index(1)#
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)#4番目のカラムの値を取得します
zero1.pop(0)#は、最初の行を削除します
one1.pop(0)#2行目から削除します
two1.pop(0)#三行除去
three1.pop(0)#4行除去
(0)five1.pop#5番目の行を削除
ZERO1で私がのために:
私ではないself.class_list1であれば:
self.class_list1.append(I)
範囲のE(0、lenの(ZERO1))のために:
[E] = '不在\ XA0' !: five1場合
list1.append(ZERO1 [E])
list1.append(one1 [E])
list1.append(two1 [E])
list1.append(three1 [E])
list1.append(five1 [E])
self.data2017_list1.append(リスト1)
LIST1 = []
表= 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)#4番目のカラムの値を取得します
zero2.pop(0)#は、最初の行を削除します
one2.pop(0)#2行目から削除します
two2.pop(0)#三行除去
three2.pop(0)#4行除去
(0)five2.pop#5番目の行を削除
ZERO2で私がのために:
私ではないself.class_list2であれば:
self.class_list2.append(I)
範囲内の電子のために(LEN(ZERO2)):
[E] = '不在\ XA0' !: five2場合
list1.append(ZERO2 [E])
list1.append(one2 [E])
list1.append(two2 [E])
list1.append(three2 [E])
list1.append(five2 [E])
self.data2018_list1.append(リスト1)
LIST1 = []
(2)各クラスの2016年平均、棒グラフ
LIST1 = []
score_list = []
私のための範囲内(LEN(self.class_list)):
SUM1 = 0
カウント= 0
スコア= []
範囲内のJ(LEN(self.data2016_list1))のために:
self.class_list場合は[I]でself.data2016_list1 [J]:
SUM1 = SUM1 + INT(self.data2016_list1 [J] [4])
カウント= + 1カウント
数> 0の場合:
平均= INT(SUM1 /回数)
score.append(self.class_list [i])と
score.append(平均)
score_list.append(スコア)
avg_list = []
私のための範囲内(LEN(score_list)):
avg_list.append(score_list [I] [1])
バー=バー(「タイトル:各クラスの2016は平均、」「字幕:ヒストグラム」)
bar.add( "伝説:スコア(点数)"、self.class_list、avg_list)
bar.render( '各クラスの平均.htmlのため2016年)
(3)各クラスのための2017年の平均ヒストグラム
LIST1 = []
score_list2 = []
私のための範囲内(LEN(self.class_list2)):
SUM1 = 0
カウント= 0
score2 = []
範囲内のJ(LEN(self.data2018_list1))のために:
self.class_list2場合は[I]でself.data2018_list1 [J]:
SUM1 = SUM1 + INT(self.data2018_list1 [J] [4])
カウント= + 1カウント
数> 0の場合:
平均=フロート(SUM1 /回数)
score2.append(self.class_list2 [i])と
score2.append(平均)
score_list2.append(score2)
記憶された計算された平均のavg_list2 = []#
iの範囲内(LEN(score_list2)):
avg_list2.append(score_list2 [I] [1])
バー=バー(「タイトル:各クラスの2018年には平均的な、」「字幕:ヒストグラム」)
bar.add( "伝説:スコア(点数)"、self.class_list2、avg_list2)
bar.render(「各クラス.htmlのための2018年の平均ヒストグラム」)
(4):異なる全体の平均ヒストグラムポイント
self.sheet_list = self.data.sheet_names()#GETテーブル名、2016、2017,2018 3
#print(sheet_list)
LIST2 = []
SUM1 = 0
カウント= 0
self.data2016_list1での電子のために:
Eの場合:
SUM1 + = INT(E [4])
カウント+ = 1
list2.append(int型(SUM1 /回数))
SUM1 = 0
カウント= 0
self.data2017_list1での電子のために:
Eの場合:
SUM1 + = INT(E [4])
カウント+ = 1
list2.append(int型(SUM1 /回数))
SUM1 = 0
カウント= 0
self.data2018_list1での電子のために:
Eの場合:
SUM1 + = INT(E [4])
カウント+ = 1
list2.append(int型(SUM1 /回数))
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)
三、运用到的知识
(1)运用flask框架、python语言、html5语言。
(2)Numpy:增强了Python的科学计算和数据处理能力。
(3)Matplotlab:专业画图工具
(4)Pandas:为数据的读取、数据清洗、数据快速分析提供强大的便捷。
(5)pyecharts:可将图表生成html文件,直接用于交互式的页面可视化,也可以生成Jupyter Notebook格式。将数据清晰得展示出来。