1.查看数据结构:
['数据获取日期', '演员', '视频ID','详细链接', '剧名','状态', '类型', '来源平台', '整理后剧名', '更新时间', '上映时间', '语言', '评分','地区','上映年份','简介', '导演','差评数', '评分人数', '播放量','更新至','总集数','第几季', '好评数']
2.求以下内容:
(1)填充缺失数据,字符串字段填充为"缺失数据",其他字段填充0.---if else
(2)清洗数据,'数据获取日期'列,格式:将2016年5月4日--->2016.5.4
(3)求好评率前20的导演,并用柱状图绘图。好评率:好评率 = 好评数 / 评分人数。
(4)判断从2001-2006年起数据是否有异常值(评分人数、好评人数)
(5)查看2001-2006年每年的正常数据。
3.代码操作:
(1)数据导入:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
from bokeh.plotting import figure,show,output_file
from bokeh.models import ColumnDataSource
from bokeh.models import HoverTool
from bokeh.palettes import brewer
from bokeh.models.annotations import BoxAnnotation
from bokeh.layouts import gridplot
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']#解决绘图中文乱码问题
import os
os.chdir("/Users/liyili2/Downloads/datas/python_wei/04/")
video=pd.read_csv("爱奇艺视频数据.csv",encoding = 'GB18030')
print(video.head())

(2)处理缺失值
def data_cleaning(df):
cols=df.columns
for col in cols:
if df[col].dtype=='object':
df[col].fillna('缺失数据',inplace=True)
else:
df[col].fillna(0,inplace=True)
return (df)
data_c1=data_cleaning(video)

(3)处理日期:
def data_time(df,*cols):
for col in cols:
df[col] = df[col].str.replace('年','.')
df[col] = df[col].str.replace('月','.')
df[col] = df[col].str.replace('日','')
df[col] = pd.to_datetime(df[col])
return(df)
data_c2=data_time(data_c1,'数据获取日期')
print(data_c2.head())

(4)统计好评率前20的导演
df_dir=data_c2.groupby('导演')[['好评数','评分人数']].sum()
df_dir['好评率']=df_dir['好评数']/df_dir['评分人数']
top_20=df_dir.sort_values(['好评率'],ascending=False)[:20]
top_20['好评率'].plot(kind='bar',
color='k',
width = 0.8,
alpha = 0.4,
rot = 45,
grid = True,
ylim = [0.98,1],
figsize = (12,4),
title = '不同导演电影的好评率')

(5)判断从2001-2006年起数据是否有异常值(评分人数、好评人数)
data_c3=data_c2[['上映时间','好评数','评分人数']].drop_duplicates()
data_c3=data_c3[data_c3['上映时间']!=0]
data_c4=data_c3.groupby('上映时间')['好评数','评分人数'].sum()
fig,axes=plt.subplots(4,4,figsize=(20,16))
start = 2001
for i in range(4):
for j in range(4):
print(i,j)
print(start)
data = data_c3[data_c3['上映时间'] == start]
sns.boxplot(data=data[['评分人数','好评数']],ax=axes[i,j])
# 创建矩阵箱型图
start += 1


(6)查看异常值
a = data_c3[data_c3['上映时间'] == 2001]
def data_error(df,col):
q1 = df[col].quantile(q=0.25) # 上四分位数
q3 = df[col].quantile(q=0.75) # 下四分位数
iqr = q3 - q1 # IQR
tmax = q3 + 3 * iqr # 外限最大值
tmin = q1 - 3 * iqr # 外限最小值
# print(tmax,tmin)
return(tmax,tmin)#,tmin
# 创建函数,得到外限最大最小值
for i in range(2000,2016):
datayear = data_c3[data_c3['上映时间'] == i] # 筛选该年度的数据
print('%i年有%i条数据' % (i,len(datayear))) # 查看每年的数据量
t = data_error(datayear,'评分人数') # 得到外限最大最小值
print(t)
print(datayear[datayear['评分人数'] > t[0]]) # 查看评分人数大于外限最大值的异常值
print('-------\n')
# 查看异常值信息,为什么大于这个值就可以,小于下限的值就不是异常值呢
网友评论