python电影数据分析报告_电影数据可视化项⽬分析报告
代码部分
导⼊模块
这⾥除了基础模块意外,主要介绍可视化模块即matplotlib和seaborn。matplotlib是常⽤的数据可视化模块,主要是做散点图,线形图和柱状图等。seaborn主要做热图,这篇⽂章(机器学习之泰坦尼克号存活预测)中的相关性的可视化。
import json
import pandas as pd
import numpy as np
#数据可视化
import matplotlib.pyplot as plt
import plotly.offline as pyo #⽤不好,运⾏没有效果放到最后待后续解决
import seaborn as sns
%matplotlib inline
from wordcloud import WordCloud
导⼊数据
这⾥导⼊的数据是由Kaggle提供的TMDB的5000部电影相关信息,在编码的时候为了后边处理⽅便我们将时间的格式进⾏了处理,并删除了⽆⽤的和重复的信息。
credits_file = '.../tmdb_5000_credits.csv'
movies_file = '.../tmdb_5000_movies.csv'
credits = pd.read_csv(credits_file, encoding='utf-8')
movies = pd.read_csv(movies_file, parse_dates=['release_date'])
#删除⽆⽤信息
full.drop('status',axis=1,inplace=True)
full.drop('tagline',axis=1,inplace=True)
full.drop('overview',axis=1,inplace=True)
填补缺失值
因为数据⽐较完整,所以仅针对其运⾏时间进⾏填补即可。这⾥我直接查了两部电影的播放时长,逐⼀进⾏填补。
#填充runtime缺失值,分别填写94.0和240.0
values1 = {'runtime': 94.0}
lvm和zfsvalues2 = {'runtime': 240.0}
full.fillna(value=values1, limit = 1 , inplace = True)
full.fillna(value=values2, limit = 1 , inplace = True)
提取特征值
因为这⾥的数据是从TMDB官⽹上直接爬取下来的数据,很多信息都是以⽹页代码的形式出现的,我们需要对其进⾏解析,这⾥主要中的就是json的⽅法进⾏解析。
json_cols = 'cast', 'crew','genres','keywords','production_companies','production_countries','spoken_languages'
for c in json_cols:
full[c] = full[c].map(json.loads)
def value_update(s, d, idxes):
for idx in idxes:
d[idx] = s[idx]
while循环打印1到10def calculate_json_col(row, src_col, kept_cols):
df = None
if row[src_col]:
df = pd.DataFrame.from_records(row[src_col])
else:
df = pd.DataFrame()
if kept_cols:
value_update(row, df, kept_cols)
return df
def collect_json_col(src_df, src_col, kept_cols):
at(map(lambda x: calculate_json_col(src_df.loc[x],
src_col, kept_cols),
src_df.index),
axis=0, ignore_index=True)
上述代码就是利⽤⾃定义函数的⽅法,将cast等信息进⾏json解析。下⾯就是提取这些信息并删除原有的信息。
kept_cols = ['title', 'movie_id']
cast_df = collect_json_col(full, 'cast', kept_cols)
crew_df = collect_json_col(full, 'crew', kept_cols)
python请求并解析json数据genres_df = collect_json_col(full, 'genres', kept_cols)
keywords_df = collect_json_col(full, 'keywords', kept_cols)
production_companies_df = collect_json_col(full, 'production_companies', kept_cols)
spoken_languages_df = collect_json_col(full, 'spoken_languages', kept_cols)
production_countries_df = collect_json_col(full, 'production_countries', kept_cols)
son_cols = ['production_countries', 'spoken_languages', 'production_companies', 'keywords', 'genres', 'crew', 'cast']
full.drop(json_cols, axis=1, inplace=True)
数据可视化
⾸先对电影风格进⾏数据可视化,因为⼀般⼀个电影有很多的电影风格,如喜剧,惊悚等,我们直接对其进⾏分类并统计,饼状图和柱状图更能体现其占⽐。在数据可视化中,除特殊表达⽅法,⼀般柱状图是由最⾼⾄最低顺序排列。这⾥主要就是利⽤matplotlib包进⾏绘制饼状图和柱状图。
genres_catl = genres_df['name'].value_counts()
genres_catl = genres_catl / genres_catl.sum()
others = 0.01
genres_catl_ = genres_catl[genres_catl>=others]
genres_catl_['Other'] = genres_catl[genres_catl
explode = (genres_catl_ <= 0.02) / 20 + 0.05
genres_catl_.plot(kind='pie', label='', startangle=50, shadow=False,
figsize=(10,10), autopct="%1.1f%%", explode=explode)
其次电影产地,这⾥我主要采⽤饼状图,因为柱状图会显得USA特别的⾼,不如饼状图美观。
#电影产地
ct_catl = production_countries_df['name'].value_counts()
ct_catl = ct_catl / ct_catl.sum()
others = 0.04
ct_catl_ = ct_catl[ct_catl>=others]
ct_catl_['Other'] = ct_catl[ct_catl
explode = np.zeros(len(ct_catl_)) + 0.05
ct_catl_.plot(kind='pie', explode=explode, autopct="%1.1f%%",
figsize=(10,10), label='', startangle=120, shadow=False)
css描述
对于年份,要先进⾏预处理,⾸先选取年份这个数值,利⽤函数对其处理改成年代,再进⾏数据可视化分析。
#电影年份
full['release_year'] = full['release_date'].dt.year
full['release_month'] = full['release_date'].dt.month.fillna(0)
full['decade'] = full['release_year'].apply(lambda x:((x-1900)//10)*10)
def get_stats(gr):
return {'min':gr.min(),'max':gr.max(),'count': gr.count(),'mean':gr.mean()}
test = full['release_year'].groupby(full['decade']).apply(get_stats).unstack()
sns.set_context("poster", font_scale=0.85)
def label(s):
val = (1900 + s, s)[s < 100]
chaine = '' if s < 50 else "{}'s".format(int(val))代码生成器python
return chaine
<('font', weight='bold')
f, ax = plt.subplots(figsize=(11, 6))
labels = [label(s) for s in test.index]
sizes = test['count'].values
explode = [0.2 if sizes[i] < 100 else 0.01 for i in range(11)]
ax.pie(sizes, explode = explode, labels=labels,
autopct = lambda x:'{:1.0f}%'.format(x) if x > 1 else '',
shadow=False, startangle=0)
ax.axis('equal')
ax.set_title('按照年代划分',
bbox={'facecolor':'k', 'pad':5},color='w', fontsize=16);
full.drop('decade', axis=1, inplace = True)
关键字⽐较多,⽆论柱状图还是饼状图都难以表现出来,所以这⾥⽤照⽚墙来体现这部分内容更加的美观。这⾥⽤的就是wordcloud包来数
据可视化。
#照⽚墙
wc = WordCloud(background_color='white', max_words=2000, random_state=1). \
generate_from_frequencies(keywords_df['name'].value_counts().to_dict())
plt.figure(figsize=(16, 8))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
总结
c程序设计是什么课经过这⼏天的学习,数据可视化本⾝就是⼀门学问,其主要体现的是对数据的提取,将其提取成我们需要的格式,其次就是选取模型,如饼状图,热图等。⼀⽅⾯为了美观,另⼀⽅⾯为了更加⽅便和有效的阐述结论,所以数据可视化最为注重的就是直观,美观,⾼效地表达观点。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论