目录
介绍
netfix影视资源项目主要通过Python进行数据预处理,分析netfix上发布电影、电视资源的对比情况,制作电影、电视最多的年份、国家,以及生成电影类型的词云图,影视资源的关联推荐等。
导入库
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import os
import plotly.express as px
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Image
from datetime import datetime
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.simplefilter('ignore')
from collections import Counter
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
读取数据
df=pd.read_csv('netflix_titles.csv')
查看数据
df.info()
- 缺失值:director,cast,country,date_added,rating
df.describe()
df.describe(include='object')
data_movie=df[df['type']=='Movie']#电影
data_tv=df[df['type']=='TV Show']#电视
数据可视化
电影与电视的对比
grouped_type=df.groupby(['type'])
data_type=grouped_type.count().show_id
px.bar(data_type,x=data_type.index,y=data_type.values)
哪些月份添加影视资源到netfix的最多
df.isna().sum()
data_date_added=DataFrame([])
data_date_added['date_added']=df['date_added'].dropna()
data_date_added.date_added=data_date_added.apply(lambda x:pd.to_datetime(x))
data_date_added['year']=data_date_added.date_added.dt.year
data_date_added['month']=data_date_added.date_added.dt.month
grouped_date=data_date_added.groupby(['year','month']).count()
grouped_date.reset_index(inplace=True)
grouped_date.rename(columns={'date_added':'count_num'},inplace=True)
pivot_date=grouped_date.pivot_table(index='month',columns='year',values='count_num',fill_value=0)
pivot_date
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure(figsize=[15,15])
sns.heatmap(pivot_date,annot=True,linewidths=.5,cmap="YlGnBu")
plt.title('每个月份添加影视资源到netfix的数量',fontsize=22)
plt.xlabel('年份',fontsize=18)
plt.ylabel('月份',fontsize=18)
- 每年的9月份到次年的1月份添加影视资源较多
- 2017年以后添加影视资源较多
电影适合观看的年龄级别
data_rating=data_movie.groupby('rating').count().loc[:,'show_id'].reset_index()
data_rating.sort_values('show_id',ascending=False,inplace=True)
plt.figure(figsize=[8,15])
px.bar(data_rating,x='rating',y='show_id',labels={'show_id':'count_num'},text='show_id',title='电影适合观看的年龄级别')
发布电影最多的15个年份
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure(figsize=[12,10])
sns.set(style='darkgrid')
sns.countplot(data=data_movie,y='release_year', order=data_movie['release_year'].value_counts().index[0:15])#取发布年份最多的15条数据
2018年发布的资源最多,2017,2019, 2016, 2020年发布的资源也较多
电影制作最多的10个国家
data_movie.isna().sum()
data_country=DataFrame([])
data_country['country']=data_movie.country.fillna('unknow')
data_country.country.value_counts()
data_country['country_name']=data_country.country.apply(lambda x: x.split(',')[0])
plt.figure(figsize=[12,16])
sns.countplot(data=data_country,y='country_name',order=data_country['country_name'].value_counts().index[0:10])
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.title('电影制作最多的10个国家')
电影时长分析
data_movie.duration.apply(lambda x: x.split(' ')[1]).value_counts()
data_movie['duration_min']=data_movie.duration.apply(lambda x: int(x.split(' ')[0]))
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure(figsize=[12,10])
data_movie.duration_min.plot(kind='kde',label='电影时长(分)')
plt.xlabel('电影时长(分)',fontsize=15)
plt.title('电影时长分析')
plt.legend(loc='best')
netfix上的电影普遍在90-120分钟左右
电影类型词云图
listed_in_list=list(data_movie.listed_in)
gen=[]
for i in listed_in_list:
gen.extend(i.split(', '))
g=Counter(gen)
text=list(set(gen))
%matplotlib inline
plt.figure(figsize=[10,14])
wordcloud=WordCloud(max_words=10000,background_color="white").generate(str(text))
plt.imshow(wordcloud,interpolation="bilinear")
plt.axis("off")
plt.title('电影类型',fontsize=20)
各电影类型统计
g_df=DataFrame({'category':list(g.keys()),'count of movies':list(g.values())})
g_df.sort_values('count of movies',ascending=False,inplace=True)
g_df.reset_index(drop=True,inplace=True)
plt.figure(figsize=(50,20))
sns.barplot(data=g_df,x='category',y='count of movies')
# plt.rcParams["axes.labelsize"] = 40
# plt.rcParams["ytick.labelsize"] = 35
# plt.rcParams["xtick.labelsize"] = 35
plt.xticks(rotation=60,fontsize=40)
plt.yticks(fontsize=40)
plt.xlabel(xlabel='category',fontsize=50)
plt.ylabel(ylabel='count of movies',fontsize=50)
plt.title('各电影类型统计',fontsize=55)
plt.show()
出现较频繁的电影类型有International Movies ,Dramas,Comedies
发布电视剧最多的15个年份
plt.figure(figsize=[12,10])
sns.set(style='darkgrid')
sns.countplot(data=data_movie,y='release_year', order=data_tv['release_year'].value_counts().index[0:15])#取发布年份最多的15条数据
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.title(r'发布电视剧最多的15个年份')
plt.show()
2019,2018,2017,2016年电视剧发布的最多。
电视剧制作最多的10个国家
data_tv.isna().sum()
data_country=DataFrame([])
data_country['country']=data_tv.country.fillna('unknow')
data_country.country.value_counts()
data_country['country_name']=data_country.country.apply(lambda x: x.split(',')[0])
data_country['country_name'].value_counts()
plt.figure(figsize=[12,16])
sns.countplot(data=data_country,y='country_name',order=data_country['country_name'].value_counts().index[0:10])
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.title('电视剧制作最多的10个国家')
plt.show()
美国制作的电视剧最多
季数最长的10个电视剧
data_tv.duration.isna().sum(),data_tv.title.isna().sum()
data_tv.duration.value_counts()
data_tv_duration=data_tv[['title','duration']]
data_tv_duration.duration=data_tv_duration.duration.str.replace(' Seasons','')
data_tv_duration.duration=data_tv_duration.duration.str.replace(' Season','')
data_tv_duration.duration=data_tv_duration.duration.apply(lambda x:int(x))
duration_top10=data_tv_duration.sort_values(by='duration',ascending=False)[:10]
plt.figure(figsize=[26,18])
duration_top10.plot(kind='bar',x='title',y='duration',fontsize=12)
plt.title('季数最长的10个电视剧',fontsize=20)
plt.xticks(rotation=60)
plt.xlabel('电视剧')
plt.ylabel('季数')
plt.show()
根据电影名推荐
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix =tfidf.fit_transform(df['description'])
tfidf_matrix.shape
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
indices = pd.Series(df.index, index=df['title']).drop_duplicates()
def get_recommendations(title, cosine_sim=cosine_sim):
idx = indices[title]
# Get the pairwsie similarity scores of all movies with that movie
sim_scores = list(enumerate(cosine_sim[idx]))
# Sort the movies based on the similarity scores
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# Get the scores of the 10 most similar movies
sim_scores = sim_scores[1:11]
# Get the movie indices
movie_indices = [i[0] for i in sim_scores]
# Return the top 10 most similar movies
return df['title'].iloc[movie_indices]
get_recommendations('Psychokinesis')