楊凡 陳豪
摘 要:本文主要是基于采集到的網(wǎng)站招聘數(shù)據(jù),建立起學(xué)歷和地域需求相關(guān)的數(shù)據(jù)表,并且利用pyecharts在flask網(wǎng)站框架中進(jìn)行可視化展示。過程包括用Python代碼搭建flask工程框架,初始化代碼服務(wù)器;建立數(shù)據(jù)對象的模型,寫數(shù)據(jù)庫的連接配置和數(shù)據(jù)庫中的表對應(yīng)并讀取數(shù)據(jù);編寫pyecharts前端整合代碼,導(dǎo)入第三方Javascript插件的離線文件,拆分?jǐn)?shù)據(jù)并展示;最后提出未來預(yù)測新城市某學(xué)歷需求的方案和項目改進(jìn)的愿景。項目中解決的問題和操作的流程,可以為以后的其他類似研究項目提供一些幫助和見解。
關(guān)鍵詞:flask;pyecharts;sklearn;數(shù)據(jù)可視化;數(shù)據(jù)模型
ABSTRACT: Based on the collected recruitment data, this paper establishes a data table related to education and regional needs, and uses pyecharts to display it visually in the framework of flash website. The process includes using Python code to build the flash engineering framework, initializing the code server; establishing the data object model, writing the connection configuration of the database and the corresponding tables in the database, and reading the data; writing the front-end integration code of pyecharts, importing the offline file of the third-party JavaScript plug-in, splitting the data and displaying it; finally, it puts forward a scheme for predicting the educational requirements of a new city in the future And the vision of project improvement. The problems solved in the project and the operation process can provide some help and insights for other similar research projects in the future.
Keywords: flask; pyecharts; sklearn; data visualization; data model
目前,計算機(jī)大數(shù)據(jù)技術(shù)的發(fā)展迅猛使得數(shù)據(jù)有效呈現(xiàn)與展示的需求變得十分迫切,核心數(shù)據(jù)必須要通過友好且充分表達(dá)的可視化手段才能展現(xiàn)出來并指導(dǎo)、預(yù)測人的行為實(shí)踐,完成數(shù)據(jù)展示也才能完成數(shù)據(jù)運(yùn)行的一個閉環(huán)。導(dǎo)師給與的選題,是基于采集到的網(wǎng)站招聘數(shù)據(jù),建立起學(xué)歷和地域需求相關(guān)的可視化展示,并且給出預(yù)測未來某一個城市的某種人才需求的數(shù)量的方案。具體做法,是用Python代碼搭建flask工程框架,寫flask的初始化代碼,建立數(shù)據(jù)對象的模型(Models),寫數(shù)據(jù)庫的連接配置和數(shù)據(jù)庫中的表對應(yīng)并讀取數(shù)據(jù)。編寫pyecharts前端整合代碼,導(dǎo)入第三方Javascript插件的離線文件,拆分?jǐn)?shù)據(jù)并展示。已有的城市和學(xué)歷的數(shù)量,可以作為訓(xùn)練集輸入,借助scikit-learn包進(jìn)行機(jī)器學(xué)習(xí),嘗試讓計算機(jī)為我們預(yù)測某一個城市的某種學(xué)歷需求數(shù)量是多少。
1建立服務(wù)端框架
服務(wù)端框架設(shè)定為一個flask項目,包含:一個靜態(tài)(static)文件夾,用于存放圖片、第三方腳本插件和自己編寫前端腳本;一個模板(templates)文件夾,用于存放模板靜態(tài)網(wǎng)頁來讓flask與數(shù)據(jù)結(jié)合推送到前臺;一個模型(model)文件夾,用于存放數(shù)據(jù)庫的各種連接模型;一個路由(routes)文件夾,存放各種不同的網(wǎng)站路由;網(wǎng)站根目錄下一個配置文件config.py,用于存放各種網(wǎng)站的配置信息config.py文件和一個作為網(wǎng)站的運(yùn)行入口的main.py文件。其中routes文件夾下,需要一個初始化__init__文件作為route模塊的初始化文件,接收main.py的運(yùn)行指令,設(shè)定Flask的初始配置信息,注冊藍(lán)圖(blueprint)信息等操作。
整個項目的結(jié)構(gòu)圖如下所示:
服務(wù)器運(yùn)行從main.py開始,需要從routes模塊(route文件夾)中導(dǎo)入app對象(在__init__.py中),所以要最開始要寫from routes import app;導(dǎo)入charts對象(由charts.py定義),來顯示最后完成的可視化圖表,所以要接著寫from routes import charts;導(dǎo)入pyecharts的偽造數(shù)據(jù)工具,寫上from pyecharts.faker import Faker,并對應(yīng)在打印出偽造數(shù)據(jù)查看輸出效果,寫上print (Faker.choose())和print (Faker. values())兩行。確認(rèn)沒問題后,用代碼啟動服務(wù)器if __name__ == "__main__": app.run("127.0.0.1", port=8080, debug=True)。
在routes模塊中,需要導(dǎo)入Flask構(gòu)造類來初始化唯一的Flask對象app,所以要寫上from flask import Flask;為了連接數(shù)據(jù)庫,要調(diào)用數(shù)據(jù)庫flask內(nèi)置的flask_sqlalchemy組件SQLAlchemy。接下來寫代碼app = Flask("myweb")實(shí)例化全局唯一的app,其中名稱myweb可以自由個性化設(shè)定。接著寫指定app的配置文件的代碼app.config.from_object('config'),有關(guān)于app的復(fù)雜設(shè)定信息可以以參數(shù)賦值的方式寫在config.py當(dāng)中。最后,定義數(shù)據(jù)庫變量db = SQLAlchemy(app) 與app對象關(guān)聯(lián)后,框架的入口部分就完成了,可以開始編寫數(shù)據(jù)庫部分的代碼。
2建立模型取得數(shù)據(jù)
在之前的采集、存儲與分析項目中,我們完成了核心數(shù)據(jù)的抽取,并已經(jīng)成功將其放入MySQL數(shù)據(jù)庫當(dāng)中。數(shù)據(jù)庫的連接信息將寫入config.py文件來供flask項目調(diào)用并拿到數(shù)據(jù)展示。具體做法,就是將SQLALCHEMY_DATABASE_URI="mysql+pymysql://root:123456@ 127.0.0.1:3306/flask?charset=utf8"和SQLALCHEMY_TRACK_MODIFICATION=True兩行數(shù)據(jù)寫入config.py,代碼的意思是連接本地mysql數(shù)據(jù)庫,用戶名root,密碼123456,同時設(shè)定數(shù)據(jù)庫的追蹤修改為True允許。這兩行信息會被上一節(jié)routes的__init__.py文件中編寫的app.config. from_object('config')代碼所獲得并用于連接數(shù)據(jù)庫操作。
在models模塊(models文件夾)下的xueli.py文件,是用來設(shè)定與數(shù)據(jù)庫中具體的數(shù)據(jù)表的鏈接,這也是flask的數(shù)據(jù)庫表讀取的一種特性。首先要取得routes模塊中的與app對象已經(jīng)關(guān)聯(lián)的db對象,所以要寫from routes import db導(dǎo)入db,然后調(diào)用db.Model子模塊作為初始值傳入自己定義的數(shù)據(jù)對象類來生成數(shù)據(jù)對象,在代碼編寫時,有幾個數(shù)據(jù)項就要編寫幾行的成員數(shù)據(jù),具體是6行,class Data(db.Model):定義類頭部傳初值、__tablename__='data1'指定表名、id=db.Col umn(db.Integer, primary_key=True)序號主鍵、city=db.Column(db.String(255))城市名稱數(shù)據(jù)項、xueli =db.Column(db.String(255))學(xué)歷名稱數(shù)據(jù)項和num=db.Column(db.Integer)所需人數(shù)數(shù)據(jù)項。部分?jǐn)?shù)據(jù)如下圖:
拿到數(shù)據(jù)類的數(shù)據(jù)對象,還要設(shè)定數(shù)據(jù)的讀取方法。繼續(xù)編寫xueli.py文件,要設(shè)定查詢方法:sql()。通過循環(huán)來將數(shù)據(jù)查詢出來并形成記錄列表,作為返回值返回,具體代碼分為6行,分別是def sql():設(shè)定查數(shù)據(jù)方法名、req=db.session.execute("select * from `data1`;")查詢表data1里的所有數(shù)據(jù)、sz=[]設(shè)定一個空列表準(zhǔn)備接受數(shù)據(jù)、for i in req:讀取循環(huán)開始、sz.append(i[1:4])循環(huán)體追加數(shù)據(jù)、return sz循環(huán)結(jié)束、返回所有的數(shù)據(jù)值。
3可視化整合展示
在數(shù)據(jù)庫鏈接、連接與數(shù)據(jù)讀取完成后,接下來進(jìn)行數(shù)據(jù)整整合形成靜態(tài)網(wǎng)頁并推送前臺的操作。這里除了pyecharts這個python的插件之外,還需要前臺網(wǎng)頁的兩個第三方Javascript插件的配合,它們是echarts.min.js和jquery.min.js。下載好后,把它們放入靜態(tài)文件目錄static下,以便在斷網(wǎng)的時候也能夠正常顯示,而且需要另外設(shè)定js_host,把在線目錄改為本地目錄。
在前一節(jié),已經(jīng)從MySQL中取得了所需要展示的數(shù)據(jù),現(xiàn)在要把它和靜態(tài)頁面進(jìn)行連接并傳送到前臺展示。顯示所需的靜態(tài)網(wǎng)頁,是由pyecharts自動生成的,我們不需要編寫靜態(tài)網(wǎng)頁框架。那么關(guān)鍵就是要編寫routes模塊下的charts.py文件來做好數(shù)據(jù)與頁面的整合工作。打開charts.py,添加第一行from pyecharts.charts import Bar,我們打算用柱狀圖來顯示數(shù)據(jù);編寫第二行from pandas import DataFrame,導(dǎo)入pandas來快速處理數(shù)據(jù);編寫第三行from models import xueli,從models目錄下讀取xueli.py拿到讀取數(shù)據(jù)的功能,這樣就完成了頭部導(dǎo)入部分。接下來,設(shè)定訪問的路由,@app.route('/'),本flask項目目前就只完成學(xué)歷、城市和數(shù)量的展示效果,所以就使用根路徑。緊跟著路由設(shè)定的下一行要編寫def index():展示頁面函數(shù),主要完成數(shù)據(jù)推送的功能,代碼函數(shù)較多:首先data = xueli.sql()取得數(shù)據(jù);list = []定義一個空的列表準(zhǔn)備接受數(shù)據(jù); ? ?for x in data:分離數(shù)據(jù)循環(huán)開始; temp = []定義臨時列表備用;for y in x:一條數(shù)據(jù)的內(nèi)循環(huán)開始; temp.append(y)臨時列表追加數(shù)據(jù);list.append(temp)臨時列表作為整體追加入上層列表形成嵌套列表;list1 = DataFrame(list)用Pandas的DataFrame格式化數(shù)據(jù);list2 = list1.groupby(0)按照第0列(城市)分組;x = [];y = []設(shè)定兩個空列表備用;bar = Bar()新建一個pyecharts的Bar(柱狀圖)對象; for i in list2: print(i[0])、x.append(i[0])、temp1 = []、for j in i[1].values:、temp1.append(j[2])、y.append(temp1),以上代碼是通過再一次的雙循環(huán),來將已經(jīng)分組(groupby)的數(shù)據(jù)分拆給x和y,x存儲了幾個城市名,y則存儲了大專、本科和研究生的按x的城市順序的需求數(shù)量;
接下來的工作是拆解數(shù)據(jù):dz = []、bk = []、yjs = []、for i in range(len(y)):、dz.append(y[i][0])、bk.append(y[i][1])、yjs.append(y[i][2])把數(shù)據(jù)分別寫入dz(大專)數(shù)組,bk(本科)數(shù)組和yjs(研究生)數(shù)組;然后,利用bar.add_xaxis(x)、bar.add_yaxis('大專', dz, stack='s')、bar.add_yaxis('本科', bk, stack='s')、bar.add_yaxis('研究生', yjs, stack='s')、bar.set_series_opts(label_opts=opts.LabelOpts (is_show=False))代碼把x、y坐標(biāo)軸顯示的內(nèi)容設(shè)定好;然后,bar.render('./templates/index.html')這條語句是生成靜態(tài)網(wǎng)頁的,它執(zhí)行后會在templates原本空的文件夾下生成index.html文件。
最后,return render_template('index.html')語句,將該生成好的靜態(tài)網(wǎng)頁推送到網(wǎng)站前臺,完成數(shù)據(jù)可視化展示,效果如下圖:
4預(yù)測與總結(jié)
在已有的數(shù)據(jù)基礎(chǔ)之上,可以選擇一個新的城市比如“南京”,已知南京的大專與本科人才需求量,用sklearn來建立模型,通過其他城市三種層次人才需求量的數(shù)據(jù)來預(yù)測南京對研究生的需求量。這個新選題可以在后期繼續(xù)完善??偨Y(jié)本項目,我們?yōu)榱私⑵饘W(xué)歷和地域需求的關(guān)系并可視化展示出來,采用了Python代碼搭建flask工程框架,編寫了數(shù)據(jù)庫模型建立、鏈接和連接配置代碼,然后訪問MySQL數(shù)據(jù)庫獲得數(shù)據(jù),最后編寫charts.py的前端展示頁面代碼??梢愿倪M(jìn)代碼,加入Javascript ajax獲取異步數(shù)據(jù)的功能,配合傳來的實(shí)時刷新的數(shù)據(jù),用頁面定時更新函數(shù)實(shí)現(xiàn)實(shí)時數(shù)據(jù)刷新效果提高可視性。這些構(gòu)想可以配合預(yù)測功能,在以后繼續(xù)實(shí)現(xiàn)。
參考文獻(xiàn):
[1] 基于Ajax與Echarts的網(wǎng)頁動態(tài)數(shù)據(jù)加載[J]. 黃雅莉,鐘琪. ?科技資訊. 2018(23)
[2] MySQL數(shù)據(jù)庫源代碼分析及存儲引擎的設(shè)計[D]. 王威.南京郵電大學(xué) 2012
[3] 基于學(xué)情分析的教學(xué)設(shè)計研究[J]. 余根鈥,何琳. ?基礎(chǔ)教育研究. 2019(21)
[4] ECharts在數(shù)據(jù)可視化中的應(yīng)用[J]. 崔蓬. ?軟件工程. 2019(06)
[5] 基于ECharts的電網(wǎng)Web可視化研究及應(yīng)用[J]. 章銳,陳樹勇,劉道偉,梁辰,侯金秀,封一賢.電測與儀表. 2017(19)
基金項目:2019年江蘇省級創(chuàng)新訓(xùn)練項目校園消費(fèi)行為大數(shù)據(jù)系統(tǒng)開發(fā)與應(yīng)用項目成果
作者簡介:
楊凡(2000-),男,漢族,江蘇鎮(zhèn)江人,計算機(jī)應(yīng)用技術(shù)專業(yè)學(xué)生;
陳豪(1982-),男,漢族,江蘇鹽城人,碩士,講師,主要研究方向:人工智能、大數(shù)據(jù)技術(shù).
(蘇州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院 ?江蘇 蘇州 215009)