宋永生 黃蓉美 王軍
摘? 要:數據分析與可視化有助于人們從繁雜的數據中快速獲取有用的信息。利用Python中的Pandas對結構化數據進行分析,采用Matplotlib進行圖表展示;從非結構化數據中提取文本,利用Jieba對文本進行分詞處理,利用Wordcloud進行詞云展示。利用Flask對上述圖表及詞云進行Web發(fā)布,構建數據分析與可視化平臺,成本較低,簡便易用。
關鍵詞:可視化;Pandas;Matplotlib;Jieba;Wordcloud;
中圖分類號:TP312.1? ? ? 文獻標識碼:A 文章編號:2096-4706(2019)21-0007-03
Abstract:Data analysis and visualization can help people get useful information from complex data quickly. We use Pandas in Python to analyze the structured data,and use Matplotlib to display the charts;we extract the text from the unstructured data,use Jieba to segment the text,and use Wordcloud to display the word cloud. Flask is used to publish the above charts and word cloud on the Web and build a data analysis and visualization platform,which is low cost and easy to use.
Keywords:visualization;Pandas;Matplotlib;Jieba;Wordcloud
0? 引? 言
近年來,隨著信息技術的飛速發(fā)展,各種應用系統(tǒng)如雨后春筍般涌現。高校中的軟件系統(tǒng)主要有教務系統(tǒng)、辦公系統(tǒng)及學工系統(tǒng)等,這些系統(tǒng)的數據主要是存儲于數據庫中的結構化數據。電腦或服務器上則存放著大量的視頻、PPT課件、PDF文檔、Word文檔等非結構化數據。隨著時間的推移,各類非結構化數據及結構化數據越來越多。非結構化數據以文件的形式進行存儲,比較零碎,不便于檢索。這些數據中蘊含的有用信息得不到充分利用,數據分析的需求越來越大。數據分析是指采用一定的方法對收集到的數據進行分析,提取其中有用信息的過程。數據可視化是采用圖表等方式對數據進行展示,有助于人們進行決策。
目前數據分析商用軟件有Matlab、SPSS和SAS,然而這些軟件費用高昂,安裝包較大,安裝過程復雜[1]。Python是一種面向對象的跨平臺解釋型高級程序設計語言,Python語言簡潔明了、便于擴展,具有龐大的標準庫和第三方庫,生態(tài)極為豐富。越來越多的研究人員開始使用Python進行數據分析,Python也逐漸成為數據分析領域的首選工具[2]。
本文嘗試采用Python中的數據分析及可視化庫,以較小的成本構建數據分析與可視化平臺。Pandas是一種基于NumPy的高效結構化數據分析工具,它在NumPy的基礎上提供了DataFrame數據結構,并以此為核心提供了大量的數據的輸入輸出、清洗、處理和分析函數。結構化數據的可視化可以借助Matplotlib實現。非結構化數據主要有視頻、PPT課件、PDF文檔及Word文檔等。為了便于分析,本文嘗試對視頻、PPT課件、PDF文檔、Word文檔這些非結構化數據進行轉換,提取其中的文本,借助Jieba對文本首先進行分詞處理,然后借助Wordcloud以詞云的方式進行展示。Matplotlib生成的圖表及Wordcloud生成的詞云都為本地文件,需要借助于Flask進行發(fā)布,便于在瀏覽器上進行展示。
1? 平臺總體架構
數據分析與可視化平臺分為數據采集模塊、數據分析模塊及分析結果展示模塊三個部分。平臺采用Python 3.5進行開發(fā),Web開發(fā)框架選用Flask,數據庫選用MySQL。結構化數據的分析采用Pandas,可視化選用Matplotlib;非結構化數據的分詞處理采用Jieba,詞云展示采用Wordcloud。集成開發(fā)環(huán)境選用PyCharm 2018。
2? 數據處理流程
數據分析與可視化平臺中的數據處理流程如圖1所示。
3? 結構化數據處理
3.1? 數據采集及預處理
在數據分析之前,首先需要采集數據,可以使用Pandas中的read_sql函數從數據庫中讀取數據。Pandas中的DataFrame有行索引和列索引,使用DataFrame來存儲數據庫表中的數據十分方便。常用的數據庫有Oracle、SQL Server及MySQL等,Pandas可以通過相應的數據庫驅動直接連接這些數據庫,將數據讀入DataFrame中。為了便于數據分析,可以將業(yè)務系統(tǒng)數據庫的連接字符串存入數據分析與可視化平臺的數據庫中,并在業(yè)務系統(tǒng)的數據庫中創(chuàng)建相應的視圖。此外,Pandas可以通過read_excel函數讀取Excel文件中的數據。
采集來的數據經常存在一些問題,比如數據缺失、數據重復及數據異常。在正式的數據分析之前,需要對這些存在問題的數據進行預處理。對于數據缺失常采用刪除或填充操作,數據重復一般做刪除操作。分析數據異常值出現原因,然后對其刪除、填充或校正。
3.2? 數據分析
數據分析先要熟悉數據,可以通過Pandas中的head預覽前幾行,利用shape獲取數據表大小,利用info獲取數據類型,利用describe獲取數值分布情況。把需要分析的數據篩選出來,進行數據運算、數據分組及聯(lián)合查詢等操作。利用Pandas的to_sql函數可以將分析結果寫入數據分析與可視化平臺的數據庫中,便于在瀏覽器上展示。
3.3? 數據可視化
Matplotlib是Python中最著名的繪圖庫,可以繪制各種精美的圖表,以硬拷貝格式和跨平臺的交互式環(huán)境生成出版質量級別的圖形。Matplotlib提供了一整套和Matlab相似的命令API,文檔相當完備,十分適合交互式繪圖,可以快速生成柱狀圖、散點圖、餅狀圖、折線圖、等值線圖和三角網格等。Matplotlib可以將Pandas的分析結果直接可視化,也可以從數據分析與可視化平臺的數據庫中讀取數據進行可視化。
4? 非結構化數據處理
4.1? 非結構化數據的采集及預處理
視頻、PDF文檔、Word文檔、PPT文檔等非結構化數據多以文件的形式存儲,文件繁多瑣碎,檢索非常麻煩。對于非結構化數據,為了便于分析,可以提取其文本內容,然后對文本內容進行分析處理。對視頻文件,可以利用Python中的MoviePy庫,從視頻文件中抽取音頻,然后調用訊飛開放平臺的語音轉寫功能,將語音轉為文本;對于PDF文件,可以利用Python中的pdfminer3k庫,提取PDF文件中的文本內容;對于Word文檔文件,可以利用Python中的python-docx庫提取Word文檔中的文本內容;對于PPT課件,可以利用Python中的python-pptx庫提取PPT中的文本內容。
4.2? 詞頻統(tǒng)計并進行可視化
漢語以字為基本書寫單位,詞語之間沒有明顯的區(qū)分標記。中文文本的詞頻統(tǒng)計,首先需要進行分詞處理,自動地對中文文本進行詞語的切分[3]。Jieba是Python中一個常用的中文分詞庫,利用詞庫將需要分詞的內容與詞庫進行對比,找到最大概率的詞組。Jieba支持精確模式、全模式及搜索引擎模式等三種中文分詞模式,支持繁體分詞及自定義詞典,以便包含Jieba詞庫里沒有的詞。雖然Jieba有新詞識別能力,但自行添加新詞可以保證更高的正確率。
詞云,也叫文字云,以詞語為單位,對文本中出現頻率較高的關鍵詞予以視覺上的突出展現,對關鍵詞進行渲染,形成類似云的彩色圖片。詞云可以過濾掉大量低頻低質的文本信息,使得瀏覽者只要一眼掃過就可領略文本的主旨。詞云已成為文本數據可視化的一種常用方式[4]。Wordcloud是Python中一個根據文本生成詞云的庫。通過詞云圖,一眼掃過便知道視頻、PDF、Word、PPT等非結構化數據的主要內容是什么。為了便于對非結構化數據進行管理,將非結構化數據文件、對應文本、詞云圖等文件的路徑信息,出現頻率較高的關鍵詞存入數據分析與可視化平臺的數據庫中。
5? 將圖像進行Web發(fā)布
由于Matplotlib生成的圖表及Wordcloud生成的詞云圖都是本地圖像,不便于用戶在遠程通過瀏覽器查看,因此需要將已生成的圖表及詞云圖進行Web發(fā)布。Flask是一個小而精的輕量級Web框架,其WSGI工具箱采用Werkzeug,模板引擎使用Jinja2。Flask不包含數據庫的抽象訪問層。Flask-SQLAlchemy是一個Flask擴展,在SQLAlchemy基礎上,簡化了在Flask程序中使用SQLAlchemy的操作。通過Flask-SQLAlchemy,可以方便地對數據分析與可視化平臺的數據庫中的數據進行操作。
對于結構化數據,為了便于客戶端瀏覽器的交互,客戶端選擇圖表類型、參數及待可視化的數據,服務器端根據參數等生成相應的圖表。由于圖表隨著客戶端的參數等的變化而變化,所以圖表不宜保存在服務器磁盤上,而是在內存中直接將Matplotlib生成的圖表經過Base64編碼,傳輸到Web頁面中,減少服務器的IO操作,提高了系統(tǒng)的響應速度。
# 寫入內存,使用BytesIO對象將png圖像的內容保存在內存中
buf =BytesIO()
plt.savefig(buf , format='png')
# 內存中的圖像buf轉換為base64編碼
save_file_base64 = base64.b64encode(buf.getvalue()).decode('utf8')
data = base64.encodebytes(buf.getvalue()).decode('utf-8')
plt.close()
buf.close()
return html.format(data)
對于非結構化數據,用戶可以通過瀏覽器上傳或指定服務器上待分析的非結構化數據。服務器端首先從非結構化數據中提取文本信息,然后對文本進行詞頻統(tǒng)計并生成詞云。由于非結構化數據對應文本的詞云是固定的,所以將詞云圖保存在服務器端。瀏覽器端發(fā)起請求后,在Flask的Web頁面中直接加載這些生成好的詞云圖返回給瀏覽器。此外還需利用Flask實現服務器上的非結構化數據的Web檢索功能。
6? 實驗分析
本文服務器選用華為云服務器,配置為8核CPU,32GB內存,1TB SSD磁盤,100Mbps帶寬,操作系統(tǒng)選用CentOS7.5 64位,安裝MySQL 5.6、Python 3.5、Pip9.0、Pandas 0.22、Matplotlib 2.2、Jieba 0.39、Wordcloud 1.5、Flask1.0、Flask-SQLAlchemy 2.0、各種非結構化數據的文本提取庫及數據庫驅動等,采用Gunicorn 19.8做WSGI容器來部署Flask程序,Web服務器選用Nginx 1.12。
在結構化數據分析中,用戶可以選擇待可視化的數據及圖表類型,比如用柱狀圖展示招生數據,然后選擇生源地、起始年份及結束年份,即可獲得不同年份的招生人數柱狀圖,如圖2所示。
在非結構化數據分析中,用戶可以上傳非結構化數據或選擇服務器上的非結構化數據,比如上傳《2019年政府工作報告》PDF文檔,服務器端提取該PDF文檔的文本內容,對文本內容分詞處理之后進行詞頻統(tǒng)計,以詞云的方式對其展示,如圖3所示。用戶還可以通過關鍵詞檢索服務器上的非結構化數據。
7? 結? 論
面對越來越多的結構化數據及非結構化數據,數據分析和可視化變得非常必要。本文利用Python構建了數據分析與可視化平臺。可由專業(yè)數據分析人員利用Pandas對結構化數據進行預處理并分析,分析結果存入數據分析與可視化平臺的數據庫中,利用Matplotlib進行數據的可視化,并將圖表通過Flask發(fā)布。用戶在瀏覽器上選擇待可視化的結構化數據、圖表類型及參數,即可在瀏覽器中查看該結構化數據的圖表。用戶上傳待分析的非結構化數據,服務器端自動將其轉換文本,對文本進行詞頻統(tǒng)計,以詞云的方式對其進行展示,在瀏覽器中可以查看詞云圖。為了便于對非結構化數據的管理,將非結構化數據、對應的文本、詞云圖的路徑信息及出現頻率較高的關鍵詞存入數據庫,利用Flask實現非結構化數據檢索功能。
本文只提取視頻的音頻部分對應的文本內容,可能會丟棄很多有用的信息,未來可以利用深度學習技術對視頻等非結構化數據進行深入的分析與挖掘。
參考文獻:
[1] 宋永生,吳新華.基于Python的Moodle學習平臺日志分析 [J].計算機時代,2018(10):19-21+25.
[2] 張若愚.Python科學計算:第2版 [M].北京:清華大學出版社,2016.
[3] 祝永志,荊靜.基于Python語言的中文分詞技術的研究 [J].通信技術,2019,52(7):1612-1619.
[4] 嚴明,鄭昌興.Python環(huán)境下的文本分詞與詞云制作 [J].現代計算機(專業(yè)版),2018(34):86-89.
作者簡介:宋永生(1984-),男,漢族,江蘇徐州人,就職于圖文信息中心,教師,工程師,碩士,研究方向:機器學習及物聯(lián)網技術研究。