目錄
介紹
導入庫
讀取資料
檢視資料
資料可視化
電影與電視的對比
哪些月份添加影視資源到netfix的最多
電影适合觀看的年齡級别
釋出電影最多的15個年份
電影制作最多的10個國家
電影時長分析
電影類型詞雲圖
各電影類型統計
釋出電視劇最多的15個年份
電視劇制作最多的10個國家
季數最長的10個電視劇
根據電影名推薦
介紹
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')