Serborn直方图,Serborn圆饼图,Serborn条形图, 福利待遇词云图,正则的使用:
pattern = 'd+'
df['work_year'] = df['工作年限'].str.findall(pattern)
# 数据处理后的工作年限
avg_work_year = []
# 工作年限
for i in df['work_year']:
# 如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0
if len(i) == 0:
avg_work_year.append(0)
# 如果匹配值为一个数值,那么返回该数值
elif len(i) == 1:
avg_work_year.append(int(''.join(i)))
# 如果匹配值为一个区间,那么取平均值
else:
num_list = [int(j) for j in i]
avg_year = sum(num_list)/2
avg_work_year.append(avg_year)
df['工作经验'] = avg_work_year
一,爬取拉勾网北京数据分析岗位数据
二,导入模块.读取数据,处理工作年限字段及月工资字段
三,x=月工资数,y= 数据分析岗位数 Serborn直方图
四,x=工作地点各区占比 Serborn圆饼图
五,x=招聘人数,y=最低学历要求 Serborn条形图
六,x=招聘人数,y=工作年限 Serborn条形图
七,x=待遇 福利待遇词云图
八,导出LV0及LV1的帝都数据分析岗位工资Excel
一,爬取拉勾网北京数据分析岗位数据
import json
import requests
import csv
import time
def get_json(url, datas):
my_headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
"Referer": "https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=",
"Content-Type": "application/x-www-form-urlencoded;charset = UTF-8"
}
time.sleep(10)
ses = requests.session() # 获取session
ses.headers.update(my_headers) # 更新
ses.get(
"https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=")
content = ses.post(url=url, data=datas)
result = content.json()
info = result['content']['positionResult']['result']
info_list = []
for job in info:
information = []
information.append(job['positionId']) # 岗位对应ID
information.append(job['city']) # 岗位对应城市
information.append(job['companyFullName']) # 公司全名
information.append(job['companyLabelList']) # 福利待遇
information.append(job['district']) # 工作地点
information.append(job['education']) # 学历要求
information.append(job['firstType']) # 工作类型
information.append(job['formatCreateTime']) # 发布时间
information.append(job['positionName']) # 职位名称
information.append(job['salary']) # 薪资
information.append(job['workYear']) # 工作年限
info_list.append(information)
return info_list
def main():
page = int(input('请输入你要抓取的页码总数:'))
title = ['岗位id', '城市', '公司全名', '福利待遇', '工作地点', '学历要求', '工作类型', '发布时间', '职位名称', '薪资', '工作年限']
file = open('lagou.csv', 'w', newline='', encoding='utf-8')
writer = csv.writer(file)
writer.writerow(title)
for x in range(1, page + 1):
url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
datas = {
'first': 'false',
'pn': x,
'kd': '数据分析',
}
try:
infos = get_json(url, datas)
for info in infos:
writer.writerow(info)
print("第%s页正常采集" % x)
except Exception as msg:
print("第%s页出现问题" % x)
time.sleep(10)
infos = get_json(url=url, datas=datas)
for info in infos:
writer.writerow(info)
if __name__ == '__main__':
main()
二,导入模块.读取数据,处理工作年限字段及月工资字段
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
# 不发出警告
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题-设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
import jieba
from wordcloud import WordCloud
from scipy.misc import imread,imresize
import os
os.chdir('C:/Users/Administrator/Desktop/帝都python数据分析/')
# 创建工作路径
#读取数据
df01 = pd.read_csv('lagou.csv',encoding = 'utf-8')
df = df01.copy()
#df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)
#print(df.describe())
# 由于CSV文件内的数据是字符串形式,先用正则表达式将字符串转化为列表,再取区间的均值
pattern = 'd+'
df['work_year'] = df['工作年限'].str.findall(pattern)
# 数据处理后的工作年限
avg_work_year = []
# 工作年限
for i in df['work_year']:
# 如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0
if len(i) == 0:
avg_work_year.append(0)
# 如果匹配值为一个数值,那么返回该数值
elif len(i) == 1:
avg_work_year.append(int(''.join(i)))
# 如果匹配值为一个区间,那么取平均值
else:
num_list = [int(j) for j in i]
avg_year = sum(num_list)/2
avg_work_year.append(avg_year)
df['工作经验'] = avg_work_year
# 将字符串转化为列表,再取区间的前25%,比较贴近现实
df['salary'] = df['薪资'].str.findall(pattern)
# 月薪
avg_salary = []
for k in df['salary']:
int_list = [int(n) for n in k]
avg_wage = int_list[0]+(int_list[1]-int_list[0])/4
avg_salary.append(avg_wage)
df['月工资'] = avg_salary
# 将学历不限的职位要求认定为最低学历:大专
df['学历要求'] = df['学历要求'].replace('不限','大专')
三,x=月工资数,y= 数据分析岗位数 Serborn直方图
sns.set()
sns.set_style("ticks")
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
sns.set(font='SimHei') # 解决Seaborn中文显示问题
#####薪资直方图
sns.distplot(df['月工资'],bins = 10,hist = True,kde = False,norm_hist=False,
rug = True,vertical = False,
color = 'blue',label = '2019年8月北京市数据分析薪资',axlabel = '工资 (千元)')
plt.savefig('2019年8月北京市数据分析薪资.jpg', dpi=200)
plt.legend()
结论:2019年8月北京市数据分析薪资大部分处于14~19k之间
四,x=工作地点各区占比 Serborn圆饼图
import matplotlib.font_manager as fm
my_font = fm.FontProperties(fname="C:windowsFontsSTZHONGS.TTF")
count = df['工作地点'].value_counts()[:8]
#count = count.loc[['朝阳区', '昌平区', '东城区', '大兴区', '西城区', '海淀区', '石景山区', '通州区', '延庆区']] # 调整顺序
plt.figure(figsize=(10,10))
plt.pie(count,
labels = count.keys(),
labeldistance=1.05,
autopct='%2.2f%%',
pctdistance=0.6,
radius=1.5,
startangle=150,
textprops= {'fontsize':50,'color':'black','fontproperties':my_font}
)
plt.axis('equal') # 使饼图为正圆形
#plt.legend(loc='upper left', bbox_to_anchor=(-0.1,1))
plt.title("2019年8月北京市各区数据分析岗位占比")
plt.savefig('2019年8月北京市各区数据分析岗位占比.jpg', dpi=200)
plt.show()
五,x=招聘人数,y=最低学历要求 Serborn条形图
dfxlyq = df['学历要求'].value_counts()
dfxlyq = pd.DataFrame(dfxlyq)
dfxlyq = dfxlyq.reset_index()
dfxlyq.columns = ['最低要求学历','招聘人数']
sns.barplot(x="招聘人数", y="最低要求学历", data=dfxlyq,
palette = 'Blues',edgecolor = 'w')
plt.savefig('2019年8月北京市数据分析学历要求.jpg', dpi=200)
六,x=招聘人数,y=工作年限 Serborn条形图
#######工作年限要求直方图
sns.set_context("paper")
dfgznx = df['工作年限'].value_counts()
dfgznx = pd.DataFrame(dfgznx)
dfgznx = dfgznx.reset_index()
dfgznx.columns = ['工作年限','招聘人数']
sns.barplot(x="招聘人数", y="工作年限", data=dfgznx,
palette = 'GnBu_r',edgecolor = 'w')
plt.savefig('2019年8月北京市数据分析工作年限要求.jpg', dpi=200)
######青春饭,扁平化,就是干活的,看命运了!
七,x=待遇 福利待遇词云图
#######福利待遇词云图
# 绘制词云,将职位福利中的字符串汇总
text = ''
for line in df['福利待遇']:
text += line
# 使用jieba模块将字符串分割为单词列表
cut_text = ' '.join(jieba.cut(text))
color_mask = imread('C:/Users/Administrator/Desktop/cloud.jpg') #设置背景图
cloud = WordCloud(
background_color = 'white',
# 对中文操作必须指明字体
font_path='C:windowsFontsSTZHONGS.TTF',
mask = color_mask,
max_words = 50,
max_font_size = 200
).generate(cut_text)
# 保存词云图片
cloud.to_file('word_cloud.jpg')
plt.imshow(cloud)
plt.axis('off')
plt.show()
八,导出LV0及LV1的帝都数据分析岗位工资Excel
ssss = df[df['学历要求']!='硕士'][df['工作经验']<2][df['月工资']<17]
ssss.drop(ssss[ssss['工作年限'].str.contains('应届毕业生')].index, inplace=True)
ssss.sort_values(by = '月工资',inplace = True,ascending=False)
ssss.reset_index(inplace=True)
del ssss['index']
ssss.to_excel('C:/Users/Administrator/Desktop/lv0shujufenxi.xlsx')
vvvv = df[df['学历要求']!='硕士'][df['工作经验']<=2][df['月工资']<20]
vvvv.drop(vvvv[vvvv['工作年限'].str.contains('应届毕业生')].index, inplace=True)
vvvv.sort_values(by = '月工资',inplace = True,ascending=False)
vvvv.reset_index(inplace=True)
del vvvv['index']
vvvv.to_excel('C:/Users/Administrator/Desktop/lv1shujufenxi.xlsx')