用python分析招聘网站关于数据分析的工作岗位
可以了解到的信息: 目前的数据维度9948行X15列, Education, Language, Specialty, PositionAdvantage有不同程度的缺失(NNN是最后添加, 仅仅是用来补齐15元素), 14个python对象(1个浮点型)职位名称中’数据分析师’最多, 多为民营公司, 公司规模150-500人最多, 行业领域金融/投资/证券最多, 薪资中6-8千/月最多, 大多对
with open(r’D:\Data\ZhaoPin.csv’,‘a’, encoding = ‘gb18030’) as f:
job_info = [item[‘JobTitle’], item[‘CompanyName’], item[‘CompanyNature’], item[‘CompanySize’], item[‘IndustryField’], item[‘Salary’], item[‘Workplace’], item[‘Workyear’], item[‘Education’], item[‘RecruitNumbers’], item[‘ReleaseTime’],item[‘Language’],item[‘Specialty’],item[‘PositionAdvantage’],‘\n’]
f.write(“,”.join(job_info))
return item
配置setting
设置用户代理, 下载延迟0.5s, 关闭cookie追踪, 调用pipelines
USER_AGENT = ‘Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36’
DOWNLOAD_DELAY = 0.5
COOKIES_ENABLED = False
ITEM_PIPELINES = {
‘job51.pipelines.Job51Pipeline’: 300,
}
运行程序
新建main.py文件, 并执行以下代码
from scrapy import cmdline
cmdline.execute(‘scrapy crawl zhaopin’.split())
这样开始了数据爬取, 最终爬取到9000多条数据, 在分析这些数据之前, 先看看数据都是什么样, 进入数据概览环节.
读取数据
import pandas as pd
df = pd.read_csv(r’D:\aPython\Data\DataVisualization\shujufenxishiJob51.csv’)
#由于原始数据中没有字段, 需要为其添加字段
df.columns = [‘JobTitle’,‘CompanyName’,‘CompanyNature’,‘CompanySize’,‘IndustryField’,‘Salary’,‘Workplace’,‘Workyear’,‘Education’,‘RecruitNumbers’, ‘ReleaseTime’,‘Language’,‘Specialty’,‘PositionAdvantage’]
df.info()
抛出异常: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte
- 解决办法; 用Notepad++将编码转换为utf-8 bom格式
转换之后, 再次执行
抛出异常: ValueError: Length mismatch: Expected axis has 15 elements, new values have 14 elements
- 解决办法: 在列表[‘JobTitle…PositionAdvantage’]后面追加’NNN’, 从而补齐15个元素.
追加之后, 再次执行, 执行结果为:
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 9948 entries, 0 to 9947
Data columns (total 15 columns):
JobTitle 9948 non-null object
CompanyName 9948 non-null object
CompanyNature 9948 non-null object
CompanySize 9948 non-null object
IndustryField 9948 non-null object
Salary 9948 non-null object
Workplace 9948 non-null object
Workyear 9948 non-null object
Education 7533 non-null object
RecruitNumbers 9948 non-null object
ReleaseTime 9948 non-null object
Language 901 non-null object
Specialty 814 non-null object
PositionAdvantage 8288 non-null object
NNN 0 non-null float64
dtypes: float64(1), object(14)
memory usage: 1.1+ MB
可以了解到的信息: 目前的数据维度9948行X15列, Education, Language, Specialty, PositionAdvantage有不同程度的缺失(NNN是最后添加, 仅仅是用来补齐15元素), 14个python对象(1个浮点型)
描述性统计
由于我们所需信息的数据类型都是python对象, 故使用以下代码
#注意是大写的字母o
df.describe(include=[‘O’])
从以下信息(公司名称部分我没有截图)中可以得到:
职位名称中’数据分析师’最多, 多为民营公司, 公司规模150-500人最多, 行业领域金融/投资/证券最多, 薪资中6-8千/月最多, 大多对工作经验没有要求, 学历要求多为本科, 多数均招1人等信息.
职位名称的种类就有4758种, 他们都是我们本次分析的数据分析师岗位吗, 先来确认下:
zhaopin.JobTitle.unique()
array([‘零基础免费培训金融外汇数据分析师’, ‘数据分析师(周末双休+上班舒适)’, ‘数据分析师’, …,
‘数据分析实习(J10635)’, ‘数据分析实习(J10691)’, ‘数据分析实习(J10713)’], dtype=object)
这仅仅显示了职位名称中的一部分,而且还都符合要求, 换种思路先看20个
JobTitle = zhaopin.groupby(‘JobTitle’, as_index=False).count()
JobTitle.JobTitle.head(20)
0 (AI)机器学习开发工程师讲师
1 (ID67391)美资公司数据分析
2 (ID67465)美资公司数据分析
3 (ID67674)500强法资汽车制造商数据分析专员(6个月)
4 (ID67897)知名500强法资公司招聘数据分析专员
5 (Senior)DataAnalyst
6 (免费培训)数据分析师+双休+底薪
7 (实习职位)BusinessDataAnalyst/业务数据分析
8 (急)人力销售经理
9 (提供食宿)银行客服+双休
10 (日语)股票数据分析员/EquityDataAnalyst-Japanese/
11 (越南语)股票数据分析员/EquityDataAnalyst-Vietnam
12 (跨境电商)产品专员/数据分析师
13 (韩语)股票数据分析员/EquityDataAnalyst-Korean
14 ***数据分析
15 -数据分析师助理/实习生
16 -数据分析师助理/统计专员+双休五险+住宿
17 -无销售不加班金融数据分析师月入10k
18 -金融数据分析师助理6k-1.5w
19 -金融数据分析师双休岗位分红
Name: JobTitle, dtype: object
可以看到还有机器学习开发讲师, 人力销售经理, 银行客服等其他无效数据.
现在我们对数据有了大致的认识, 下来我们开始数据预处理.
数据清洗
数据清洗的目的是不让有错误或有问题的数据进入加工过程, 其主要内容包括: 重复值, 缺失值以及空值的处理
删除重复值
如果数据中存在重复记录, 而且重复数量较多时, 势必会对结果造成影响, 因此我们应当首先处理重复值.
#删除数据表中的重复记录, 并将删除后的数据表赋值给zhaopin
zhaopin = df.drop_duplicates(inplace = False)
zhaopin.shape
(8927, 15)
对比之前的数据, 重复记录1021条.
过滤无效数据
我们了解到职位名称中存在无效数据, 我们对其的处理方式是过滤掉.
#筛选名称中包含’数据’或’分析’或’Data’的职位
zhaopin = zhaopin[zhaopin.JobTitle.str.contains(‘.?数据.?|.?分析.?|.?Data.?’)]
zhaopin.shape
(7959, 15)
缺失值处理
在pandas中缺失值为NaN或者NaT, 其处理方式有多种:
-
利用均值等集中趋势度量填充
-
利用统计模型计算出的值填充
-
保留缺失值
-
删除缺失值
#计算每个特征中缺失值个数
zhaopin.isnull().sum()
JobTitle 0
CompanyName 0
CompanyNature 0
CompanySize 0
IndustryField 0
Salary 0
Workplace 0
Workyear 0
Education 1740
RecruitNumbers 0
ReleaseTime 0
Language 7227
Specialty 7244
PositionAdvantage 1364
NNN 7959
dtype: int64
- Education: 缺失值占比1740/7959 = 21.86%, 缺失很有可能是"不限学历", 我们就用"不限学历"填充
zhaopin.Education.fillna(‘不限学历’, inplace=True)
-
Language: 缺失值占比7227/7959 = 90.80%, 缺失太多, 删除特征
-
Specialty: 缺失值占比7244/7959 = 91.02%, 同样缺失很多, 删除
zhaopin.drop([‘Specialty’,‘Language’], axis=1, inplace = True)
- PositionAdvantage: 缺失占比1364/7959 = 17.14%, 选用众数中的第一个’五险一金’填充
zhaopin.PositionAdvantage.fillna(zhaopin.PositionAdvantage.mode()[0], inplace = True)
- NNN: 没有任何意义, 直接删除
zhaopin.drop([“NNN”], axis=1, inplace = True)
最后, 检查缺失值是否处理完毕
zhaopin.isnull().sum()
JobTitle 0
CompanyName 0
CompanyNature 0
CompanySize 0
IndustryField 0
Salary 0
Workplace 0
Workyear 0
Education 0
RecruitNumbers 0
ReleaseTime 0
PositionAdvantage 0
dtype: int64
由于现有的数据不能满足我们的分析需求, 因此需要对现有数据表进行分列, 计算等等操作.
需要处理的特征有: Salary
, Workplace
Salary
将薪资分为最高薪资和最低薪资, 另外了解到薪资中单位有元/小时, 元/天, 万/月, 万/年, 千/月, 统一将其转化为千/月
import re
#将5种单元进行编号
zhaopin[‘Standard’] = np.where(zhaopin.Salary.str.contains(‘元.*?小时’), 0,
np.where(zhaopin.Salary.str.contains(‘元.*?天’), 1,
np.where(zhaopin.Salary.str.contains(‘千.*?月’), 2,
np.where(zhaopin.Salary.str.contains(‘万.*?月’), 3,
4))))
#用’-'将Salary分割为LowSalary和HighSalary
SalarySplit = zhaopin.Salary.str.split(‘-’, expand = True)
zhaopin[‘LowSalary’], zhaopin[‘HighSalary’] = SalarySplit[0], SalarySplit[1]
#Salary中包含’以上’, '以下’或者两者都不包含的进行编号
zhaopin[‘HighOrLow’] = np.where(zhaopin.LowSalary.str.contains(‘以.*?下’), 0,
np.where(zhaopin.LowSalary.str.contains(‘以.*?上’), 2,
1))
#匹配LowSalary中的数字, 并转为浮点型
Lower = zhaopin.LowSalary.apply(lambda x: re.search(‘(\d+.?\d*)’, x).group(1)).astype(float)
#对LowSalary中HighOrLow为1的部分进行单位换算, 全部转为’千/月’
zhaopin.LowSalary = np.where(((zhaopin.Standard0)&(zhaopin.HighOrLow1)), Lower821/1000,
np.where(((zhaopin.Standard1)&(zhaopin.HighOrLow1)), Lower*21/1000,
np.where(((zhaopin.Standard2)&(zhaopin.HighOrLow1)), Lower,
np.where(((zhaopin.Standard3)&(zhaopin.HighOrLow1)), Lower*10,
np.where(((zhaopin.Standard4)&(zhaopin.HighOrLow1)), Lower/12*10,
Lower)))))
#对HighSalary中的缺失值进行填充, 可以有效避免匹配出错.
zhaopin.HighSalary.fillna(‘0千/月’, inplace =True)
#匹配HighSalary中的数字, 并转为浮点型
Higher = zhaopin.HighSalary.apply(lambda x: re.search(‘(\d+.?\d*).*?’, str(x)).group(1)).astype(float)
#对HighSalary中HighOrLow为1的部分完成单位换算, 全部转为’千/月’
zhaopin.HighSalary = np.where(((zhaopin.Standard0)&(zhaopin.HighOrLow1)),zhaopin.LowSalary/21*26,
np.where(((zhaopin.Standard1)&(zhaopin.HighOrLow1)),zhaopin.LowSalary/21*26,
np.where(((zhaopin.Standard2)&(zhaopin.HighOrLow1)), Higher,
np.where(((zhaopin.Standard3)&(zhaopin.HighOrLow1)), Higher*10,
np.where(((zhaopin.Standard4)&(zhaopin.HighOrLow1)), Higher/12*10,
np.where(zhaopin.HighOrLow==0, zhaopin.LowSalary,
zhaopin.LowSalary))))))
#查看当HighOrLow为0时, Standard都有哪些, 输出为2, 4
zhaopin[zhaopin.HighOrLow==0].Standard.unique()
#完成HighOrLow为0时的单位换算
zhaopin.loc[(zhaopin.HighOrLow0)&(zhaopin.Standard2), ‘LowSalary’] = zhaopin[(zhaopin.HighOrLow0)&(zhaopin.Standard2)].HighSalary.apply(lambda x: 0.8*x)
zhaopin.loc[(zhaopin.HighOrLow0)&(zhaopin.Standard4), ‘HighSalary’] = zhaopin[(zhaopin.HighOrLow0)&(zhaopin.Standard4)].HighSalary.apply(lambda x: x/12*10)
zhaopin.loc[(zhaopin.HighOrLow0)&(zhaopin.Standard4), ‘LowSalary’] = zhaopin[(zhaopin.HighOrLow0)&(zhaopin.Standard4)].HighSalary.apply(lambda x: 0.8*x)
#查看当HighOrLow为2时, Srandard有哪些, 输出为4
zhaopin[zhaopin.HighOrLow==2].Standard.unique()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-5KlghMeu-1712553589479)]
更多推荐
所有评论(0)