進一步分析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')
下次要把準確地址爬下來,做個真正的熱力圖。