每次爬虫爬到了许多数据,虽然有点成就感,但是只能干看着,还是不行。所以来看下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()
得到结果
可以看到1997到2007这段时间好片最多,达到了超过55部。
图还比较粗糙,总的来说,基本完成了数据可视化。