上一篇,我用了Excel对爬虫采集到的智联招聘数据进行了数据分析及可视化,用到软件是Excel,这一篇,我们打算完全用Python来做同样的事。用到的库有Pandas、Matplotlib。np、pd、plt分别是numpy、pandas、的常用缩写。

Numpy(NumericalPython的简称)是Python科学计算的基础包。它提供了以下功能:

快速高效的多维数组对象ndarray。

用于对数组执行元素级计算以及直接对数组执行数学运算的函数。

用于读写硬盘上基于数组的数据集的工具。

线性代数运算、傅里叶变换,以及随机数生成。

用于将C、C++、Fortran代码集成到Python的工具。

除了为Python提供快速的数组处理能力,Numpy在数据分析方面还有另外一个主要作用,即作为在算法之间传递数据的容器。对于数值型数据,Numpy数组在存储和处理数据时要比内置的Python数据结构高效的多。此外,由低级语言(比如C和Fortran)编写的库可以直接操作Numpy数组中的数据,无需进行任何数据复制工作。

Pandas这个名字本身源于paneldata(面板数据,这是计量经济学中关于多维结构化数据集的一个术语)以及Pythondataanalysis。pandas提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数。Pandas中用的最多的是DataFrame,它是一个面向列的二维表结构,且含有行标和列标。pandas兼具numpy高性能的数组计算功能以及电子表格和关系型数据库(如SQL)灵活的数据处理功能。它提供了复杂精细的索引功能,以便更为便捷地完成重塑、切片和切块、聚合以及选取数据子集等操作。

Matplotlib是Python中常用的可视化绘图库,可以通过简单的几行代码生成直方图,功率谱,条形图,错误图,散点图等。Seaborn、ggplot、等诸多Python可视化库均是在此基础上开发的,所以学会matplotlib的基础操作还是很有必要的!它和Ipython结合的很好,提供了一种非常好用的交互式数据绘图环境。绘制的图表也是交互式的,你可以利用绘图窗口中的工具栏放大图表中的某个区域或对整个图表进行平移浏览。

Python爬虫爬取了智联招聘关键词:【Python】、全国30个主要城市的搜索结果,总职位条数:18326条(行),其中包括【职位月薪】、【公司链接】、【工作地点】、【岗位职责描述】等14个字段列,和一个索引列【ZL_Job_id】共计15列。数据存储在本地MySql服务器上,从服务器上导出json格式的文件,再用Python进行数据读取分析和可视化。

数据简单清洗:

1.首先在终端中打开输入ipython--pylab。在Ipython的shell界面里导入常用的包numpy、pandas、。用pandas的read_json()方法读取json文件,并转化为用df命名的DataFrame格式文件。(DataFrame格式是Pandas中非常常用且重要的一种数据存储格式、类似于Mysql和Excel中的表。)

=_json('/Users/zhaoluyang/Desktop/Python_全国')索引列用'ZL_Job_id'列替换。del(df['ZL_Job_id'])给索引列重新排序。df=df_sortdf[['工作地点','职位月薪']].head(10)

3.下面,将进行【职位月薪】列的分列操作,新增三列【bottom】、【top】、【average】分别存放最低月薪、最高月薪和平均月薪。其中try语句执行的是绝大多数情况:职位月薪格式如:8000-10000元/月,为此需要对【职位月薪】列用正则表达式逐个处理,并存放至三个新列中。处理后bottom=8000,top=10000,average=9000.其中不同语句用于处理不同的情况,譬如【职位月薪】=‘面议’、‘foundnoelement’等。对于字符形式的‘面议’、‘foundnoelement’处理后保持原字符不变,即bottom=top=average=职位月薪。q1,q2,q3,q4用来统计各个语句执行次数.其中q1统计职位月薪形如‘6000-8000元/月’的次数;q2统计形如月收入‘10000元/月以下’;q3代表其他情况如‘foundnoelement’,‘面议’的次数;q4统计失败的特殊情况。

importredf['bottom']=df['top']=df['average']=df['职位月薪']pattern=('([0-9]+)')q1=q2=q3=q4=0foriinrange(len(df['职位月薪'])):item=df['职位月薪'].iloc[i].strip()result=(pattern,item)try:ifresult:try:此语句执行成功则表示result[0]存在,result[1]不存在,职位月薪形如‘10000元/月以下’df['bottom'].iloc[i]=df['top'].iloc[i]=result[0]df['average'].iloc[i]=str((int(result[0])+int(result[0]))/2)q2+=1else:测试一下看看职位月薪和bottom、top是否对的上号print([i][['职位月薪','bottom','top','average']])等价于df['工作城市'].value_counts()用type()查看下类型。


