每次爬虫爬到了许多数据,虽然有点成就感,但是只能干看着,还是不行。所以来看下python三大数据分析利器。
本次以爬取到的IMDB250电影数据为例,使用pandas处理数据,并用matplotlib画图将数据结果展示出来。
首先来看下爬到的部分数据结果,从MongoDB中取出来

cli = pymongo.MongoClient()

collection = cli.movie.imdb

# 从MongoDB中取数据
data = list(collection.find())
cli.close()

print(data[0])

{‘id’: ObjectId(‘5c989f7fabe13ca3445cdfe3’),
‘title’: ‘The Shawshank Redemption’,
‘year’: 1994,
‘rating_point’: 9.2,
‘rating_peo’: 2066713,
‘url’: 'https://www.imdb.com/title/tt0111161/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=e31d89dd-322d-4646-8962-327b42fe94b1&pf_rd_r=Q5C2WA5ED5T11DDRBY69&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref=chttp_tt_1’}

可以看到这个里面有id,url是我们不需要的数据,所以需要对数据重新整理下,取出有分析价值的数据,分别是,电影名称,年份,评分,评分人数。

# 对数据进行整理,取出有分析价值的数据
movies =[] 
for movie in data:
    movie_dic = {}
    movie_dic["title"] = movie["title"]
    movie_dic["year"] = movie["year"]
    movie_dic["rating_point"] = movie["rating_point"]
    movie_dic["rating_peo"] = movie["rating_peo"]
    movies.append(movie_dic)

数据准备完毕,我们用pandas来简单操作下

# pd.DataFrame,pandas的二维数据类型
movies = pd.DataFrame(movies)
#查看前5组数据
print(movies.head(5))

>    rating_peo       rating_point                  title           year
0     2066713           9.2             The Shawshank Redemption    1994
1     1417974           9.2                    The Godfather  		1972
2      983809           9.0               The Godfather: Part II  	1974
3     2032824           9.0            			The Dark Knight  	2008
4      583312           8.9              		12 Angry Men  		1957

看样子,数据还不错,但是还要看下数据组有没有缺失和类型,我们使用info()方法来看下。

# 数组信息概览,行数,列数,列索引,列非空值个数,列类型,内存占用
print(movies.info())

> <class 'pandas.core.frame.DataFrame'>
RangeIndex: 250 entries, 0 to 249
Data columns (total 4 columns):
rating_peo      250 non-null int64
rating_point    250 non-null float64
title           250 non-null object
year            250 non-null int64
dtypes: float64(1), int64(2), object(1)
memory usage: 6.9+ KB
None

感觉这个方法很方便,很强大。我们看到,各个列的类型,非空的个数,数据很不错。
还有个方法可以快速综合统计数据,describe()

# 快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值
print(movies.describe())

>          rating_peo  rating_point     year
count  	2.500000e+02    250.000000   250.000000
mean    4.879335e+05      8.259600  1985.000000
std     4.091461e+05      0.232344    24.585724
min     2.569100e+04      8.000000  1921.000000
25%     1.422608e+05      8.100000  1966.250000
50%     3.560640e+05      8.200000  1993.000000
75%     7.185348e+05      8.400000  2004.000000
max     2.066713e+06      9.200000  2018.000000

再次感受下pandas的强大。DataFrame还有一些其他的属性可以了解到数组的基本信息。

# 行数,列数
print(movies.shape)
# 列数据类型
print(movies.dtypes)
# 数据维度
print(movies.ndim)
# 行索引
print(movies.index)
# 列索引
print(movies.columns)
# 对象值
print(movies.values)

接下来是画图,可视化数据。首先想分析下top250电影和年份的关系,哪个年代的好片多。直接获取年份的数据,采用直方图。
matplotlib导入

from matplotlib import pyplot as plt
from matplotlib import font_manager

直方图需要计算下组数,为极差/组距

# 获取所有年份数据
years = movies["years"].values
# 计算组数
# 查看最大最小值
print(years.max(),years.min(),years.max()-years.min())

>2018 1921 97

完整画图如下

# 获取所有年份数据
years = movies["year"].values

# 导入中文字体
font = font_manager.FontProperties(fname='./SimHei.ttf')
# 设置图片大小及像素
fig = plt.figure(figsize=(20,8),dpi=80)

# 计算组数
# 查看最大最小值
# print(years.max(),years.min(),years.max()-years.min())
d = 10
zu = (years.max()-years.min())//10

# 绘图及设置图例
plt.hist(years,zu,label='IMDB电影')

# 设置x轴刻度
_x = list(range(years.min(),years.max()+4))
plt.xticks(_x[::5])

# 添加各轴标题
plt.title('电影-年份',fontproperties=font)
plt.xlabel('年份',fontproperties=font)
plt.ylabel('部数',fontproperties=font)

# 添加图例
plt.legend(prop=font)

# 添加网格
plt.grid()
# 存储图片
plt.savefig('./电影-年份.png')
# 展示图片
plt.show()

得到结果

IMDB评论 预期数据分析数据结果 imdb电影数据分析_matplotlib


可以看到1997到2007这段时间好片最多,达到了超过55部。

图还比较粗糙,总的来说,基本完成了数据可视化。