一、前述
之前学爬虫的时候采集了智联招聘默认推荐的职位,数据共49183条,9个数据项。
因为采集下来的数据实在是杂乱的很,所以这个项目重点在于对数据的清洗,算是对pandas、numpy进一步的练习。
可视化这里我使用的是pyecharts和matplotlib,matplotlib使用起来比较简便,pyecharts美化程度更高,官网也有大量可视化案例,各有各的优势吧。
二、分析流程
0、所需函数库
import pandas as pd
import numpy as np
import re
import jieba
from pyecharts.charts import Pie, Bar, Map, WordCloud,Line,Grid,Scatter,Radar,Page #可视化
from pyecharts import options as opts
from pyecharts.globals import SymbolType
from pyecharts.globals import ThemeType
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import string
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.style.use('ggplot')
1、数据清洗
数据中共9个数据项,分别对应职位、公司、位置、薪酬范围、学历和经验、企业性质、企业人数、所属行业、岗位职责。应为数据中并没有列名称,因此手动添加,源数据如图
df = pd.read_csv("job_info.csv",
header=None,
names=['job','company','location','salary','education','company type','people','industry','prepon'],
engine="python")
df.head()
1.1).去重
对于重复公司的职位去重
print(df.shape)
df.drop_duplicates(subset=['company','job'],inplace=True)
print(df.shape)
(71034, 10)
(49183, 10)
1.2).筛选所需职位
根据关键字,在职位一栏中筛选出所需要的职位,这里我选择的是与数据分析相关或者接近的职位。
# df['job'][0].count('分析')
# index = [0, 0, 0, 1, 2, 0, 0]
# np.array(index).sum(axis=0)>0
job_list = ['开发', '分析', '工程师', '数据', '运营', '产品']
# index = [df['job'][0].count(i) for i in job_list]
index = [df['job'].str.count(i) for i in job_list]
index = np.array(index).sum(axis=0)>0
job_info = df[index]
job_info.head()
筛选后得到目标职位,但由于岗位名称仍然归于杂乱,因此继续筛选,这里我将岗位在此细分。
job_list = ['数据分析', "数据统计","数据专员",'数据挖掘', '算法', '大数据',
'开发工程师', '数据运营', '数据库','数据产品','数据管理']
job_list= np.array(job_list)
def change_job_name(x=None,name_list=job_list):
index = [i in x for i in name_list]
# print(index)
if sum(index) > 0:
# print(name_list[index])
return name_list[index][0]
else:
return x
job_info['job'] = job_info['job'].apply(change_job_name)
job_info['job'] = job_info['job'].apply(lambda x: re.sub('数据统计','数据分析',x))
job_info['job'] = job_info['job'].apply(lambda x: re.sub('数据专员','数据分析',x))
1.3).薪水清洗
print(job_info['salary'].str[-1].value_counts())
print('*'*30)
print(job_info['salary'].str[-3].value_counts())
月 16122
年 762
天 42
时 5
Name: salary, dtype: int64
******************************
万 10838
千 6028
元 42
下 18
/ 5
Name: salary, dtype: int64
薪水中有日薪、月薪、年薪,也对应着千/月、万/月、万/年 ,在此,我将日薪字段进行剔除,毕竟临时工都是用来背锅的。以为薪水都是一个范围,在原数据中添加最大、最小、平均薪水三列,平均薪水是用最大+最小/2得到。另外要注意年薪与月薪的不同处理方式。
index_time = job_info['salary'].str[-1].isin(['年','月'])
index_money = job_info['salary'].str[-3].isin(['万','千'])
job_info = job_info[index_time&index_money]
job_info.head()
def split_mony(x):
try:
if x[-3] == '万':
sal = [float(i)*10000 for i in re.findall("[0-9]+\.?[0-9]*",x)]
elif x[-3] == '千':
sal = [float(i)*1000 for i in re.findall("[0-9]+\.?[0-9]*",x)]
if x[-1]