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