Python数据分析加简单可视化(豆瓣电影Top250)

1,204 阅读3分钟

前言

前段时间爬取了豆瓣Top250的信息并进行了简单的数据分析,这里分析主要是提取关键词进行词云分析,以及电影类型的饼图和电影发布时间分析,分析比较简单。主要用到的库有pandas,jiebe, wordcloud ,matplotlib

过程

首先,爬取到的豆瓣Top250数据存入到csv中,爬取的信息如下

068e8d4582d42522b20f9882e1e7dd7.png 下面,我们想要对电影类型进行分析

可以发现类型是连在一起的没有分开,可以调用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('背景图片')

可以看出,豆瓣高分电影大多围绕着剧情,冒险,戏剧,爱情

4cd4457a85c348457f98f329132f2a6.png

下一步分析制片国家占比情况,分词步骤和上述类似,不同的是需要手动添加分词(这是因为原有词库不满足现分析)

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%

a30f683fc515e050fc4f4e2acbb10ef.png

接下来对电影发布年代进行分析,以每十年为一个间隔先赋初值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()

不难看出,豆瓣电影上榜的数量逐年代增加

3c3d29b500eada0cabd7ece50a29011.png

温馨提示

最后,如果屏幕前的你对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()