一.需求背景
课题中心:招聘网站的职位招聘数据预处理
之前的文章,我们已经对职位薪资数据进行了爬取(9000条)数据,然后进行了数据的清洗,最终得到了4000条有效数据。
具体需求:
- 按不同的类别划分职位中的薪酬数据,画盒图/箱线图,检查孤立点/离群点;
- 使用分位数图、分位数-分位数图方法处理数据;
本次任务的结构图:
技术要点: 爬虫库(Beautifulsoup、requests-html、Scrapy)、数据预处理(python、kettle)、数据可视化(matplotlib、pyecharts、tebleau)、python-web框架(Flask)
二. 任务开始
2.1 薪酬的中位数、均值和众数和数据倾斜模块详细设计
已Java为例,python和Go类似流程:
1.经过过去的爬虫和数据清理等步骤,我们得到了4000条左右的有效数据,我们先将其读取进来:
data = pd.read_csv("A-06-最终有效数据.csv",encoding="gbk")
2.以Java为例:我们使用关键词“java”对数据进行筛选,循环筛选过程中将职位名,薪资需要的关键字放到列表里面,然后存入字典里,经过pandas的处理:
xingzhi={}
zhiwei = []
xin1 = []
xin2 =[]
for i in range(len(data)):
if "java" in data.iloc[i]['职位名']:
a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
# print(data.iloc[i]['职位名'])
zhiwei.append(data.iloc[i]['职位名'])
xin1.append(int(a[0]))
xin2.append(int(a[1]))
xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
df = pd.DataFrame(xingzhi)
2.输出题目要求的均值,中位数和众数:
print("java职位最低薪资的均值为:",df['最低薪资'].mean())
print("java职位最高薪资的均值为:",df['最高薪资'].mean())
print("java职位最低薪资的中位数为:",df['最低薪资'].median())
print("java职位最高薪资的中位数为:",df['最高薪资'].median())
print('java职位最低薪资的众数:', df['最低薪资'].mode())
print('java职位最高薪资的众数:', df['最高薪资'].mode())
3.输出效果如下:
4.指定默认字体:解决plot不能显示中文问题,解决保存图像是负号'-'显示为方块的问题。
mpl.rcParams['font.sans-serif'] = ['STZhongsong']
mpl.rcParams['axes.unicode_minus'] = False
5.对x和y轴数据进行规范化,x轴使用数据的长度循环列表
import matplotlib.pyplot as plt
y1=xin1
x1=range(0,df['最低薪资'].count())
x2=range(0, df['最高薪资'].count())
y2=xin2
fig = plt.figure()
plt.subplot(2,1,1)
plt.bar(x1,y1, color="green")
plt.ylabel('薪资,单位K')
plt.title('java岗位的薪资情况(最低薪资-最高薪资)')
plt.subplot(2,1,2)
plt.bar(x2,y2, color="red")
plt.xlabel('公司个数')
plt.ylabel('薪资,单位K')
# plt.title('java岗位的薪资情况(最低薪资-最高薪资)')
plt.legend()
plt.show()
6.显示效果:
7.计算结果:
java职位: java职位最低薪资的均值为: 15.938611789326822 java职位最高薪资的均值为: 26.44890129054761 java职位最低薪资的中位数为: 15.0 java职位最高薪资的中位数为: 25.0 java职位最低薪资的众数: 0 15 Name: 最低薪资, dtype: int64 java职位最高薪资的众数: 0 30 Name: 最高薪资, dtype: int64 python职位: python职位最低薪资的均值为: 13.84330985915493 python职位最高薪资的均值为: 24.184859154929576 python职位最低薪资的中位数为: 15.0 python职位最高薪资的中位数为: 25.0 python职位最低薪资的众数: 0 15 Name: 最低薪资, dtype: int64 python职位最高薪资的众数: 0 30 Name: 最高薪资, dtype: int64 Go职位: Go职位最低薪资的均值为: 19.64329268292683 Go职位最高薪资的均值为: 34.707317073170735 Go职位最低薪资的中位数为: 19.0 Go职位最高薪资的中位数为: 30.0 Go职位最低薪资的众数: 0 15 Name: 最低薪资, dtype: int64 Go职位最高薪资的众数: 0 30 Name: 最高薪资, dtype: int64
2.2 按不同的类别划分职位中的薪酬数据,画盒图/箱线图,检查孤立点/离群点
1.与上文一样,我们使用关键词“java”对数据进行筛选,循环筛选过程中将职位名,薪资需要的关键字放到列表里面,然后存入字典里,经过pandas的处理: 将上限和下限分别处理:
xingzhi={}
zhiwei = []
xin1 = []
xin2 =[]
for i in range(len(data)):
if "java" in data.iloc[i]['职位名']:
a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
# print(data.iloc[i]['职位名'])
zhiwei.append(data.iloc[i]['职位名'])
xin1.append(int(a[0]))
xin2.append(int(a[1]))
xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
df = pd.DataFrame(xingzhi)
labels = 'Java职位工资下限', 'Java职位工资上限'
A = xin1
B = xin2
2.开始画图,将上面传入的进行处理
plt.grid(True) # 显示网格
plt.boxplot([A, B],
medianprops={'color': 'red', 'linewidth': 1.5},
meanline=True,
showmeans=True,
meanprops={'color': 'blue', 'ls': '--', 'linewidth': 1.5},
flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10},
labels=labels)
plt.yticks()
plt.show()
3.Python和GO语言的类似,如下:(GO语言代码省略不写)与这几个大致相同。
xingzhi={}
zhiwei = []
xin1 = []
xin2 =[]
for i in range(len(data)):
if "python" in data.iloc[i]['职位名']:
a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
zhiwei.append(data.iloc[i]['职位名'])
xin1.append(int(a[0]))
xin2.append(int(a[1]))
xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
df = pd.DataFrame(xingzhi)
labels = 'python职位工资下限', 'python职位工资上限'
A = xin1
B = xin2
plt.grid(True) # 显示网格
plt.boxplot([A, B],
medianprops={'color': 'red', 'linewidth': 1.5},
meanline=True,showmeans=True,
meanprops={'color': 'blue', 'ls': '--', 'linewidth': 1.5},
flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10},
labels=labels)
plt.yticks()
plt.show()
4.运行结果如下:
后面的任务会还会发布相关的文章。
标签:plt,java,python,盒图,职位,离群,薪资,data From: https://blog.51cto.com/u_15568258/6235814