前言
前段时间爬取了豆瓣Top250的信息并进行了简单的数据分析,这里分析主要是提取关键词进行词云分析,以及电影类型的饼图和电影发布时间分析,分析比较简单。主要用到的库有pandas,jiebe, wordcloud ,matplotlib 。
过程
首先,爬取到的豆瓣Top250数据存入到csv中,爬取的信息如下
下面,我们想要对电影类型进行分析
可以发现类型是连在一起的没有分开,可以调用jieba库进行分词
typel=[]
for i in range(len(df['类型'])):
typel += jieba.lcut(df['类型'][i])
对分词后的结果调用词云wordcloud库制作词云
wc = wordcloud.WordCloud(
background_color='white', #背景色
collocations=False,
max_words=100,
font_path='STKAITI.TTF' #字体位置 c:\windows\fonts
)
wc.generate(",".join(typel))
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off') #不显示坐标轴
plt.savefig("./type.jpg")
plt.show() #显示正常的词云图片
这里没有输出成特定形状,如果想要输出成特定的形状,需加一行代码
mask=plt.imread('背景图片')
可以看出,豆瓣高分电影大多围绕着剧情,冒险,戏剧,爱情 等
下一步分析制片国家占比情况,分词步骤和上述类似,不同的是需要手动添加分词(这是因为原有词库不满足现分析)
for i in countries:
if i != ' ' and i !='/':
if i == '中国香港' or i == '大陆' or i =='香港' or i =='中国台湾' or i =='中国大陆' or i =='台湾':
i = '中国'
countries_dict[i] = countries.count(i)
只统计制片数量大于10 的国家,饼状图代码如下:
for key in countries_dict:
if countries_dict[key] < 10:
continue
a.append(key)
b.append(countries_dict[key])
vals = b#创建数据系列
fig, ax = plt.subplots()#创建子图
labels = a
l = len(labels)
explode=[0 for x in range(0,l)]
j=0
for i in range(len(labels)):
explode[i] = j
j = j+0.02
ax.pie(vals, labels=labels,
autopct='%1.1f%%', shadow=True, explode=explode,startangle=150,labeldistance = 1.1)
ax.set(aspect="equal", title='制片国家占比')#设置标题以及图形的对称
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.savefig("./countries_proportion.jpg")
plt.show()
得到的结果图如下
不难发现,美国占比最高,为46.9%,跟着的有英国12.3%,日本12.0%
接下来对电影发布年代进行分析,以每十年为一个间隔先赋初值0
yt={'1930-':0,
'1940-':0,
'1950-':0,
'1960-':0,
'1970-':0,
'1990-':0,
'2000-':0,
'2010-':0,
}
然后遍历文件中的数据,添加到对应的时间列去
这里使用try except ,是由于有极个别时间格式不一,造成的报错原因
for i in range(len(time)):
try:
t=datetime.strptime(time[i],'%Y')
if t >=pd.Timestamp('1930') and t <pd.Timestamp('1940'):
yt['1930-'] += 1
elif t >=pd.Timestamp('1940') and t <pd.Timestamp('1950'):
yt['1940-'] += 1
elif t >=pd.Timestamp('1950') and t <pd.Timestamp('1960'):
yt['1950-'] += 1
elif t >=pd.Timestamp('1960') and t <pd.Timestamp('1970'):
yt['1960-'] += 1
elif t >=pd.Timestamp('1970') and t <pd.Timestamp('1980'):
yt['1970-'] += 1
elif t >=pd.Timestamp('1980') and t <pd.Timestamp('1990'):
yt['1980-'] += 1
elif t >=pd.Timestamp('1990') and t <pd.Timestamp('2000'):
yt['1990-'] += 1
elif t >=pd.Timestamp('2000') and t <pd.Timestamp('2010'):
yt['2000-'] += 1
elif t >=pd.Timestamp('2010'):
yt['2010-'] += 1
except:
continue
对处理后的数据制作折线图
for key in yt:
c.append(key)
d.append(yt[key])
plt.plot(c, d, 'bo-', linewidth = 0.1)
plt.title('电影发布年代数量')
plt.legend()
for a, b in zip(c, d):
plt.text(a, b, (b),ha='center', va='bottom', fontsize=10)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.savefig("./movie_releasetime.jpg")
plt.show()
不难看出,豆瓣电影上榜的数量逐年代增加
温馨提示
最后,如果屏幕前的你对Python的数据分析还有什么问题或看法,可以给我留言。
感谢你的阅读。 github链接:github.com/Gavin-9527/…
附全部代码如下:
import pandas as pd
import jieba #分词
from matplotlib import pyplot as plt #数据可视化
import wordcloud
df=pd.read_csv('C:/Users/12943/eclipse-workspace/新大作业/myspider/myspider/spiders/model1.csv', encoding='GB18030').astype(str)
from datetime import datetime
#电影类型词云图
typel=[]
for i in range(len(df['类型'])):
typel += jieba.lcut(df['类型'][i])
wc = wordcloud.WordCloud(
background_color='white', #背景色
collocations=False,
max_words=100,
font_path='STKAITI.TTF' #字体位置 c:\windows\fonts
)
wc.generate(",".join(typel))
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off') #不显示坐标轴
plt.savefig("./type.jpg")
plt.show() #显示正常的词云图片
#制片国家占比图
countries=[]
for i in range(len(df['制片国家'])):
countries += jieba.cut(df['制片国家'][i])
countries_dict={}
for i in countries:
if i != ' ' and i !='/':
if i == '中国香港' or i == '大陆' or i =='香港' or i =='中国台湾' or i =='中国大陆' or i =='台湾':
i = '中国'
countries_dict[i] = countries.count(i)
a=[]
b=[]
for key in countries_dict:
if countries_dict[key] < 10:
continue
a.append(key)
b.append(countries_dict[key])
vals = b#创建数据系列
fig, ax = plt.subplots()#创建子图
labels = a
l = len(labels)
explode=[0 for x in range(0,l)]
j=0
for i in range(len(labels)):
explode[i] = j
j = j+0.02
ax.pie(vals, labels=labels,
autopct='%1.1f%%', shadow=True, explode=explode,startangle=150,labeldistance = 1.1)
ax.set(aspect="equal", title='制片国家占比')#设置标题以及图形的对称
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.savefig("./countries_proportion.jpg")
plt.show()
#电影发布年代图
time=[]
for i in range(len(df['上映日期'])):
time += jieba.cut(df['上映日期'][i])
yt={'1930-':0,
'1940-':0,
'1950-':0,
'1960-':0,
'1970-':0,
'1990-':0,
'2000-':0,
'2010-':0,
}
for i in range(len(time)):
try:
t=datetime.strptime(time[i],'%Y')
if t >=pd.Timestamp('1930') and t <pd.Timestamp('1940'):
yt['1930-'] += 1
elif t >=pd.Timestamp('1940') and t <pd.Timestamp('1950'):
yt['1940-'] += 1
elif t >=pd.Timestamp('1950') and t <pd.Timestamp('1960'):
yt['1950-'] += 1
elif t >=pd.Timestamp('1960') and t <pd.Timestamp('1970'):
yt['1960-'] += 1
elif t >=pd.Timestamp('1970') and t <pd.Timestamp('1980'):
yt['1970-'] += 1
elif t >=pd.Timestamp('1980') and t <pd.Timestamp('1990'):
yt['1980-'] += 1
elif t >=pd.Timestamp('1990') and t <pd.Timestamp('2000'):
yt['1990-'] += 1
elif t >=pd.Timestamp('2000') and t <pd.Timestamp('2010'):
yt['2000-'] += 1
elif t >=pd.Timestamp('2010'):
yt['2010-'] += 1
except:
continue
c=[]
d=[]
for key in yt:
c.append(key)
d.append(yt[key])
plt.plot(c, d, 'bo-', linewidth = 0.1)
plt.title('电影发布年代数量')
plt.legend()
for a, b in zip(c, d):
plt.text(a, b, (b),ha='center', va='bottom', fontsize=10)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.savefig("./movie_releasetime.jpg")
plt.show()