基于Python實現(xiàn)的影視數(shù)據(jù)智能分析系統(tǒng)
1. 前言
數(shù)據(jù)分析與可視化是當(dāng)今數(shù)據(jù)分析的發(fā)展方向,大數(shù)據(jù)時代,數(shù)據(jù)資源具有海量特征,數(shù)據(jù)分析和可視化主要通過Python數(shù)據(jù)分析來實現(xiàn)。
基于Python的數(shù)據(jù)分析可視化和技術(shù)實現(xiàn)是目前Python數(shù)據(jù)分析的主要目的,Python可以為數(shù)據(jù)分析可視化提供思路,在體現(xiàn)數(shù)據(jù)價值方面發(fā)揮著重要作用。因此,在研究數(shù)據(jù)分析、可視化的過程中,我們可以看到Python具有重要的應(yīng)用價值。
本文具有影視數(shù)據(jù)智能分析系統(tǒng)的簡單雛形,以不同流媒體電影數(shù)據(jù)為背景,通過調(diào)研、分析數(shù)據(jù), 完成數(shù)據(jù)預(yù)處理、數(shù)據(jù)分析和數(shù)據(jù)可視化等操作,掌握相關(guān)的智能數(shù)據(jù)處理與智能系統(tǒng)開發(fā)的知識,培養(yǎng)智能信息系統(tǒng)項目開發(fā)過程中的分析、設(shè)計和工程文檔編寫能力,提高工程應(yīng)用能力和綜合分析、解決實際問題的能力。
2.設(shè)計目的及任務(wù)描述
影視數(shù)據(jù)分析應(yīng)用統(tǒng)計分析方法對收集來的大量數(shù)據(jù)進行分析,提取有用信息和形成結(jié)論而對數(shù)據(jù)加以詳細研究和概括總結(jié)的過程。這一過程也是質(zhì)量管理體系的支持過程。影視數(shù)據(jù)分析可幫助人們做出觀看影視的選擇及投入更合適的影視,尤其對視頻管理平臺有很好的幫助。影視數(shù)據(jù)分析是建立在數(shù)基礎(chǔ),20世紀早期就已確立,但直到計算機的出現(xiàn)才使得實際操作成為可能,并使得數(shù)據(jù)分析得以推廣。同時,在數(shù)據(jù)獲取、處理和分析過程中考慮數(shù)據(jù)安全、技術(shù)經(jīng)濟、工程倫理、行業(yè)規(guī)范等要素。
本設(shè)計內(nèi)容涉及的數(shù)據(jù)一部分來自Reelgood.com
網(wǎng)站,其中包括四種流媒體平臺上可用電影的綜合列表;另一部分來自IMDB
數(shù)據(jù)集。要求應(yīng)用pands
對下列問題進行數(shù)據(jù)分析:
- 你可以在哪個流媒體平臺上找到這部電影?
- 在某個國家/地區(qū)/IMDB制作的電影的平均IMDb收視率?
- 每個目標年齡段所感興趣的電影,以及他們所感興趣的流媒體應(yīng)用程序。
- 電影的發(fā)行年份以及數(shù)量。
- 電影和導(dǎo)演的受歡迎程度分析。
通過該課程設(shè)計的實踐訓(xùn)練,使學(xué)生掌握相關(guān)的智能數(shù)據(jù)處理與智能系統(tǒng)開發(fā)的知識,培養(yǎng)智能信息系統(tǒng)項目開發(fā)過程中的分析、設(shè)計和工程文檔編寫能力,提高工程應(yīng)用能力和綜合分析、解決實際問題的能力。
3. 總體設(shè)計
本系統(tǒng)主要分為四個部分,分別為爬蟲抓取、數(shù)據(jù)處理分析可視化、GUI界面展示、啟動運行,分別對應(yīng)getData.py
、pyec.py
、GUI.py
、main.py
四個文件。并且包含data文件夾用于存儲系統(tǒng)所需或產(chǎn)生的數(shù)據(jù)文件。
系統(tǒng)結(jié)構(gòu)如圖所示:
4.系統(tǒng)實現(xiàn)
4.1 爬蟲抓取
getData.py
該文件主要功能是抓取和讀取電影數(shù)據(jù),共包含8個函數(shù),代碼如下:
recently()
這一函數(shù)主要是抓取最近上映票房排名前十名的電影信息。
def recently(): url = "https://ys.endata.cn/enlib-api/api/movie/getMovie_BoxOffice_Day_Chart.do" header = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36', "Cookie": 'JSESSIONID=b2685bfa-aa4f-4359-ae96-57befaf8d1ec; route=4e39643a15b7003e568cadd862137cf3; Hm_lvt_82932fc4fc199c08b9a83c4c9d02af11=1649834963,1649852471,1649859039,1649900037; Hm_lpvt_82932fc4fc199c08b9a83c4c9d02af11=1649917933' } post_BoxOffice_Day_data = { 'r': 0.7572955414768414, 'datetype': 'Day', 'date': datetime.now().strftime('%Y-%m-%d'), 'sdate': datetime.now().strftime('%Y-%m-%d'), 'edate': datetime.now().strftime('%Y-%m-%d'), 'bserviceprice': 1 }
以上代碼塊是運行爬蟲前的準備工作,包含抓取的網(wǎng)址url、爬蟲所需的請求頭、請求時需要附帶的數(shù)據(jù)。
res = requests.post(url, headers=header, data=post_BoxOffice_Day_data).text json_data = json.loads(res) data0 = json_data['data']['table0'] data1 = json_data['data']['table1']
以上代碼塊是運行爬蟲并將其解析為json形式,方便后面對數(shù)據(jù)進行取出。
movie_rank = [] movie_details_MovieName = [] movie_details_BoxOffice = [] movie_details_ShowCount = [] movie_details_AudienceCount = [] movie_details_Attendance = [] movie_percent_BoxOfficePercent = [] movie_percent_ShowCountPercent = [] movie_percent_AudienceCountPercent = []
以上代碼是部分定義的所需的數(shù)據(jù)字段。
for i in range(10): movie_rank.append(data0[i]['Irank']) movie_details_MovieName.append(data0[i]['MovieName']) movie_details_BoxOffice.append(data0[i]['BoxOffice']) movie_details_ShowCount.append(data0[i]['ShowCount']) movie_details_AudienceCount.append(data0[i]['AudienceCount']) movie_details_Attendance.append(data0[i]['Attendance'])
以上是從json數(shù)據(jù)中取數(shù)據(jù)的過程。
showing()
這一函數(shù)主要抓取最近正在上映的所有電影的基本信息。history()
這一函數(shù)主要是讀取歷史電影數(shù)據(jù)并返回列表格式
def history(): data = pd.read_csv("data/moviesBoxOffice.csv", encoding='gbk') data = np.array(data[:100]).tolist() return data
利用pandas庫讀取csv文件,numpy對DataFrame形式數(shù)據(jù)轉(zhuǎn)換為list格式的過程。
predict_data()
這一函數(shù)主要是讀取歷史電影數(shù)據(jù)進行建模,建模完成后,讀取需要預(yù)測的在映電影數(shù)據(jù),對其進行票房預(yù)測并返回。hotMovies()
這一函數(shù)主要是抓取當(dāng)前在映票房前五的電影七天內(nèi)的票房數(shù)據(jù)。
special()
這一函數(shù)主要抓取的是當(dāng)前電影市場特效影廳種類及其票房占比的數(shù)據(jù)。champion_year()
這一函數(shù)主要抓取的是近十年來中國電影市場每年票房冠軍影片的票房數(shù)據(jù),還抓取了近十年國內(nèi)電影市場的票房和上映影片數(shù)量等相關(guān)數(shù)據(jù)。
Tablets()
這一函數(shù)主要是對近期在映電影的排片數(shù)據(jù)進行抓取并返回。
4.2 GUI界面運行
GUI.py
該文件主要是為系統(tǒng)構(gòu)建GUI界面,共有15個函數(shù),具體代碼如下:create_tree_showing
該函數(shù)主要是為正在上映的電影數(shù)據(jù)創(chuàng)建數(shù)據(jù)表格。代碼塊先是確定數(shù)據(jù)表頭,然后創(chuàng)建表格并設(shè)置其父窗體,表格一次性顯示數(shù)據(jù)行數(shù),是否顯示表頭等參數(shù),然后分別設(shè)置表格數(shù)據(jù)列及每列的寬度。代碼塊設(shè)置表頭文本信息,再設(shè)置該信息表的垂直滾動條。
create_tree_tablets
該函數(shù)主要是為在映電影的排片數(shù)據(jù)創(chuàng)建數(shù)據(jù)表格。create_tree_history
該函數(shù)主要是為歷史電影數(shù)據(jù)創(chuàng)建數(shù)據(jù)表格。
create_tree_predict
該函數(shù)主要是為在映電影票房預(yù)測結(jié)果數(shù)據(jù)創(chuàng)建數(shù)據(jù)表格。clear_tree
該函數(shù)主要功能是在切換展示數(shù)據(jù)表格時,對已展示表格數(shù)據(jù)進行清除。
該函數(shù)有一個tree參數(shù),首先對tree進行銷毀,再對該表格的垂直滾動條進行銷毀。
showing
該函數(shù)對應(yīng)按鈕’在映電影’,用于實現(xiàn)獲取在映電影數(shù)據(jù)功能。history
該函數(shù)對應(yīng)按鈕’歷史電影’,用于實現(xiàn)獲取歷史電影數(shù)據(jù)功能。
predict
該函數(shù)對應(yīng)按鈕’在映電影票房預(yù)測’,用于實現(xiàn)對在映電影票房預(yù)測并展示。tablets
該函數(shù)對應(yīng)按鈕’拍片分析’,用于實現(xiàn)獲取排片分析數(shù)據(jù)功能。
center_window
該函數(shù)是創(chuàng)建整個GUI窗體的函數(shù)。clicking
該函數(shù)對應(yīng)’在映電影分析’按鈕,用于跳轉(zhuǎn)在映電影分析網(wǎng)頁。先調(diào)用getData.py下的recently函數(shù)獲取在映電影數(shù)據(jù),再調(diào)用pyec.py文件下的Showing函數(shù)進行統(tǒng)計圖表制作,最后跳轉(zhuǎn)到數(shù)據(jù)圖表網(wǎng)頁。
clicked
該函數(shù)對應(yīng)’歷史數(shù)據(jù)分析’按鈕,用于跳轉(zhuǎn)電影票房分析網(wǎng)頁。industry
該函數(shù)對應(yīng)’數(shù)據(jù)大盤’按鈕,用于跳轉(zhuǎn)數(shù)據(jù)大盤網(wǎng)頁。
ui_process
該函數(shù)主要是對GUI窗體控件等進行布局。創(chuàng)建根窗體,設(shè)置GUI的名稱,大小,整體高亮顏色,對內(nèi)部子窗體進行了初始化并且在子窗體的左上角添加了一張logo圖片。在子窗體設(shè)置了各個功能對應(yīng)的按鈕。設(shè)置了整體窗體的布局,以及各個子窗體控件的設(shè)置,設(shè)置了窗體列參數(shù)及運行了整個窗體。
4.3 啟動運行
main.py
該函數(shù)是整個系統(tǒng)的GUI入口,調(diào)用并運行了GUI。
from GUI import uiob if __name__ == '__main__': ui = uiob() ui.ui_process()
5.可視化設(shè)計
pyec.py
該文件主要是對getData.py文件獲取到的數(shù)據(jù)進行可視化操作,共有3個函數(shù),代碼功能詳解如下:
History()
該函數(shù)主要是對歷史電影數(shù)據(jù)進行可視化,具體代碼如下:
csv_file = 'data/moviesBoxOffice.csv' # 設(shè)置csv文件的路徑 data = pd.read_csv(csv_file, encoding='gbk') # 使用pandas讀取csv文件中的數(shù)據(jù) data_type = data['影片主分類'].value_counts() # 統(tǒng)計影片主分類的各類別數(shù)量 data_BoxOffice = data['總票房(萬)'][:10] # 獲取前10部電影的總票房數(shù)據(jù)
該代碼塊主要是讀取歷史電影票房數(shù)據(jù)為畫圖做前期準備工作。
# 創(chuàng)建柱狀圖a,展示票房TOP1000類型統(tǒng)計 a = ( Bar(init_opts=opts.InitOpts(height="450px", width="900px", theme=ThemeType.MACARONS, bg_color='white')) # 設(shè)置圖表的基本參數(shù) .add_xaxis(list(data_type.index)) # 設(shè)置x軸數(shù)據(jù) .add_yaxis("類型", list(data_type)) # 設(shè)置y軸數(shù)據(jù) .set_global_opts( title_opts=opts.TitleOpts(title="票房TOP1000類型統(tǒng)計"), # 設(shè)置圖表標題 # datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], # 設(shè)置數(shù)據(jù)縮放選項 ) ) # 創(chuàng)建柱狀圖b,展示票房TOP10總票房統(tǒng)計 b = ( Bar(init_opts=opts.InitOpts(height="450px", width="900px", theme=ThemeType.LIGHT)) # 設(shè)置圖表的基本參數(shù) .add_xaxis(list(data['影片名稱'][:10])) # 設(shè)置x軸數(shù)據(jù) .add_yaxis("票房", list(data_BoxOffice)) # 設(shè)置y軸數(shù)據(jù) .set_global_opts( title_opts=opts.TitleOpts(title="票房TOP10總票房統(tǒng)計"), # 設(shè)置圖表標題 # datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], # 設(shè)置數(shù)據(jù)縮放選項 xaxis_opts=opts.AxisOpts(axislabel_opts={"rotate": 20}) # 設(shè)置x軸標簽旋轉(zhuǎn)角度 ) ) # 創(chuàng)建折線圖c,展示票房TOP10各類票房統(tǒng)計 c = ( Line(init_opts=opts.InitOpts(height="450px", width="900px", theme=ThemeType.LIGHT)) # 設(shè)置圖表的基本參數(shù) .add_xaxis(list(data['影片名稱'][:10])) # 設(shè)置x軸數(shù)據(jù) .add_yaxis("總票房(萬)", list(data['總票房(萬)'][:10]), is_smooth=True) # 設(shè)置y軸數(shù)據(jù)并進行平滑處理 .add_yaxis("首日票房(萬)", list(data['首日票房(萬)'][:10]), is_smooth=True) # 設(shè)置y軸數(shù)據(jù)并進行平滑處理 .add_yaxis("首周票房(萬)", list(data['首周票房(萬)'][:10]), is_smooth=True) # 設(shè)置y軸數(shù)據(jù)并進行平滑處理 .add_yaxis("首周末票房(萬)", list(data['首周末票房(萬)'][:10]), is_smooth=True) # 設(shè)置y軸數(shù)據(jù)并進行平滑處理 .add_yaxis("點映票房(萬)", list(data['點映票房(萬)'][:10]), is_smooth=True) # 設(shè)置y軸數(shù)據(jù)并進行平滑處理 .set_series_opts(label_opts=opts.LabelOpts(is_show=True), # 設(shè)置數(shù)據(jù)標簽顯示選項 linestyle_opts=opts.LineStyleOpts(width=3)) # 設(shè)置線條樣式 .set_global_opts( title_opts=opts.TitleOpts(title="票房TOP10各類票房統(tǒng)計", pos_left='top'), # 設(shè)置圖表標題及位置 # datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], # 設(shè)置數(shù)據(jù)縮放選項 xaxis_opts=opts.AxisOpts(name="影片名稱", axislabel_opts={"rotate": 20}), # 設(shè)置x軸標簽及標簽旋轉(zhuǎn)角度 yaxis_opts=opts.AxisOpts(name="票房(萬)") # 設(shè)置y軸標簽 ) ) # 由于文章篇幅的問題,部分代碼省略
以上代碼主要是針對各種數(shù)據(jù)指標進行數(shù)據(jù)可視化,最后將其顯示到網(wǎng)頁供程序調(diào)用。兩個柱形圖分別對票房Top1000的電影類型和票房Top10的總票房進行統(tǒng)計。五個折線圖分別是對票房Top10電影的各類票房、場次人次、票價、輿情、口碑五個方面的統(tǒng)計。最后兩個圖為電影名稱詞云圖和電影分類餅圖。
Showing()
該函數(shù)主要是對正在上映的電影進行數(shù)據(jù)分析,包含在映電影的票房、場次、人次、上座率五個柱形統(tǒng)計圖,影片票房占比、場次占比、人次占比三個餅狀統(tǒng)計圖,影片地域分布票房、場次、人次三個層疊柱形圖。
Industry()
該函數(shù)主要是對近期電影行業(yè)及電影行業(yè)歷史數(shù)據(jù)的可視化,主要包括熱門電影票房趨勢折線統(tǒng)計圖,特效廳票房占比分布餅狀圖。
6.總結(jié)
通過該課程設(shè)計的實踐訓(xùn)練,使學(xué)生掌握相關(guān)的智能數(shù)據(jù)處理與智能系統(tǒng)開發(fā)的知識,培養(yǎng)智能信息系統(tǒng)項目開發(fā)過程中的分析、設(shè)計和工程文檔編寫能力,提高工程應(yīng)用能力和綜合分析、解決實際問題的能力。
下面是該系統(tǒng)的主要功能及技術(shù)指標:
數(shù)據(jù)獲取和預(yù)處理:
使用pandas讀取數(shù)據(jù)文件;拆分不同的屬性信息,形成列表、元組、字典或集合;刪除空列或行;觀察數(shù)據(jù)并清洗錯誤數(shù)據(jù);
-使用pandas對數(shù)據(jù)整理,方便之后的分析和可視化。
數(shù)據(jù)分析:
使用numpy和pandas對數(shù)據(jù)預(yù)處理后的數(shù)據(jù)進行分析,設(shè)計七種以上的數(shù)據(jù)分析場景。
數(shù)據(jù)可視化:
利用Matplotlib和seaborn分別對每種分析場景可視化。
數(shù)據(jù)涉及的數(shù)據(jù)項:-ID -Title -Year -Age -IMDb -Rotten Tomatoes -Netflix -Hulu -Prime Video -Disney+ -Type -Directors -Genres -Country -Language -Runtime
使用到的庫包括:numpy、pandas、matplotlib、seaborn等。開發(fā)工具選用jupyter notebook或python IDE等Python開發(fā)工具。
以上就是基于Python實現(xiàn)的影視數(shù)據(jù)智能分析系統(tǒng)的詳細內(nèi)容,更多關(guān)于Python影視數(shù)據(jù)分析系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中的import、from import及import as的區(qū)別解析
在Python中,如果import的語句比較長,導(dǎo)致后續(xù)引用不方便,可以使用as語法,這篇文章主要介紹了python中的import、from import以及import as的區(qū)別,需要的朋友可以參考下2022-10-10python+elasticsearch實現(xiàn)標簽匹配計數(shù)操作
這篇文章主要介紹了python+elasticsearch實現(xiàn)標簽匹配計數(shù)操作,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2024-04-04Python實現(xiàn)采用進度條實時顯示處理進度的方法
這篇文章主要介紹了Python實現(xiàn)采用進度條實時顯示處理進度的方法,涉及Python數(shù)學(xué)運算結(jié)合時間函數(shù)顯示進度效果的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12PyQt5 QTableView設(shè)置某一列不可編輯的方法
今天小編就為大家分享一篇PyQt5 QTableView設(shè)置某一列不可編輯的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06python matplotlib實現(xiàn)雙Y軸的實例
今天小編就為大家分享一篇python matplotlib實現(xiàn)雙Y軸的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python使用Gradio實現(xiàn)免費的內(nèi)網(wǎng)穿透
內(nèi)網(wǎng)穿透是一種將內(nèi)部網(wǎng)絡(luò)服務(wù)暴露到公共網(wǎng)絡(luò)的技術(shù),可以讓外部用戶訪問內(nèi)部網(wǎng)絡(luò)上的服務(wù),本文將介紹如何使用Gradio實現(xiàn)免費的內(nèi)網(wǎng)穿透,需要的可以參考下2024-03-03Python簡單實現(xiàn)自動刪除目錄下空文件夾的方法
這篇文章主要介紹了Python簡單實現(xiàn)自動刪除目錄下空文件夾的方法,涉及Python針對文件與目錄的讀取、判斷、刪除等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08