設(shè)計(jì)說(shuō)明 國(guó)內(nèi)外數(shù)字音樂(lè)市場(chǎng)經(jīng)過(guò)幾百年的發(fā)展, 收錄的音樂(lè)作品總數(shù)量已經(jīng)達(dá)到了相當(dāng)可觀的程度, 面對(duì)數(shù)量如此龐大的音樂(lè)作品, 如何更加便捷、高效的讓用戶聽(tīng)到喜歡的音樂(lè)作品, 是音樂(lè)平臺(tái)必須要考慮的事情, 也是科研人員非常感興趣的研究課題。 本文首先對(duì)數(shù)據(jù)分析中涉及到了技術(shù)進(jìn)行分析,通過(guò)爬取QQ音樂(lè)數(shù)據(jù),然后使用Python中的pandas庫(kù)對(duì)數(shù)據(jù)進(jìn)行分析,最后通過(guò)flask進(jìn)行可視化展示。具體功能包括使用Python進(jìn)行音樂(lè)數(shù)據(jù)的爬取,并將音樂(lè)數(shù)據(jù)存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)中,最后利用Flask框架在web頁(yè)面中對(duì)音樂(lè)數(shù)據(jù)分析結(jié)果進(jìn)行展示。 關(guān)鍵詞:數(shù)據(jù)分析;Python;網(wǎng)絡(luò)爬蟲(chóng)
DESIGN DESCRIPTION
After hundreds of years of development of digital music market at home and abroad, the total number of music works collected has reached a considerable degree. Faced with such a large number of music works, how to let users hear their favorite music works more conveniently and efficiently is a matter that music platforms must consider, and also a research topic that researchers are very interested in.
In this paper, data analysis involves techniques first. By climbing QQ music data, pandas library is used to analyze the data, and finally visual display is performed by flask. The specific functions include using Python to crawl music data, storing music data in MySQL database, and finally using Flask framework to display the analysis results of music data in a web page.
Key words:?Data analysis; Python; Web crawler
目 錄
1 選題背景分析
1.1研究的背景與目的意義
1.1.1 研究背景
1.1.2 研究目的及意義
1.2 國(guó)內(nèi)外發(fā)展現(xiàn)狀
1.3 研究方案
2 設(shè)計(jì)技術(shù)方案
2.1 網(wǎng)絡(luò)爬蟲(chóng)技術(shù)
2.2 MySQL
2.3 Echarts
2.4 Flask
3 系統(tǒng)分析
3.1 可行性分析
3.1.1 技術(shù)可行性
3.1.2 經(jīng)濟(jì)可行性
3.2 業(yè)務(wù)需求分析
3.3 非功能性需求
4 系統(tǒng)設(shè)計(jì)
4.1 數(shù)據(jù)爬蟲(chóng)設(shè)計(jì)
4.2 數(shù)據(jù)分析設(shè)計(jì)
4.3 數(shù)據(jù)可視化流程
5 系統(tǒng)實(shí)現(xiàn)
5.1 界面實(shí)現(xiàn)
5.2 代碼實(shí)現(xiàn)
參考文獻(xiàn)
致 謝
1 選題背景分析
1.1研究的背景與目的意義
1.1.1?研究背景
隨著互聯(lián)網(wǎng)的發(fā)展,音樂(lè)已經(jīng)成為人們?nèi)粘I钪胁豢苫蛉钡囊徊糠帧W鳛橹袊?guó)最大的在線音樂(lè)平臺(tái)之一,QQ音樂(lè)擁有海量的音樂(lè)資源和龐大的用戶群體。如何利用這些數(shù)據(jù)進(jìn)行分析和可視化,探索音樂(lè)市場(chǎng)的趨勢(shì)和用戶的偏好,已經(jīng)成為了一個(gè)熱門(mén)的研究方向。Python作為一種高效、易學(xué)、功能強(qiáng)大的編程語(yǔ)言,已經(jīng)成為了數(shù)據(jù)分析和可視化的首選工具之一。通過(guò)Python的數(shù)據(jù)分析和可視化庫(kù),我們可以輕松地對(duì)QQ音樂(lè)的數(shù)據(jù)進(jìn)行處理和分析,從而得出有價(jià)值的結(jié)論和見(jiàn)解。通過(guò)以上分析,我們可以深入了解QQ音樂(lè)的市場(chǎng)情況和用戶需求,為音樂(lè)產(chǎn)業(yè)的發(fā)展提供有價(jià)值的參考。
1.1.2?研究目的及意義
本文旨在利用Python對(duì)QQ音樂(lè)的數(shù)據(jù)進(jìn)行可視化分析,探究QQ音樂(lè)的用戶偏好和音樂(lè)市場(chǎng)趨勢(shì),為音樂(lè)從業(yè)者和音樂(lè)愛(ài)好者提供參考和啟示。本研究的意義在于:
為音樂(lè)從業(yè)者提供市場(chǎng)分析和銷售策略制定的參考和啟示。
為音樂(lè)愛(ài)好者提供了解音樂(lè)市場(chǎng)趨勢(shì)和用戶偏好的途徑,幫助他們更好地選擇和欣賞音樂(lè)。
推廣Python在數(shù)據(jù)分析和可視化領(lǐng)域的應(yīng)用,為Python的普及和發(fā)展做出貢獻(xiàn)。
1.2?國(guó)內(nèi)外發(fā)展現(xiàn)狀
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,音樂(lè)數(shù)據(jù)分析已經(jīng)成為了一個(gè)熱門(mén)的研究領(lǐng)域。其中,QQ音樂(lè)作為國(guó)內(nèi)最大的在線音樂(lè)平臺(tái)之一,其數(shù)據(jù)分析也備受關(guān)注?;赑ython的QQ音樂(lè)數(shù)據(jù)可視化分析已經(jīng)成為了研究者們的熱門(mén)選擇。
在國(guó)內(nèi),基于Python的QQ音樂(lè)數(shù)據(jù)可視化分析已經(jīng)得到了廣泛的應(yīng)用。例如,有研究者利用Python對(duì)QQ音樂(lè)的用戶行為數(shù)據(jù)進(jìn)行分析,發(fā)現(xiàn)用戶的聽(tīng)歌偏好與地域、性別、年齡等因素有關(guān)。另外,還有研究者利用Python對(duì)QQ音樂(lè)的歌曲數(shù)據(jù)進(jìn)行分析,發(fā)現(xiàn)不同類型的歌曲在不同的時(shí)間段內(nèi)的播放量存在著顯著的差異。
在國(guó)外,基于Python的QQ音樂(lè)數(shù)據(jù)可視化分析也得到了廣泛的應(yīng)用。例如,有研究者利用Python對(duì)QQ音樂(lè)的歌曲數(shù)據(jù)進(jìn)行分析,發(fā)現(xiàn)不同類型的歌曲在不同的地區(qū)的播放量存在著顯著的差異。另外,還有研究者利用Python對(duì)QQ音樂(lè)的用戶行為數(shù)據(jù)進(jìn)行分析,發(fā)現(xiàn)用戶的聽(tīng)歌偏好與其社交網(wǎng)絡(luò)的密度有關(guān)。
綜上所述,基于Python的QQ音樂(lè)數(shù)據(jù)可視化分析已經(jīng)成為了國(guó)內(nèi)外研究者們的熱門(mén)選擇。通過(guò)對(duì)QQ音樂(lè)的用戶行為數(shù)據(jù)和歌曲數(shù)據(jù)進(jìn)行分析,可以深入了解用戶的聽(tīng)歌偏好和歌曲的流行趨勢(shì),為音樂(lè)產(chǎn)業(yè)的發(fā)展提供有價(jià)值的參考。
1.3?研究方案
其中系統(tǒng)實(shí)現(xiàn)的功能主要分為以下幾個(gè)部分。
1、利用Python語(yǔ)言編寫(xiě)爬蟲(chóng)程序,爬取音樂(lè)的詳細(xì)信息。
2、設(shè)計(jì)MySQL數(shù)據(jù)庫(kù),將爬取到的音樂(lè)信息存儲(chǔ)在數(shù)據(jù)庫(kù)中。
3、利用Python實(shí)現(xiàn)對(duì)數(shù)據(jù)的分析和可視化展示。
4、利用Flask搭建web框架。
2 設(shè)計(jì)技術(shù)方案
2.1 網(wǎng)絡(luò)爬蟲(chóng)技術(shù)
網(wǎng)絡(luò)爬蟲(chóng)就相當(dāng)于蜘蛛網(wǎng)上面尋找食物的蜘蛛,我們所需要的數(shù)據(jù)資源就相當(dāng)于蜘蛛的食物。在蛛網(wǎng)的每一個(gè)節(jié)點(diǎn)之上,蜘蛛經(jīng)過(guò)一次,就代表網(wǎng)絡(luò)爬蟲(chóng)成功在這個(gè)頁(yè)面抓取到了需要的信息。說(shuō)的簡(jiǎn)單一點(diǎn),網(wǎng)絡(luò)爬蟲(chóng)就是按照一定的規(guī)律獲取網(wǎng)頁(yè)并提取保存其中信息的工具。 Python網(wǎng)絡(luò)爬蟲(chóng)技術(shù)是指利用Python編程語(yǔ)言來(lái)獲取互聯(lián)網(wǎng)上的數(shù)據(jù)的技術(shù)。它可以自動(dòng)化地訪問(wèn)網(wǎng)站、抓取數(shù)據(jù)、解析HTML、XML等文檔格式,并將數(shù)據(jù)存儲(chǔ)到本地或者數(shù)據(jù)庫(kù)中。
Python網(wǎng)絡(luò)爬蟲(chóng)技術(shù)的主要應(yīng)用場(chǎng)景包括搜索引擎、數(shù)據(jù)挖掘、商業(yè)情報(bào)、輿情監(jiān)測(cè)、競(jìng)品分析、自動(dòng)化測(cè)試等領(lǐng)域。下面我們來(lái)介紹一下Python網(wǎng)絡(luò)爬蟲(chóng)技術(shù)的基本流程和常用工具,網(wǎng)絡(luò)爬蟲(chóng)的基本流程:
Python網(wǎng)絡(luò)爬蟲(chóng)的基本流程包括以下幾個(gè)步驟:
(1)確定目標(biāo)網(wǎng)站:首先需要確定要爬取的目標(biāo)網(wǎng)站,包括網(wǎng)站的URL、網(wǎng)頁(yè)的結(jié)構(gòu)、數(shù)據(jù)的類型等。
(2)分析網(wǎng)頁(yè)結(jié)構(gòu):通過(guò)分析目標(biāo)網(wǎng)站的網(wǎng)頁(yè)結(jié)構(gòu),確定需要抓取的數(shù)據(jù)所在的位置和格式。
(3)編寫(xiě)爬蟲(chóng)程序:使用Python編寫(xiě)爬蟲(chóng)程序,實(shí)現(xiàn)自動(dòng)化訪問(wèn)網(wǎng)站、抓取數(shù)據(jù)、解析HTML等功能。
(4)存儲(chǔ)數(shù)據(jù):將抓取到的數(shù)據(jù)存儲(chǔ)到本地或者數(shù)據(jù)庫(kù)中,以便后續(xù)的分析和使用。
2.2 MySQL
MySQL的數(shù)據(jù)庫(kù)引擎主要有兩種:MyISAM和InnoDB。MyISAM是MySQL最早的數(shù)據(jù)庫(kù)引擎,它是一種非事務(wù)性的引擎,適用于讀取頻繁的應(yīng)用場(chǎng)景。MyISAM的優(yōu)點(diǎn)是速度快,但是它不支持事務(wù)和行級(jí)鎖,因此在高并發(fā)的情況下容易出現(xiàn)數(shù)據(jù)沖突和數(shù)據(jù)丟失的問(wèn)題。InnoDB是MySQL的另一種數(shù)據(jù)庫(kù)引擎,它是一種事務(wù)性的引擎,適用于寫(xiě)入頻繁的應(yīng)用場(chǎng)景。InnoDB的優(yōu)點(diǎn)是支持事務(wù)和行級(jí)鎖,能夠保證數(shù)據(jù)的一致性和完整性,但是它的速度相對(duì)較慢。
2.3 Echarts
為了讓數(shù)據(jù)更加直觀,該系統(tǒng)采用Echarts圖表方式。Echarts是在前端使用JavaScript代碼實(shí)現(xiàn)的,用來(lái)在前端顯示數(shù)據(jù)可視化圖表,可以兼容大多數(shù)主流的瀏覽器。Echarts可以支持的圖像、圖形、圖表多種多樣,比如餅狀圖、折線點(diǎn)圖、K線圖、柱形圖等10多種圖表,并且支持多種用于交互的組件。除此之外,Echarts圖表還有其他很多功能,比如支持多組件和多圖表混合聯(lián)動(dòng)和展示,給招聘信息分析帶來(lái)很好的效果,給用戶帶來(lái)比較好的體驗(yàn)。
2.4 Flask
Flask框架是Python中的一個(gè)非常重要的WEB開(kāi)發(fā)框架,與另一個(gè)重量級(jí)Python Web框架Django齊名。但與Django的重和全不同,F(xiàn)lask強(qiáng)調(diào)靈活和簡(jiǎn)單。所以我們也會(huì)稱Flask為微框架。Flask有兩個(gè)主要依賴,WSGI工具集:Werkzeug和模板引擎:Jinja2,F(xiàn)lask 只保留了 Web 開(kāi)發(fā)的核心功能,其他的功能都由外部擴(kuò)展來(lái)實(shí)現(xiàn),比如集成數(shù)據(jù)庫(kù)、表單認(rèn)證、文件上傳、各種各樣的開(kāi)放認(rèn)證技術(shù)等功能。正是因?yàn)?Flask 支持用戶靈活選擇擴(kuò)展功能,使得Flask越來(lái)越受到開(kāi)發(fā)者的喜愛(ài)。Flask也不會(huì)替你做出許多決定,比如選用何種數(shù)據(jù)庫(kù)、使用何種模板引擎,在flask中這些都是非常容易改變的。
3 系統(tǒng)分析
3.1 可行性分析
隨著互聯(lián)網(wǎng)的發(fā)展,音樂(lè)已經(jīng)成為人們生活中不可或缺的一部分。而QQ音樂(lè)作為國(guó)內(nèi)最大的在線音樂(lè)平臺(tái)之一,其擁有的海量音樂(lè)數(shù)據(jù)也成為了研究音樂(lè)市場(chǎng)和用戶行為的重要資源。因此,基于Python的QQ音樂(lè)數(shù)據(jù)可視化分析具有很大的可行性。
3.1.1 技術(shù)可行性
邏輯結(jié)構(gòu)較簡(jiǎn)單的系統(tǒng)是容易實(shí)現(xiàn)的,本系統(tǒng)便是如此。涉及到的信息小,因此,開(kāi)發(fā)者的需求并不需要很高即可完成;個(gè)人機(jī)、Win10系統(tǒng)、開(kāi)發(fā)軟件、論文編寫(xiě)程序再加上所學(xué)的語(yǔ)言和指導(dǎo)老師的點(diǎn)播,專業(yè)基本功底,就能完成本次任務(wù),因此從技術(shù)角度出發(fā)是能夠行得通的。
3.1.2 經(jīng)濟(jì)可行性
音樂(lè)數(shù)據(jù)可視化分析系統(tǒng)的經(jīng)濟(jì)可行性是指落地系統(tǒng)和將來(lái)收入是否成比,是否對(duì)稱合理,同時(shí)還要看此系統(tǒng)能否真正管理人員提供便利,成功實(shí)現(xiàn)想要達(dá)到的效益。本系統(tǒng)的開(kāi)發(fā)所使用的硬件都是已經(jīng)存在的,所使用的軟件和語(yǔ)言都是開(kāi)源的,無(wú)需花費(fèi)額外的費(fèi)用,因此在開(kāi)發(fā)成本上可以滿足,以此看來(lái),系統(tǒng)擁有經(jīng)濟(jì)上的可行性。
3.2 業(yè)務(wù)需求分析
1、信息采集功能
系統(tǒng)可以爬取互聯(lián)網(wǎng)上的音樂(lè)數(shù)據(jù),爬取音樂(lè)相關(guān)的名字、歌手、專輯、時(shí)長(zhǎng)的信息。
2、信息分析功能
將采集到的信息經(jīng)過(guò)Python技術(shù)的篩選和預(yù)處理,分析之后將分析過(guò)后的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中。
3、數(shù)據(jù)可視化功能
通過(guò)echarts框架將分析過(guò)后的數(shù)據(jù)通過(guò)圖標(biāo)的形式展示到web端。
3.3 非功能性需求
性能是系統(tǒng)穩(wěn)定運(yùn)行的保障也是評(píng)價(jià)一個(gè)系統(tǒng)的重要指標(biāo),對(duì)系統(tǒng)性能進(jìn)行優(yōu)化可以提高系統(tǒng)的效率。系統(tǒng)會(huì)存在多人同時(shí)訪問(wèn)的高并發(fā)情況,為了讓系統(tǒng)在此種情況下不發(fā)崩潰閃退的Bug,我們?cè)诔跗谠O(shè)計(jì)數(shù)據(jù)庫(kù)結(jié)構(gòu)的時(shí)候,就對(duì)數(shù)據(jù)庫(kù)建立的索引的技術(shù)并且還對(duì)數(shù)據(jù)庫(kù)的讀取進(jìn)行了性能優(yōu)化。使用固定長(zhǎng)度的字段,通過(guò)限制字段長(zhǎng)度來(lái)提高數(shù)據(jù)庫(kù)處理速度,在sql語(yǔ)句方面對(duì)語(yǔ)句進(jìn)行優(yōu)化,減少比較次數(shù),如:通過(guò)limit限制返回條目數(shù)。硬件的性能也需要進(jìn)行優(yōu)化,如:擴(kuò)大虛擬內(nèi)存,并保證有足夠可以擴(kuò)充的空間,同時(shí)增加服務(wù)器的吞吐量。通過(guò)對(duì)這幾方面的優(yōu)化,提高用戶使用的體驗(yàn)感,降低系統(tǒng)在高并發(fā)情況下發(fā)生延遲的可能性。
由于本系統(tǒng)是屬于服務(wù)類型的項(xiàng)目,向用戶提供參考數(shù)據(jù),操作不易過(guò)多,過(guò)于繁瑣的流程只會(huì)消耗用戶的耐心,因此優(yōu)化流程也是優(yōu)化系統(tǒng)的重要一步。盡量做到一切從簡(jiǎn),讓顧客以最少的步驟得到最優(yōu)的結(jié)果,將簡(jiǎn)潔高效提現(xiàn)在系統(tǒng)中,給顧客帶來(lái)更好的體驗(yàn)。系統(tǒng)中所有需要用戶操作的的位置都有相關(guān)文字說(shuō)明,盡量保障用戶在使用系統(tǒng)的過(guò)程中不存在疑問(wèn),或含糊不清的情況。
4 系統(tǒng)設(shè)計(jì)
4.1 數(shù)據(jù)爬蟲(chóng)設(shè)計(jì)
爬蟲(chóng)具體的流程如下所示:
圖4.1 爬蟲(chóng)流程圖
本案例中,首先通過(guò)pip install beautifulsoup4下載安裝beautifulsoup庫(kù);通過(guò)pip install lxml下載安裝lxml。
其次,通過(guò)from bs4 import BeautifulSoup語(yǔ)句導(dǎo)入beautifulsoup4庫(kù)。
本課題數(shù)據(jù)提取程序中,執(zhí)行一段js代碼后,得到整個(gè)HTML源代碼,再通過(guò)BeautifulSoup庫(kù)使用soup = BeautifulSoup(data,'lxml'),創(chuàng)建BeautifulSoup對(duì)象,使用lxml解析庫(kù)解析得到頁(yè)面標(biāo)簽類數(shù)據(jù)soup,完成網(wǎng)站該頁(yè)面的分析與解析功能。
再者,通過(guò)import re語(yǔ)句導(dǎo)入re模塊,根據(jù)需獲取的慕課實(shí)戰(zhàn)網(wǎng)站特定數(shù)據(jù),編譯正則表達(dá)式,通過(guò)results = re.findall(pattern, soup)語(yǔ)句,將爬蟲(chóng)程序所采集的該HTML頁(yè)面數(shù)據(jù)與特定的正則表達(dá)式對(duì)象進(jìn)行匹配,篩選數(shù)據(jù),匹配成功的數(shù)據(jù)以列表的形式返回,即獲取到需要提取的數(shù)據(jù)。數(shù)據(jù)提取模塊流程圖
如4-2所示。
圖4.2 數(shù)據(jù)爬取流程圖
4.2 數(shù)據(jù)分析設(shè)計(jì)
在數(shù)據(jù)處理部分,主要是對(duì)爬取下來(lái)的數(shù)據(jù)進(jìn)行處理,讓數(shù)據(jù)能夠符合數(shù)據(jù)分析的要求,對(duì)于本次音樂(lè)數(shù)據(jù)的爬取來(lái)說(shuō),主要是對(duì)空值的替換、異常值的刪除和數(shù)據(jù)格式的轉(zhuǎn)換,主要流程如下。
圖4.3 數(shù)據(jù)處理流程
4.3 數(shù)據(jù)可視化流程
在本次選題中可視化模塊的研究主要是在Python基
礎(chǔ)上進(jìn)行。數(shù)據(jù)分析可視化主要是利用Echarts相關(guān)組件和技術(shù)。這一項(xiàng)技術(shù)的功能可以實(shí)現(xiàn)最直觀、形象、生動(dòng)的可視化圖畫(huà)和表格,而且該Echarts相關(guān)組件和技術(shù)具有可交互以及高度個(gè)性化定制的特點(diǎn)。它的創(chuàng)新的拖拽重計(jì)算、值域漫游以及數(shù)據(jù)試圖等功能的使用非常大的提高了用戶使用體驗(yàn),并且可以讓用戶具有數(shù)據(jù)挖掘和整合的能力。通過(guò)在官網(wǎng)上下載對(duì)應(yīng)的Echarts.min.js文件,并將其加入到項(xiàng)目中,也可以通過(guò)直接調(diào)用官網(wǎng)鏈接來(lái)導(dǎo)入Echarts,官網(wǎng)鏈接為https://assets.pyEcharts.org/assets/Echarts.min.js。
導(dǎo)入文件之后在網(wǎng)頁(yè)主要部分添加div標(biāo)簽預(yù)留空間,將官網(wǎng)上的框架添加到對(duì)應(yīng)頁(yè)面中的js部分,當(dāng)flask傳入數(shù)據(jù)時(shí),即可實(shí)現(xiàn)圖表的展示。在對(duì)數(shù)據(jù)的可視化部分,主要流程如下。
圖4.4 系統(tǒng)可視化流程圖
5 系統(tǒng)實(shí)現(xiàn)
5.1 界面實(shí)現(xiàn)
系統(tǒng)啟動(dòng)完成后,在瀏覽器中輸入地址,具體的實(shí)現(xiàn)界面如圖5.1所示:
圖 5-1 系統(tǒng)實(shí)現(xiàn)界面
如圖5-1所示,系統(tǒng)主要實(shí)現(xiàn)了最受歡迎歌單類型TOP7、最受歡迎的歌單TOP5、歌單收藏量變化、男女創(chuàng)建歌單數(shù)量對(duì)比、歌單歌曲數(shù)量范圍等。
5.2 代碼實(shí)現(xiàn)
實(shí)現(xiàn)的代碼如下所示:
from flask import Flask, render_template, url_for
import json
import pandas as pd
import pymysql
import re
app = Flask(__name__)
cols = ['id','name','type','tags','create_time','update_time','tracks_num','play_count','subscribed_count','share_count','comment_count','nickname','gender','user_type','vip_type','province','city']
df = pd.read_csv('wymusic.csv',sep='\t',names=cols)
"""最受歡迎的歌單類型"""
@app.route('/get_hot_type')
def get_hot_type():
hot_type_df = df[['type', 'play_count']].groupby(df['type']).sum().sort_values('play_count', ascending=False).reset_index()
hot_type_top7 = hot_type_df.head(7)
playlist_type = hot_type_top7['type'].tolist()
play_count = hot_type_top7['play_count'].tolist()
return json.dumps({'playlist_type': playlist_type, 'play_count': play_count}, ensure_ascii=False)
"""歌單數(shù)據(jù)隨月份變化"""
@app.route('/get_month_data')
def get_month_data():
yearList = []
for year in ['2018', '2019']:
yearList.append({
"year": year,
"data": [
df[df['create_time'].str[:4]==year].groupby(df['create_time'].str[5:7]).sum().reset_index()['share_count'].tolist(),
df[df['create_time'].str[:4]==year].groupby(df['create_time'].str[5:7]).sum().reset_index()['comment_count'].tolist()
]
})
month = df[df['create_time'].str[:4]==year].groupby(df['create_time'].str[5:7]).sum().reset_index()['create_time'].tolist()
yearData = {
"yearData": yearList,
"monthList": [str(int(x))+'月' for x in month]
}
return json.dumps(yearData, ensure_ascii=False)
"""歌單數(shù)據(jù)隨天數(shù)變化"""
@app.route('/get_day_data')
def get_day_data():
non_vip_df = df[df['vip_type']==0].groupby(df['create_time'].str[8:10]).sum().reset_index()[['create_time', 'subscribed_count']]
vip_df = df[(df['vip_type']==10) | (df['vip_type']==11)].groupby(df['create_time'].str[8:10]).sum().reset_index()[['create_time', 'subscribed_count']]
vip_type_df = pd.merge(non_vip_df, vip_df, left_on='create_time', right_on='create_time', how='inner')
sub_data = {
"day": [str(int(x)) for x in vip_type_df["create_time"].tolist()],
"vip": vip_type_df["subscribed_count_y"].tolist(),
"nonvip": vip_type_df["subscribed_count_x"].tolist(),
}
print(sub_data)
return json.dumps(sub_data, ensure_ascii=False)
"""歌單歌曲數(shù)量分布"""
@app.route('/get_track_data')
def get_track_data():
bins = [0, 50, 150, 500, 100000]
cuts = pd.cut(df['tracks_num'], bins=bins, right=False, include_lowest=True)
data_count = cuts.value_counts()
data = dict(zip([str(x) for x in data_count.index.tolist()], data_count.tolist()))
map_data = [{'name': name, 'value': value} for name, value in data.items()]
track_value = {'t_v': map_data}
return json.dumps(track_value, ensure_ascii=False)
"""語(yǔ)種類型歌單播放量"""
@app.route('/get_type_data')
def get_type_data():
gender_df = df[['gender']].groupby(df['gender']).count()
gender_data = [{'name': '男', 'value': int(gender_df.loc['男', 'gender'])},{'name': '女', 'value':int( gender_df.loc['女', 'gender'])}]
type_sum = {'t_s': gender_data}
return json.dumps(type_sum, ensure_ascii=False)
def replace_str(x):
rep_list = ['省', '市', '維吾爾','自治區(qū)', '壯族', '回族', '維吾爾族', '特別行政區(qū)']
for rep in rep_list:
x = re.sub(rep, '', x)
return x
def add_province(df_data, province):
# 所有年份
years = df_data['create_time'].drop_duplicates().tolist()
for year in years:
# 每年的省份
new_province = df_data.loc[df_data['create_time']==year,:]['province'].drop_duplicates().tolist()
# 缺失的省份 = 所有省份 - 每年的省份
rest_province = [x for x in province if x not in new_province]
# 對(duì)缺失的省份生成一個(gè)DataFrame,填充0值,并與原DataFrame合并
if len(rest_province):
rest_df = pd.DataFrame([[year,x,0,0] for x in rest_province], columns=df_data.columns)
df_data = pd.concat([df_data, rest_df], ignore_index=True)
return df_data
"""動(dòng)態(tài)地圖"""
@app.route('/get_map_data')
def get_map_data():
time_df = df.groupby([df['create_time'].str[:4], df['province'].apply(replace_str)])[['play_count', 'share_count']].count().reset_index()
re_time_df = time_df[time_df['province'] != '海外']
province = re_time_df['province'].drop_duplicates().tolist()
re_time_df2 = add_province(re_time_df, province)
final_time_df = re_time_df2.sort_values(by=['create_time', 'province']).reset_index(drop=True)
final_province = final_time_df['province'].drop_duplicates().tolist()
final_year = final_time_df['create_time'].drop_duplicates().tolist()
playlist_num = []
for year in final_year:
playlist_num.append(final_time_df.loc[final_time_df['create_time']==year, 'play_count'].tolist())
playlist_data = {"year": final_year, "province": final_province, "playlist_num": playlist_num}
return json.dumps(playlist_data, ensure_ascii=False)
app.route('/')
def index():
gender_df = df[['gender']].groupby(df['gender']).count()
gender_data = {'男': gender_df.loc['男', 'gender'], '女': gender_df.loc['女', 'gender']}
df1 = pd.read_csv('song.csv')
songlist = list(df1.values)[:5]
return render_template('index.html', gender_data=gender_data,songlist=songlist)
if __name__ == "__main__":
app.run()
結(jié) 語(yǔ)
隨著互聯(lián)網(wǎng)平臺(tái)的興起,越來(lái)越多的人開(kāi)始在音樂(lè)分析進(jìn)行聽(tīng)歌、看視頻、發(fā)布評(píng)論。隨著網(wǎng)民人數(shù)的增加,人們對(duì)于音樂(lè)的需求也越來(lái)越大。當(dāng)前現(xiàn)有的音樂(lè)分析還不夠完善,還存在諸多不足之處。本次設(shè)計(jì)就是基于這樣的背景開(kāi)發(fā)的,通過(guò)研究國(guó)內(nèi)外研究現(xiàn)狀和應(yīng)用前景,分析了系統(tǒng)使用到的相關(guān)技術(shù),隨后對(duì)音樂(lè)分析系統(tǒng)的需求進(jìn)行分析、總體和數(shù)據(jù)庫(kù)進(jìn)行設(shè)計(jì),分析了音樂(lè)分析的功能性需求和性能需求,對(duì)系統(tǒng)的總體設(shè)計(jì)從功能模塊和流程分析進(jìn)行,同時(shí)對(duì)數(shù)據(jù)庫(kù)概念結(jié)構(gòu)和邏輯結(jié)構(gòu)進(jìn)行設(shè)計(jì)。接著就是系統(tǒng)的開(kāi)發(fā)與實(shí)現(xiàn),從用戶功能實(shí)現(xiàn)和后臺(tái)管理實(shí)現(xiàn)出發(fā)對(duì)系統(tǒng)的開(kāi)發(fā)與實(shí)現(xiàn)過(guò)程進(jìn)行介紹。
本次設(shè)計(jì)課程的整個(gè)過(guò)程被完整記錄下來(lái),但是系統(tǒng)開(kāi)發(fā)的學(xué)習(xí)工作,還有待持續(xù)。通過(guò)這次機(jī)會(huì),讓自己對(duì)相關(guān)知識(shí)的學(xué)習(xí)及應(yīng)用能力得到了提升,特別是遇到問(wèn)題時(shí)候,知道該如何去思考,如何選擇方法、工具,這些經(jīng)驗(yàn)確實(shí)非常重要。對(duì)于知識(shí)層面的學(xué)習(xí),我不會(huì)停止,將會(huì)一如既往的深入鉆研,并抓住每一個(gè)能夠提高實(shí)際鍛煉的機(jī)會(huì),使得自己再這一技術(shù)領(lǐng)域有更大的突破。
參考文獻(xiàn)
[1]汪邦博,胡必波,李滿,劉絲雨,劉曉莉.基于Scrapy的大數(shù)據(jù)學(xué)情分析系統(tǒng)就業(yè)崗位數(shù)據(jù)爬取,2021-11-18
[2]劉影.基于Python的房?jī)r(jià)數(shù)據(jù)爬取及可視化分析[J].信息與電腦(理論版),2021-09-25
[3]張敏,卿粼波,王巧,才虹麗,陳楊.基于混合時(shí)空感知網(wǎng)絡(luò)的城市區(qū)域人流量預(yù)測(cè)[J].智能計(jì)算機(jī)與應(yīng)用,2021-08-01
[4]孫文杰,張素莉,許駿,鄭國(guó)勛,張維軒.長(zhǎng)白山旅游數(shù)據(jù)爬取及可視化分析[J].吉林大學(xué)學(xué)報(bào)(信息科學(xué)版),2021-07-15
[5]施元磊. 景區(qū)交通流量預(yù)測(cè)與游客行程規(guī)劃技術(shù)研究[D].西北大學(xué),2021-06-01
[6]Agafonov A. A.. Short-Term Traffic Data Forecasting: A Deep Learning Approach[J]. Optical Memory and Neural Networks,2021-03-15
[7]戴瑗,鄭傳行.基于Python的南京二手房數(shù)據(jù)爬取及分析[J].計(jì)算機(jī)代,2021-01-15
[8]簡(jiǎn)悅,汪心瀛,楊明昕.基于Python的豆瓣網(wǎng)站數(shù)據(jù)爬取與分析[J].電腦知識(shí)與技術(shù),2020-11-15
[9]劉曉知.基于Python的招聘網(wǎng)站信息爬取與數(shù)據(jù)分析[J].電子測(cè)試,2020-06-05
[10]劉鑫. 基于SVM和LSTM的火車站入口人流量預(yù)測(cè)[D].山西大學(xué),2020-06-01
[11]歐陽(yáng)元東.基于Python的網(wǎng)站數(shù)據(jù)爬取與分析的技術(shù)實(shí)現(xiàn)策略[J].電腦知識(shí)與技術(shù),2020-05-05
[12]高艷.基于Selenium框架的大數(shù)據(jù)崗位數(shù)據(jù)爬取與分析[J].工業(yè)控制計(jì)算機(jī),2020-02-25
[13]成文瑩,李秀敏.基于Python的電影數(shù)據(jù)爬取與數(shù)據(jù)可視化分析研究[J].電腦知識(shí)與技術(shù),2019-11-15文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-768494.html
[14]Ben Sassi Imen,Ben Yahia Sadok,Liiv Innar. MORec: At the crossroads of context-aware and multi-criteria decision making for online music recommendation[J]. Expert Systems With Applications,2021,183:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-768494.html
到了這里,關(guān)于python-大數(shù)據(jù)分析-基于大數(shù)據(jù)的QQ音樂(lè)數(shù)據(jù)分析系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!