进一步分析51job上宁波财务和IT的数据的招聘数据
进一步分析上次爬的数据后发现上次应该把地址爬下来,现在的数据只能做个简单的热力图,不过也懒得重新去爬了。将就用吧。
一、看看财务和IT的需求比例
用pyecharts实现的,发现这个画的图很漂亮。
代码和官网的demo很像,基本没怎么改。
# -- coding:utf-8 --
import pymongo
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.charts import Map
conn = pymongo.MongoClient('127.0.0.1',port=27017)
db = conn['51job']['51job宁波财务']
db2= conn['51job']['51job宁波IT']
df=list(db.find())+list(db2.find())
df=pd.DataFrame(list(df))
df.drop("公司名",axis=1,inplace=True)
df.drop("职位名",axis=1,inplace=True)
df.drop("_id",axis=1,inplace=True)
#画饼图
def pie_rich_label() -> Pie:
# cw=df['分类'].value_counts()
cw = df['分类'].loc[df['分类'] == '财务'].value_counts()[0]
it = df['分类'].loc[df['分类'] == 'IT'].value_counts()[0]
c = (
Pie()
.add(
"",
[('财务',int(cw)),('IT',int(it))],
# 饼图的半径,数组的第一项是内半径,第二项是外半径
# 默认设置成百分比,相对于容器高宽中较小的一项的一半
radius=["20%", "55%"],
# 标签配置项
label_opts=opts.LabelOpts(
position="outside",
formatter="{hr|}\n {b|{b}: }{c} {per|{d}%} ",
background_color="#eee",
border_color="#aaa",
border_width=1,
border_radius=4,
rich={
"hr": {"borderColor": "#aaa","width": "100%","borderWidth": 0.5,"height": 0,},
"b": {"fontSize": 16, "lineHeight": 33},
"per": {"color": "#eee","backgroundColor": "#334455","padding": [2, 4],"borderRadius": 2,},
},
),
)
.set_global_opts(title_opts=opts.TitleOpts(title="宁波财务和IT需求比例"))
)
return c
pie_rich_label().render(path='宁波财务和IT需求比例.html')
二、看看IT和财务的平均工资热力图
不管是IT还是财务,平均工资居然还是两头的不发达区工资高,而位于市中心的地区平均工资低,难以想象。
三、再看看各区招聘需求
果然还是中心地区需求高,特别是鄞州区,独占了宁波南部商务区,东部新城,高新区等几个新区。看上去果然活力满满啊。
特地回去看看了下周边地区平均工资高的原因。恩,举个例子,我和马云平均年薪好几亿,但上海市人民平均年薪只有几十万。
看来有机会还是要去鄞州区啊。
最后放个代码
df['薪资范围'],df['年月'] = df['薪资'].str.split('/',n=1).str
df.drop("薪资",axis=1,inplace=True)#删除原有的列
df['最低薪资'],df['最高薪资0'] = df['薪资范围'].str.split('-',n=1).str
df.drop("薪资范围",axis=1,inplace=True)
df['单位'] = df['最高薪资0'].str.extract(r'([\u4E00-\u9FA5])')
df['最高薪资'] = df['最高薪资0'].str.extract(r'(\d+.\d+|\d+)')
df.drop("最高薪资0",axis=1,inplace=True)
df.单位[df['单位']=='千']=1000
df.单位[df['单位']=='万']=10000
df.年月[df['年月']=='年']=12
df.年月[df['年月']=='月']=1
#删除‘最低薪资’列,值为‘薪资’的所有行
df = df[(True^df['最低薪资'].isin(['薪资']))]
df = df[(True^df['最高薪资'].isin(['薪资']))]
#删除所有包含空值的行
df = df.dropna()
df['最低薪资']=df['最低薪资'].astype(float)
df['最高薪资']=df['最高薪资'].astype(float)
df['单位']=df['单位'].astype(float)
df['年月']=df['年月'].astype(float)
df['最低薪资(元)']=(df['最低薪资']*df['单位']/df['年月']).round(0)
df['最高薪资(元)']=(df['最高薪资']*df['单位']/df['年月']).round(0)
df.drop("最高薪资",axis=1,inplace=True)
df.drop("最低薪资",axis=1,inplace=True)
df.drop("单位",axis=1,inplace=True)
df.drop("年月",axis=1,inplace=True)
df['最低薪资(元)'] = df['最低薪资(元)'].loc[ df['最低薪资(元)'] < 50000]
df['最高薪资(元)'] = df['最高薪资(元)'].loc[ df['最高薪资(元)'] < 50000]
df = df.dropna()
df['工作地点0'],df['工作地点'] = df['工作地点'].str.split('-',n=1).str
df.drop("工作地点0",axis=1,inplace=True)
dfdz = df.dropna()
#排除某一列
dfdz.replace('高新区','鄞州区',inplace=True)
dfcw = dfdz[(True^dfdz['分类'].isin(['IT']))]
dfit = dfdz[(True^dfdz['分类'].isin(['财务']))]
#global ningbo_city,aa,bb,cc,dd
ningbo_city = ["慈溪市", "余姚市", "镇海区", "海曙区", "江北区", "鄞州区", "北仑区", "奉化区", "象山县", "宁海县"]
aa=[]
bb=[]
cc=[]
dd=[]
for i in ningbo_city:
A = [dfcw[(dfcw['工作地点']==i)].mean()[0].round(0)]
if A is None:
aa =aa+''
else: aa = aa+A
B = [dfit[(dfit['工作地点']==i)].mean()[0].round(0)]
if B is None:
bb=bb+''
else: bb = bb+B
C = list(dfcw['工作地点'].loc[dfcw['工作地点']==i].value_counts())
if C==[]:
cc=cc+[0]
else: cc = cc+C
D = list(dfit['工作地点'].loc[dfit['工作地点']==i].value_counts())
if D==[]:
dd=dd+[0]
else:dd = dd+D
def map_aa() -> Map:
c = (
Map()
.add("财务", [list(z) for z in zip(ningbo_city, aa)], "宁波")
.set_global_opts(
title_opts=opts.TitleOpts(title="宁波地图财务平均薪资"),
visualmap_opts=opts.VisualMapOpts(max_=max(aa),min_=min(aa)),
)
)
return c
map_aa().render(path='宁波地图财务平均薪资.html')
def map_bb() -> Map:
c = (
Map()
.add("IT", [list(z) for z in zip(ningbo_city, bb)], "宁波")
.set_global_opts(
title_opts=opts.TitleOpts(title="宁波地图IT平均薪资"),
visualmap_opts=opts.VisualMapOpts(max_=max(bb),min_=min(bb)),
)
)
return c
map_bb().render(path='宁波地图IT平均薪资.html')
def map_cc() -> Map:
c = (
Map()
.add("财务", [list(z) for z in zip(ningbo_city, cc)], "宁波")
.set_global_opts(
title_opts=opts.TitleOpts(title="宁波地图财务平均需求"),
visualmap_opts=opts.VisualMapOpts(max_=max(cc),min_=min(cc)),
)
)
return c
map_cc().render(path='宁波地图财务平均需求.html')
def map_dd() -> Map:
c = (
Map()
.add("IT", [list(z) for z in zip(ningbo_city, dd)], "宁波")
.set_global_opts(
title_opts=opts.TitleOpts(title="宁波地图IT平均需求"),
visualmap_opts=opts.VisualMapOpts(max_=max(dd),min_=min(dd)),
)
)
return c
map_dd().render(path='宁波地图IT平均需求.html')
下次要把准确地址爬下来,做个真正的热力图。