淺析豆瓣電影TOP250榜單——C3 數(shù)據(jù)處理

核對數(shù)據(jù)收集階段保存的douban_top250_demo.csv文件,確認與預期效果一致后,保存為douban_top250.csv用于數(shù)據(jù)處理。
這樣可以避免在數(shù)據(jù)處理階段反復向豆瓣服務器發(fā)出數(shù)據(jù)請求,被反爬蟲機制屏蔽。

數(shù)據(jù)處理、分析和展示階段,我們主要任務是格式化數(shù)據(jù),根據(jù)處理過的數(shù)據(jù)來制作相應的分析圖像。需要導入以下幾個python庫:

import re
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from PIL import Image
from collections import Counter
from wordcloud import WordCloud, ImageColorGenerator
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model

開始處理數(shù)據(jù),大致操作思路如下:
先打開文件,再讀取整個文件,以逗號分割為列表對象,然后轉化為250×7的ndarray對象,對應7列數(shù)據(jù),每列250個元素,最后將其轉換為DataFrame對象并加上每列的列名,以方便后續(xù)調用。

with open('douban_top250.csv') as f:  # 打開文件
    text_f = f.read().strip()  # 讀取文件得到str型文本
list_f = re.split('[,\n]', text_f)  # 分割str文本并轉換為list型
array_f = np.array(list_f).reshape(250, 7)  # 轉換為250×7的數(shù)組
columns_df_f = ['電影名稱', '評分', '評分人數(shù)', '上映年份', '國家', '類型', '短評']  # 列名
df_f = pd.DataFrame(array_f, columns=columns_df_f)  # 轉為DataFrame類
print(df_f)

打印得到如下結果:

  電影名稱   評分    評分人數(shù)  上映年份   國家    類型  \
0 肖申克的救贖  9.6  833069  1994    美國       犯罪 劇情   
1 這個殺手不太冷  9.4  799185  1994 法國      劇情 動作 犯罪   
2 霸王別姬  9.5  595660  1993   中國大陸 香港   劇情 愛情 同性   
3 阿甘正傳  9.4  684515  1994  美國   劇情 愛情   
4 美麗人生  9.5  397936  1997  意大利 劇情 喜劇 愛情 戰(zhàn)爭   
...      ...      ...   ...    ...   ...    ...
247 彗星來的那一夜  8.3  148590  2013   美國 英國 科幻 懸疑 驚悚   
248 黑鷹墜落  8.5  100794  2001  美國    動作 歷史 戰(zhàn)爭   
249 假如愛有天意  8.2  215610  2003  韓國      劇情 愛情   
               短評  
0             希望讓人自由。  
1         怪蜀黍和小蘿莉不得不說的故事。  
...              ...
248       還原真實而殘酷的戰(zhàn)爭。  
249          瓊瑤阿姨在韓國的深刻版。  
[250 rows x 7 columns]

片名匯總

DataFrame類型的數(shù)據(jù)在提取列信息方面十分方便。
匯總榜單上所有電影的名字只需將df_f對象的'電影名稱'元素賦給變量即可。

titles = df_f['電影名稱']  # 提取片名列  
print(titles)

打印結果如下:

0         肖申克的救贖
1        這個殺手不太冷
2           霸王別姬
3           阿甘正傳
4           美麗人生
5           千與千尋
     ...
244         廊橋遺夢
245         罪惡之城
246         兩小無猜
247      彗星來的那一夜
248         黑鷹墜落
249       假如愛有天意
Name: 電影名稱, Length: 250, dtype: object

制片國家及影片類型信息處理

處理國家名及影片類型信息的方法與處理片名的方法大同小異。

countries = df_f['國家']  # 提取數(shù)組中的國家名數(shù)據(jù)  
print(countries)

這里需要注意觀察返回的結果中的:

2         中國大陸 香港

可以看出存在一部影片有多個制作公司的情況,如果要計數(shù)則需要解壓元素。

list_countries = ' '.join(countries).split()  # 由于存在一部電影有多個制片國家,需要解壓出。
print(list_countries)

得到列表類的結果如下:

['美國', '法國', '中國大陸', '香港', '美國', '意大利', ... ,'美國', '英國', '美國', '韓國']

對列表元素進行計數(shù),使用內置的collections庫的Counter將列表轉化為字典,其中key為原列表中的元素,value為該元素在列表中出現(xiàn)的次數(shù)。

dict_countries0 = Counter(list_countries)  # 轉換成字典類并計數(shù)
print(dict_countries0)

Counter({'美國': 143, '英國': 34, '日本': 29, '法國': 27,...,'博茨瓦納': 1, '愛爾蘭': 1})

這樣也可以很容易得到總共有多少個不同國家出現(xiàn):

total_countries = len(dict_countries0)  # 字典長度,即出現(xiàn)的不同國家個數(shù)
print(total_countries)

31

num_countries_show = 12  # 控制參數(shù),顯示國家的個數(shù),其余用“其他”來概括
dict_countries = list(dict_countries0.most_common(num_countries_show))  # 提取前12個
countries_rest = dict_countries0.most_common()[num_countries_show:]  # 第12個以后合并為一項
size = [i[1] for i in dict_countries]  #
size.append(sum(i[1] for i in countries_rest))
labels = [i[0] for i in dict_countries]
labels.append('其他')

榜單上影片的類型的數(shù)據(jù)處理與制片國家數(shù)據(jù)處理類似。

genres = df_f['類型']
list_genres = ' '.join(genres).split()
dict_genres0 = Counter(list_genres)
total_genres = len(dict_genres0)
num_genres_show = 14  # 控制參數(shù),顯示類型的個數(shù),其余用“其他”來概括
dict_genres = list(dict_genres0.most_common(num_genres_show))
genres_rest = dict_genres0.most_common()[num_genres_show:]
size = [i[1] for i in dict_genres]
size.append(sum(i[1] for i in genres_rest))
labels = [i[0] for i in dict_genres]
labels.append('其他')

上榜年份信息處理

在年份分析部分除了我們需要注意上榜年份為零的數(shù)據(jù)是不顯示的,需要我們另外添加。

date_movie = df_f['上映年份']
min_date = int(min(date_movie))
max_date = int(max(date_movie))
range_date = range(min_date, max_date + 1)  # 上榜電影年份范圍
dict_date0 = Counter(date_movie)  # 轉換為年份與對應出現(xiàn)次數(shù)的字典
k = [int(key) for key in dict_date0.keys()]  # 構造上榜年份列表
list_date0 = {key: dict_date0[str(key)] if key in k else 0 for key in range_date}  # 以零填充沒有上榜的年份的值
dict_date = Counter(list_date0)  # 轉換為字典并計數(shù)
keys_date, values_date = list(list_date.keys()), list(list_date.values())

評分、評論人數(shù)處理

抓取得到的評分、評論人數(shù)的數(shù)據(jù)可直接調用,處理方法相對比較簡單:

rate_movie = df_f['評分']
index_rate = rate_movie.index + 1  # 序號即排名(從1開始)
values_rate = rate_movie.values  # 得到評分值列表

comments_count = df_f['評分人數(shù)']
values_comments = comments_count.values


上一章: C2 數(shù)據(jù)收集

下一章: C4 分析&展示

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容