四、 Universal和Paramount两家影视公司的对比情况如何?
# 对比两家电影公司的电影发行情况 # 对电影公司的数据进行整理 moviesdf['prodcompanies']=moviesdf['production_companies'].apply(json.loads) moviesdf['prodcompany']=moviesdf['prodcompanies'].apply(decode) # 用到上面定义的函数 moviesdf.head()
moviesdf['Universal']=moviesdf['prodcompany'].str.contains('Universal Pictures').apply(lambda x:i if x else 0) moviesdf['Paramount']=moviesdf['prodcompany'].str.contains('Paramount Pictures').apply(lambda x:i if x else 0) moviesdf.tail()
a=moviesdf['Universal'].sum() b=moviesdf['Paramount'].sum() dict_companies={'Universal':a,'Paramount':b} dict_companies companies_number=pd.Series(dict_companies) companies_number.plot(kind='pie',label='',autopct='%11.1f%%')
company=moviesdf[['Universal','Paramount']] company.index=moviesdf['releaseyear'] companydf=company.groupby('releaseyear').sum() companydf.head() plt.figure(figsize=(10,7)) plt.plot(companydf,label=companydf.columns)
五、 改编电影和原创电影以及评分情况如何
# 通过keywords字段,分割改编电影与原创电影的对比 # 分析:在keywords字段中,如果存在based on novel 则说明电影改编自小说 moviesdf['keywds']=moviesdf['keywords'].apply(json.loads) moviesdf['keywds2']=moviesdf['keywds'].apply(decode) # 标注是否为基于小说改编的电影 a='based on novel' moviesdf['if_original']=moviesdf['keywds2'].str.contains(a).apply(lambda x:'no original' if x else 'original') moviesdf['if_original'].value_counts() # moviesdf.head(2) original_profit=moviesdf[['if_original','budget','revenue','profit']] original_profit_mean=original_profit.groupby(by='if_original').mean() original_profit_mean.head() plt.figure(figsize=(12,9)) original_profit_mean.plot(kind='bar') plt.title('原创电影与改编电影的预算,收入,利润比较') plt.xlabel('原创与改编') plt.ylabel('现金流') plt.xticks(rotation=0)
六、 电影时长与电影票房以及评分的关系
# 电影的runtime与票房,评分之间的关系 moviesdf.plot(kind='scatter',x='runtime',y='revenue',figsize=(10,7)) plt.title('电影时长与票房的关系',fontsize=15) plt.xlabel('时长(分钟)',fontsize=15) plt.ylabel('票房收入',fontsize=15)
# 电影的时长与评分之间的关系 moviesdf.plot(kind='scatter',x='runtime',y='vote_average',figsize=(10,7)) plt.title('电影时长与评分之间的关系',fontsize=15) plt.xlabel('时长(分钟)',fontsize=15) plt.ylabel('评分',fontsize=15)
七、 分析电影关键字
1、根据jieba生成词频计算
# 电影关键字词频计算和词云生成 keywords_list=[] for i in moviesdf['keywds2']: keywords_list.append(i) # keywords_list=list(keywords_list) lis=''.join(keywords_list) lis.replace('\'s','') lis
# 根据电影关键词生成词频计算 import jieba words=jieba.lcut(lis) counts={} mytext_list=[] for word in words: if len(word)==1: # 单个分词不需要 continue else: counts[word]=counts.get(word,0)+1 mytext_list.append(word.replace(" ","")) cloud_text=','.join(mytext_list) # print(cloud_text) items=list(counts.items()) items.sort(key=lambda x:x[1],reverse=True) for i in range(100): word,countsnt=items[i] print("{0:<10}{1:>5}".format(word,count))
from PIL import Image #需要下载安装PIL包 import numpy as np from wordcloud import WordCloud, ImageColorGenerator from matplotlib import pyplot as plt import pandas as pd
# 简单生成词云 wc=WordCloud( background_color='black', max_words=2000, max_font_size=100, min_font_size=10, random_state=12 ) wc.generate(lis) plt.figure(figsize=(12,9)) plt.imshow(wc) plt.axis('off') plt.show()
2、根据pkuseg生成词频计算
# 安装pkuseg !pip install pkuseg #调用北大算法和jieba算法得到的结果对于英文来说基本相同,但对于中文来说pkuseg会更加准确
#根据电影关键词生成词频计算 北大算法pkuseg # 根据电影关键词生成词频计算 import pkuseg seg=pkuseg.pkuseg() words=seg.cut(lis) # 与jieba的区别主要是调用的算法不同 counts={} mytext_list=[] for word in words: if len(word)==1: # 单个分词不需要 continue else: counts[word]=counts.get(word,0)+1 mytext_list.append(word.replace(" ","")) cloud_text=','.join(mytext_list) # print(cloud_text) items=list(counts.items()) items.sort(key=lambda x:x[1],reverse=True) for i in range(100): word,count=items[i] print("{0:<20}{1:>5}".format(word,count))
八、分析演员的关联度(社会网络计算)
# 分析演员的关联度(社会网络计算) moviesdf['actorsls'] actors_list=[] actorsforcut=[] # 将每部电影的演员放在列表当中 for i in moviesdf['actorsls']: actors_list.append(i.split(',')) # 将演员列表中的对象放置到为分割而设置的另一个列表 for k in range(0,len(actors_list)): for j in range(len(actors_list[k])): actorsforcut.append(actors_list[k][j]) actors_list=''.join(actorsforcut) actors_list
此时生成的actors_list[0:100]
:
wc=WordCloud( background_color='black', max_words=2000, max_font_size=100, min_font_size=10, random_state=12 ) wc.generate(actors_list) plt.figure(figsize=(12,9)) plt.imshow(wc) plt.axis('off') plt.show()
此时生成的词云是不完整的
改进方法:变换词云的结构:
# 改进方案: # 分析演员的关联度(社会网络计算) moviesdf['actorsls'] actors_list=[] actorsforcut=[] # 将每部电影的演员放在列表当中 for i in moviesdf['actorsls']: actors_list.append(i.split(',')) # 将演员列表中的对象放置到为分割而设置的另一个列表 for k in range(0,len(actors_list)): for j in range(len(actors_list[k])): actorsforcut.append("'"+actors_list[k][j]+"'") # 在这里对每个人的姓名前后都加上单引号 actors_list=','.join(actorsforcut) actors_list[0:100]
此时生成的actors_list[0:100]
:
将演员中间的空格去除,并合并为一个整体
# 如何将演员中间的空格去除,并合并为一个整体 movieactorsdfv2=moviesdf['actorsls'].apply(lambda x:''.join(x.split())).replace() movieactorsdfv2.head(2) movieactorsdfv2.to_csv('actors.txt',index=False,header=False)
# 读取数据并加载字典 with open('actors.txt',encoding='utf-8-sig') as f: actorstxt=f.readlines() # 此处的actors_forcut是手工查找替换单引号等完成的,在进行DF转换中可以直接处理 jieba.load_userdict("actors_forcut")
actorsforcut actorsdf=pd.DataFrame(actorsforcut).drop_duplicates() actorsdf[0]=actorsdf[0].apply(lambda x:''.join(x.split())).replace() # 将中间的空格删除 # 此时拿到了完整的人物列表 actorsdf[0]=actorsdf[0].apply(lambda x:''.join(x.split('\''))).replace() # 将姓名两边的单引号去除 actorsdf['']='nr' actorsdf.to_excel('actorsdf.xlsx',index=False) actorsdf.head()
movieactorsdfv2=pd.DataFrame(moviesdf['actorsls']) movieactorsdfv2.head(5)
思路:如果我们按照actorsdf去寻找movieactorsdfv2,只要在电影里面找到了演员的名字,则在对应的actorsdf上面加一,就能知道哪些演员演过的电影最多。并且还可以将不同演员之间建立关系,最后使用pyechart进行可视化。