电影数据分析
import json
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore') #忽略python运行过程中的警告错误
credits=pd.read_csv(r'C:\Users\lenovo\Desktop\tmdb\tmdb_5000_credits.csv')
movies=pd.read_csv(r'C:\Users\lenovo\Desktop\tmdb\tmdb_5000_movies.csv')
fulldf=pd.concat([credits,movies],axis=1) #合并数据集
moviesdf=fulldf[['original_title','crew','release_date','genres','keywords','production_companies','production_countries','revenue','budget',
'runtime','vote_average']] #选区子集
moviesdf['profit']=moviesdf['revenue']-moviesdf['budget']#增加一列利润
#moviesdf.info()
#moviesdf[moviesdf['runtime'].isnull()]
moviesdf['release_date']=moviesdf['release_date'].fillna('2004-6-1') #填充空值
moviesdf['release_date']=pd.to_datetime(moviesdf['release_date'],format='%Y-%m-%d') #转时间类型
moviesdf.fillna(value={'runtime':98.0},inplace=True,limit=1)
moviesdf.fillna(value={'runtime':81.0},inplace=True,limit=1) #字符串索引必须为整数
moviesdf['genres']=moviesdf['genres'].apply(json.loads) #把json转为dict, apply默认遍历一行或多行
def decode(column):
li=[]
for i in column:
li.append(i['name'])
return ' '.join(li) #将列表中元素用空格连接起来生成一个新的字符串
moviesdf['genres']=moviesdf['genres'].apply(decode)
#提取电影类型
genres_list=set() #去重
for i in moviesdf['genres']:
for j in i.split(' '):
genres_list.add(j)
genres_list.remove('')
for i in genres_list:
moviesdf[i]=moviesdf['genres'].str.contains(i).apply(lambda x:1 if x else 0) #将序列转换为字符串
moviesdf['release_date']=pd.to_datetime(moviesdf['release_date']).dt.year #获取时间中的年
#moviesdf['release_date'].head()
genres_list=list(genres_list)
genres_year=moviesdf.loc[:,genres_list] #获取所有行,列在genres_list列表的列
genres_year.index=moviesdf['release_date'] #设置时间为索引
genres_year=genres_year.groupby(['release_date']).sum() #通过时间分组求和
genres_sum=genres_year.sum(axis=0).sort_values(ascending=True) #求出所有电影类型的总和 ,其中sum(axis=0)表示矩阵按列相加
#可视化(各电影类型的数据量) 条形图
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(12,8))
plt.title('各种电影类型数据量统计图',fontsize=15)
plt.xlabel('电影数量(部)',fontsize=15)
plt.ylabel('电影类型',fontsize=15)
plt.tick_params(labelsize=12) #控制刻度字体大小
plt.barh(genres_sum.index,genres_sum.values)