可以看到,明明设置的是搜索30个城市,怎么变成了40?像延边、珲春、白山。。。。是什么鬼?想了一下,这些城市是搜索关键词城市‘吉林市’时,自动冒出来的;还有95个‘foundnoelement’,是这些职位链接本身就没有填写工作城市,为了避免干扰,要把他们统统替换成空值。用df_工作城市=df['工作城市'].replace()

查看替换后各个城市职位计数df_工作城市.value_counts()将新的[df_工作城市]列添加到df表中,留作备用df['df_工作城市']=df_工作城市


看了一下,没有问题,现在df_工作城市中筛选出了30个城市,合计18211条职位数据。为了数据完整性,df表保持原样,我们用df_工作城市直接操作,进行下一步的可视化。先直接上代码和图,再一一解释下。

fig1=(1,facecolor='black')4f4f4f',alpha=0.3)设置轴的颜色为白色df_工作城市.value_counts().plot(kind='bar',rot=0,color='画直方图图设置标题xlabel=('城市',fontsize=14,color='yellow')设置Y轴轴标题设置说明,位置在图的右上角text2=(25,4000,'职位总数:18326(条)',fontsize=12,color='cyan')text3=(25,3500,'有效职位:18211(条)',fontsize=12,color='red')可以用(True)添加栅格线arrow=('职位数:3107',xy=(1,3107),xytext=(3,4000),color='blue',arrowprops=dict(facecolor='blue',shrink=0.05))ax2=_subplot(2,1,2)为了方便,显示前8个城市的城市名称和比例、其余的不显示,用空字符列表替代,为此需要构造列表label_list和一个空字符列表['']*23。x=df_工作城市.value_counts().valueslabel_list是构造的列表,装的是前8个城市的名称+职位占比。foriinrange(8):t=df_工作城市.value_counts().values[i]/df_工作城市.value_counts().sum()*100city=df_工作城市.value_counts().index[i]percent=str('%.1f%%'%t)label_(city+percent)explode即饼图中分裂的效果explode=(0.1,1,1,。。)表示第一块图片显示为分裂效果labels=label_list+['']*22explode=tuple([0.1]+[0]*29)(x,explode=explode,labels=labels,textprops={'color':'yellow'})若要显示标准圆形,可以添加:('equal')


可以看见,这个曲线下降的弧度还是挺美的,北上深杭广5个城市占据了超过60%以上的职位数。其中北京当之无愧的占据了四分之一的Python工作数量,不愧为帝都。上海以3107条职位排名第二,可见上海虽然经济超越北京,在互联网环境和工作机遇方面还需努力!深圳作为中国的科技中心,排名第三我是没疑问的,杭州竟然超过广州排名第四!不过也可以想到,阿里巴巴、百草味等等电商产业带动了整个杭州的互联网文化!【北上深杭广】+成都、南京、郑州,这8个城市占据了全国30座城市中,近80%的工作机会!剩下的22个城市合起来只占据了20%,果然,是基本符合28定律的。。。

2.工作经验-职位数量及分布

Python虽然是一名比较老的语言,但是在人们的印象中火起来也就最近几年,Python相关的工作对于【工作经验】是怎样要求的呢?让我们来看看!



数据构造好了,进行下一步,可视化。

