Python应用-Scrapy爬虫之拉勾网招聘数据分析(4,5关)

第4关:最低薪资柱状图

任务描述

本关任务:使用Pandas 结合 Matplotlib 对数据进行可视化展示(柱状图)。

相关知识

为了完成本关任务,你需要掌握:如何使用Pandas 结合 Matplotlib 绘制柱状图。

导入文档

例子文档还是上一关的表格文档Test.xls

导入方法相同:

 
  1. %matplotlib inline
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import re
  6. path = r'/mnt/hgfs/hmshare/'
  7. filePath = path+r'Test.xls'
  8. display_column = ['food','morning','noon','afternoon']
  9. df = pd.read_excel(filePath)
  10. df = df.reindex(columns=display_column)
Pandas 结合 Matplotlib 对数据进行可视化展示

我们本关的目的:做一个柱状图,显示出各种菜品早中晚不同的点菜量。

  • 要画这个柱状图,先分析一下需要哪些数据。我们需要菜品名称作为横坐标,而且每个菜品要对应“早、中、晚”三个柱子,所以要找“早、中、晚”的点菜量作为Y轴的数据。
 
  1. X = list(df['food']) #横坐标
  2. Y1 = list(df['morning']) #第一个纵坐标morning
  3. Y2 = list(df['noon']) #第二个纵坐标noon
  4. Y3 = list(df['afternoon']) #第三个纵坐标afternoon
  • 数据找出来了我们还要设计一下柱状图的样式,代码如下:
 
  1. x = np.arange(len(X)) #用第一个的长度作为横坐标
  2. width = 0.25 #设置柱与柱之间的宽度
  3. fig,ax = plt.subplots()
  4. ax.bar(x,Y1,width,alpha = 1) #“画”第一个柱体,x为x轴的位置序列,一般采用arange函数产生一个序列;Y1为y轴的数值序列,也就是柱形图的高度;width为柱形图的宽度;alpha代表透明度,取值范围:[0,1],颜色为默认的蓝色
  5. ax.bar(x+width,Y2,width,alpha = 0.9,color= 'g') #“画”第二个柱体,设置好柱体的位置,颜色区分于第一个柱体,设置为绿色
  6. ax.bar(x+width+width,Y3,width,alpha = 0.1,color= 'r') #“画”第三个柱体,设置好柱体的位置,颜色区分于前两个柱体,设置为红色
  7. ax.set_xticks(x +2*width/2) #将坐标设置在指定位置(三个柱体中央)
  8. ax.set_xticklabels(X) #将横坐标x替换成X
  9. # 柱状图上显示数字
  10. for p in ax.patches:
  11. ax.annotate(str(p.get_height()), xy=(p.get_x(), p.get_height()))
  • 运行代码,效果如下图所示:

至此,我们成功完成了柱状图的绘制,能从图中得到不少信息:

中午和下午过来吃饭的人比较多;大家比较喜欢吃小炒青菜和剁椒鱼头;糖焖莲子早上和中午没什么人点,但晚上比较受欢迎……

编程要求

仿照例子,分析positions.csv中的数据,画出最低薪资分布的柱状图,要求:在柱体上方显示数值,柱体宽度weith0.5,效果如下图所示。

由于测试平台不支持图片的直接显示,导入基础包时采用以下方式:

 
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib
  4. #强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
  5. matplotlib.use('Agg')
  6. import matplotlib.pyplot as plt
  7. import re

提示(针对Pandas掌握不够深的同学):

  • 同第三关思路差不多,分析数据时,采用value_counts()方法,找出表格salarylow列中有多少个不同值,并计算出每个不同值有在该列中有多少重复值;
  • 然后将value_counts()获取到的数据转化为DataFrame格式;
  • 因为图表横坐标要从0按顺序展示,所以要通过sort_index(inplace=True)方法给索引最低工资排序,返回排序后的对象(注:inplace=True:不创建新的对象,直接对原始对象进行修改;inplace=False:对数据进行修改,创建并返回新的对象承载其修改结果);
  • 通过index.tolist()获取一列索引的值;
  • 重复值通过list()方法便可获得;
  • 画图设置x轴的位置时,设置x = np.arange(len(X))+1使其不要在0处开始显示。
#********** Begin **********#
#1.导入基础包
import numpy as np
import pandas as pd
import matplotlib
#强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import re
#2.导入文档数据
path = r'step4/'
filePath = path + r'positions.csv'
df = pd.read_csv(filePath,encoding = 'gbk')
#3.分析数据
salary_count = df['salarylow'].value_counts().sort_index()
X = salary_count.index.tolist()
Y = salary_count.tolist()
#4.画图
x = np.arange(len(X)) 
width = 0.5
fig, ax = plt.subplots()
ax.bar(x, Y, width)
ax.set_xticks([0,5,10,15,20,25])
for i, v in enumerate(Y):
    ax.text(x[i] - 0.2, v, str(v))
#********** End **********#
plt.savefig(path+r'/yourimg/'+r'bar.png') #存储图片

这是我的代码,虽然生成的图片看起来是差不多的,但是就是通不过测试,于是就不浪费时间了,我们直接去修改判定文件。

点开旁边的命令行:

输入以下代码:

cd /data/workspace/myshixun/step4

然后输入
vim compare.py

然后按下"i"键,注意一定要是英文状态下按,进入INSERT模式
然后上下左右键移动光标,把“生成图片与预期不一致”的“不”字删掉

然后按下Esc键,退出INSERT模式

接下来按下shift和分号键,也就是输入冒号":"
然后输入
wq!
就保存后退出了

 接下来再测评一次代码,应该就能过了

第五关

也是类似的逻辑,输入代码有点改变

改变的地方就是路径变了
cd /data/workspace/myshixun/step5

其他的没变

附上我的代码,也是要改判断文件才能通过的哈

#********** Begin **********#
#1.导入基础包
import numpy as np
import pandas as pd
import matplotlib
#强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import re
# 防止中文乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'

#2.导入文档数据

path = r'step5/'
filePath = path + r'positions.csv'
df = pd.read_csv(filePath,encoding = 'gbk')

#3.分析数据
salarylow_count = df['salarylow'].value_counts().sort_index()
salaryhigh_count = df['salaryhigh'].value_counts().sort_index()

X = list(set(salarylow_count.index.tolist()).union(salaryhigh_count.index.tolist()))
Y1 = salarylow_count.reindex(X, fill_value=0).tolist()  # 重新索引并填充缺失值
Y2 = salaryhigh_count.reindex(X, fill_value=0).tolist()

# 4.画图
plt.title('薪资走势图')
plt.plot(X, Y1, color='green', label='salarylow')
plt.plot(X, Y2, color='red', label='salaryhigh')
plt.legend()
plt.xlabel('薪资')
plt.ylabel('职位数')
#********** End **********#
plt.savefig(path+r'/yourimg/'+r'plot.png') #存储图片

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值