可选facecolor='可选color='设置图标题,x和y轴标题title=(u'城市——平均月薪分布图',fontsize=18,color='yellow')设置X轴轴标题ylabel=(u'平均月薪',fontsize=14,color='yellow')设置说明,位置在图的右上角text1=(25,16250,u'城市总数:30(个)',fontsize=12,color='设置说明,位置在图的右上角text2=(25,15100,u'月薪样本数:16946(条)',fontsize=12,color='添加每一个城市的坐标值list_4=_values(ascing=False).valuesforiinrange(len(list_4)):(,list_4[i],int(list_4[i]),color='yellow')9B30FF',fontsize=14,arrowprops=dict(facecolor='设置轴刻度文字颜色为粉色_params(colors='pink')


可以看见,Python这个关键词下,全国16946条样本的月薪平均值为14197元/月,平均月薪排名前5的城市分别是:北京、上海、深圳、杭州、广州。哎,记得之前城市—职位数分布图么?全国30个城市中,职位数排名前5的也是这5座城市!看来北上广深杭不仅集中了全国大部分的职位数量、连平均工资也是领跑全国的!不禁让人觉得越大越强!但是在超级大城市奋斗,买房总是遥遥无期,房子在中国人的概念里,有着特殊的情节,意味着家,老小妻儿生活的地方,给人一种安全感!我们可以看到还有不少城市的平均月薪也破万了,在这些相对小点的城市中挑一个,工作安家,买房还是有希望的,哈哈!譬如南京、武汉、苏州、大连、厦门都挺好的!

5.学历-职位数量

直觉来看Python这类工作职位,应该是本科及以上经验要求居多吧?那么工作经验【不限】和【大专】的机会占比多少呢?让我们来看看!首先,还是用df['最低学历'].value_counts()来看一下有哪些字段,以及各个字段的统计值。

df['最低学历'].value_counts()df_最低学历=df['最低学历'].replace(['中技','其他','高中','foundnoelement'],)df_最低学历.value_counts()df_最低学历.value_counts().sum()df['df_最低学历']=df_最低学历可选facecolor='color='设置标题、x轴和y轴标题、图例文字title=(u'最低学历——职位数分布图',fontsize=18,color='yellow')xlabel=(u'最低学历',fontsize=14,color='yellow')ylabel=(u'职位数量',fontsize=14,color='yellow')text1=ax5_1.text(4.4,8200,u'职位总数:18119(条)',fontsize=14,color='设置坐标轴的的颜色和文字大小_params(colors='设置坐标值文字list5=df_最低学历.value_counts().valuesforiinrange(len(list5)):ax5_1.text(,list5[i],int(list5[i]),color='yellow')ax5_2=_subplot(2,1,2)xl=df_最低学历.value_counts().valueslabels=list(df_最低学历.value_counts().index)explode=tuple([0.1,0,0,0,0,0])(xl,explode=explode,labels=labels,autopct='%1.1f%%',textprops={'color':'B452CD')_params(colors='查看grouped6的信息()()().sum()('ggplot')fig6=(6,facecolor='black')ax6=_subplot(1,1,1,facecolor='在条形图上叠加一个折线图().round(1).sort_values().plot(kind='bar',rot=0)添加值标签(坐标值文字)list6=().round(1).sort_values().valuesforiinrange(len(list6)):(,list6[i],int(list6[i]),color='yellow')设置轴刻度的文字颜色_params(colors='查看grouped7的信息().round(1)()().sum()


其实我们输入type(()),会发现它是一个包含了层次化索引的Series结构。其中第一层索引是【最低学历】第二层索引是【工作经验】,数值列【平均月薪】被这两层索引所分配!下面我们开始准备可视化,还是画一个bar柱状图,不过这次画的是多列一起呈现的形式,Y轴表示职位月薪、X轴表示最低学历,在每个学历字段下,又分别添加不同工作经验的列!

().round(1)[:,'1-3年']().round(1)[:,'1-3年'].sort_values()xlist=list(().round(1)[:,'1-3年'].sort_values().index)().round(1)[:,'1-3年'].reindex(xlist)print(xlist)


()将会显示各组的平均值,round(1)表示小数点保留1位。[:,'1-3年']是对层次化索引的一种操作,表示选取()中索引名字为'工作经验'下'1-3年字段'的所有值。此处构造了列表xlist,值是筛选后的'最低学历'索引,xlist将用于画条形图时X轴坐标的标签文本(表示最低学历),Y轴相对应的是平均月薪。工作经验则用条形图和图例展示。


最后,上一张简单词云图给大家看看,用的BDP傻瓜式制作,看看就好!


其实展开了还可以分析的东西有不少,譬如Pandas、Matplotlib的用法,譬如更多维度的分析和两两组合!好了,整体的先暂时分析到这,总结一下呢就是:Python+工作经验+学历+大城市=高薪!但是,工作经验、学历和城市其实并没那么重要,关键要看自己的Python用的6不6,关键在于你知道自己想做什么,知道自己能做什么,知道自己做出了什么!哈哈,当你知道越来越接近这些问题的答案呢,那么我相信,薪水对你来说已经不那么重要了!(当然,高薪是必须有的!)人生苦短,我用Python!