前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

又到了学Python时刻~

分析目标

  1. 各城市对数据分析岗位的需求情况

  2. 不同细分领域对数据分析岗的需求情况

  3. 数据分析岗位的薪资状况

  4. 工作经验与薪水的关系

  5. 公司都要求什么掌握什么技能

  6. 岗位的学历要求高吗

  7. 不同规模的企业对工资经验的要求以及提供的薪资水平

代码展示

导包和数据

import pandas as pd
import numpy as np
import seaborn as sns
from pyecharts.charts import Pie
from pyecharts import options as opts
import matplotlib.pyplot as plt
%matplotlib inline
sns.set_style('white',{'font.sans-serif':['simhei','Arial']})
pd.set_option("display.max_column", None)
pd.set_option("display.max_row",None)

读取数据


取出我们进行后续分析所需的字段

columns = ["positionName", "companyShortName", "city", "companySize", "education", "financeStage","industryField", "salary", "workYear", "hitags", "companyLabelList", "job_detail"]
df[columns].drop_duplicates() #去重

数据清洗

去掉非数据分析岗的数据

数据分析相应的岗位数量

cond_1 = df["positionName"].str.contains("数据分析")  # 职位名中含有数据分析字眼的
cond_2 = ~df["positionName"].str.contains("实习")  # 剔除掉带实习字眼的
len(df[cond_1 & cond_2]["positionName"])

PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取

# df = df[cond_1 & cond_2]
# df

筛选出我们想要的字段,并剔除positionName

df = df[cond_1 & cond_2]
df.drop(["positionName"], axis=1, inplace=True)
df.reset_index(drop=True, inplace=True)
df.head()

将薪水转化为数值

采集下来的薪水是一个区间,这里用薪水区间的均值作为相应职位的薪水

处理过程

  1. 将salary中的字符串均小写化(因为存在8k-16k和8K-16K)

  2. 运用正则表达式提取出薪资区间

  3. 将提取出来的数字转化为int型

  4. 取区间的平均值

df["salary"] = df["salary"].str.lower()\.str.extract(r'(\d+)[k]-(\d+)k')\.applymap(lambda x:int(x))\.mean(axis=1)

从job_detail中提取出技能要求

将技能分为以下几类:

  • Python/R

  • SQL

  • Tableau

  • Excel

处理方式: 如果job_detail中含有上述四类,则赋值为1,不含有则为0

df["job_detail"] = df["job_detail"].str.lower().fillna("")  #将字符串小写化,并将缺失值赋值为空字符串df["Python/R"] = df["job_detail"].map(lambda x:1 if ('python' in x) or ('r' in x) else 0)
df["SQL"] = df["job_detail"].map(lambda x:1 if ('sql' in x) or ('hive' in x)  else 0)
df["Tableau"] = df["job_detail"].map(lambda x:1 if 'tableau' in x  else 0)
df["Excel"] = df["job_detail"].map(lambda x:1 if 'excel' in x  else 0)df.head(1)

处理行业信息

def clean_industry(industry):industry = industry.split(",")if industry[0]=="移动互联网" and len(industry)>1:return industry[1]else:return industry[0]df["industryField"] = df.industryField.map(clean_industry)

数据分析可视化

各城市对数据分析岗位的需求量

fig, ax = plt.subplots(figsize=(12,8))
sns.countplot(y="city",order= df["city"].value_counts().index,data=df,color='#3c7f99')
plt.box(False)
fig.text(x=0.04, y=0.90, s='           各城市数据分析岗位的需求量           ', fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')
plt.xlabel('')
plt.ylabel('')
plt.show()

不同细分领域对数据分析岗的需求量

fig, ax = plt.subplots(figsize=(12,8))
sns.countplot(y=industry.values,order = industry_index,color='#3c7f99')
plt.box(False)
fig.text(x=0, y=0.90, s='         细分领域数据分析岗位的需求量(取前十)     ', fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')
plt.xlabel('')
plt.ylabel('')

各城市相应岗位的薪资状况

fig,ax = plt.subplots(figsize=(12,8))
city_order = df.groupby("city")["salary"].mean()\.sort_values()\.index.tolist()
sns.barplot(x="city", y="salary", order=city_order, data=df, ci=95,palette="RdBu_r")
fig.text(x=0.04, y=0.90, s='              各城市的薪资水平对比              ', fontsize=32, weight='bold', color='white', backgroundcolor='#3c7f99')
plt.tick_params(axis="both",labelsize=16,)
ax.yaxis.grid(which='both', linewidth=0.5, color='black')
ax.set_yticklabels([" ","5k","10k","15k","20k"])
plt.box(False)
plt.xlabel('')
plt.ylabel('')

fig,ax = plt.subplots(figsize=(12,8))
fig.text(x=0.04, y=0.90, s='           一线城市的薪资分布对比             ', fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
sns.kdeplot(df[df["city"]=='北京']["salary"],shade=True,label="北京")
sns.kdeplot(df[df["city"]=='上海']["salary"],shade=True,label="上海")
sns.kdeplot(df[df["city"]=='广州']["salary"],shade=True,label="广州")
sns.kdeplot(df[df["city"]=='深圳']["salary"],shade=True,label="深圳")
plt.tick_params(axis='both', which='major', labelsize=16)
plt.box(False)
plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.yticks([])
plt.legend(fontsize = 'xx-large',fancybox=None)
plt.show()

工作经验与薪水的关系

fig,ax = plt.subplots(figsize=(10,8))
sns.heatmap(corr.loc[df["city"].value_counts().index],cmap="RdBu_r",center=20,annot=True,annot_kws={'fontsize':14})
plt.tick_params(axis='x', which='major', labelsize=16)
plt.tick_params(axis='y', which='major', labelsize=16,labelrotation=0)
plt.xlabel(""),plt.ylabel("")

技能要求

def get_level(x):if x["Python/R"] == 1:x["skill"] = "Python/R"elif x["SQL"] == 1:x["skill"] = "SQL"elif x["Excel"] == 1:x["skill"] = "Excel"else:x["skill"] = "其他"return x
df = df.apply(get_level,axis=1)
fig,ax = plt.subplots(figsize=(12,8))
fig.text(x=0.02, y=0.90, s='             不同技能的薪资水平对比            ', fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
sns.boxplot(y="skill",x="salary",data=df.loc[df.skill!="其他"],palette="husl",order=["Python/R","SQL","Excel"])
plt.tick_params(axis="both",labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.75)
plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.box(False)
plt.xlabel('工资', fontsize=18)
plt.ylabel('技能', fontsize=18)

学历要求

from pyecharts.commons.utils import JsCode
def new_label_opts():return opts.LabelOpts(formatter=JsCode("educatio"))
pie = (Pie().add("",[list(z) for z in zip(education.index, np.round(education.values,4))],center=["50%", "50%"],radius=["50%","75%"],label_opts=new_label_opts()).set_global_opts(title_opts=opts.TitleOpts(title=""),legend_opts=opts.LegendOpts(is_show=False)).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%")))


不同规模的公司在招人要求上的差异

company_size_map = {"2000人以上": 6,"500-2000人": 5,"150-500人": 4,"50-150人": 3,"15-50人": 2,"少于15人": 1
}
workYear_map = {"5-10年": 5,"3-5年": 4,"1-3年": 3,"1年以下": 2,"应届毕业生": 1
}
df["companySize"] = df["companySize"].map(company_size_map)
df["workYear"] = df["workYear"].map(workYear_map)



def seed_scale_plot():seeds=np.arange(5)+1y=np.zeros(len(seeds),dtype=int)s=seeds*100colors=['#ff0000', '#ffa500', '#c5b783', '#3c7f99', '#0000cd'][::-1] fig,ax=plt.subplots(figsize=(12,1))plt.scatter(seeds,y,s=s,c=colors,alpha=0.3)plt.scatter(seeds,y,c=colors)plt.box(False)plt.grid(False)plt.xticks(ticks=seeds,labels=list(workYear_map.keys())[::-1],fontsize=14)plt.yticks(np.arange(1),labels=['  经验:'],fontsize=16)
fig, ax = plt.subplots(figsize=(12, 8))
fig.text(x=0.03, y=0.92, s='            不同规模公司的用人需求差异          ', fontsize=32, weight='bold', color='white', backgroundcolor='#3c7f99')
plt.scatter(df_plot.salary, df_plot["workYear"],  s=df_plot["workYear"]*100 ,alpha=0.35,c=df_plot["color"])
plt.scatter(df_plot.salary, df_plot["companySize"], c=df_plot["color"].values.tolist())
plt.tick_params(axis='both', which='both', length=0)
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.75)
plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.xlabel('工资', fontsize=18)
plt.box(False)
seed_scale_plot()

尾语

一篇文章带你了解python数据分析岗位怎么样相关推荐

  1. python人脸识别防小偷_一篇文章带你了解Python 人脸识别有多简单

    今天的Python学习教程给大家介绍一个世界上最简练的人脸辨认库 face_recognition,你可以应用 Python 和命令行工具进行提取.辨认.操作人脸. 基于业内领先的 C++ 开源库 d ...

  2. python人脸识别实验报告总结_一篇文章带你了解Python 人脸识别有多简单

    原标题:一篇文章带你了解Python 人脸识别有多简单 今天的Python学习教程给大家介绍一个世界上最简洁的人脸识别库 face_recognition,你可以使用 Python 和命令行工具进行提 ...

  3. 一篇文章带你了解Python中的游戏开发模块pyglet

    前言 为什么我不选择pygame,原因很简单,因为pyglet 更简单,比较轻量级,就好比django和flask的区别. 相信你在读了这篇文章之后也会毅然决然地选择pyglet. 这篇文章主要围绕p ...

  4. python list find_一篇文章带你了解Python爬虫常用选择器

    原创 麦自香 Python爬虫案例 当我们初学爬虫的时候,我们都会选择一些最基本的网站,往往不带任何反爬措施.比如某个博客站点,我们要爬全站的话,就顺着列表页爬到文章页,再把文章的时间.作者.正文等信 ...

  5. 一篇文章带你了解python装饰器

    一.什么是装饰器 所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改. 这一句话理解起来可能没那么轻松,那先来看一个"傻瓜"函数. 放心,绝对不是& ...

  6. 有没有python的班_【万字长文】别再报班了,一篇文章带你入门Python

    最近有许多小伙伴后台联系我,说目前想要学习Python,但是没有一份很好的资料入门.一方面的确现在市面上Python的资料过多,导致新手会不知如何选择,另一个问题很多资料内容也很杂,从1+1到深度学习 ...

  7. 万字长文,一篇文章带你入门Python

    注释 Python中用#表示单行注释,#之后的同行的内容都会被注释掉. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例 ...

  8. 【Python发展前景】一篇文章带你了解Python未来发展“钱”景

    前言 计算机语言发展至今,已出现众多的编程语言.例如入门较难的C语言,相对通用的Java,适合初学者的Basic语言等. 但自从Python横空出世以来,以其简洁优美.功能强大.开发效率高等先天优势, ...

  9. 一篇文章带你了解Python运算符重载

    回复"python"即可获赠从入门到进阶共10本电子书 今 日 鸡 汤 不堪玄鬓影,来对白头吟. 您可以根据所使用的操作数来更改Python中运算符的含义.这种做法称为运算符重载, ...

最新文章

  1. CPU值满resmgr:cpu quantum造成的Oracle等待事件解决办法
  2. oracle 转化为整数,字符串转换成整数——从源码学习
  3. CentOS 终端显示中文异常解决办法
  4. 【NOI2014】动物园 kmp性质
  5. 【机器学习】岭回归(L2正则在干嘛!)
  6. 网络编程(part10)--socket套接字编程之UDP套接字
  7. C++函数返回引用的含义
  8. openvswitch patch port使用方法
  9. 1986暑假济南清北学堂腾飞营摸鱼记
  10. 如何进行大数据可视化分析
  11. 什么是Internet cookie?
  12. 耳机煲机软件测试自学,乐味煲耳机软件教程 只需三步轻松煲耳机
  13. 兄弟们,以后不能愉快的抽烟
  14. CrazyTalk Animator 3 for Mac破解版永久激活方法附破解补丁
  15. IEEE调研报告:父母关于人工智能对儿童的影响的看法
  16. 让logo设计更有设计感的几个方法
  17. 二进制文件转文本工具
  18. 计算机硬件未来发展前景,计算机硬件发展现状
  19. 数据可视化Echarts学习指南
  20. 常见的HTTP状态码(1xx-5xx)

热门文章

  1. 使用FileZilla等软件搭建ftp服务器
  2. 使用.net core ABP和Angular模板构建博客管理系统(实现博客列表页面)
  3. iphone越狱Hook
  4. python批量自动订票_python+splinter实现12306网站刷票并自动购票流程
  5. Oculus Rift, HTC Vive, SONY PSVR的全面对比
  6. python中素数的求法_Python多种方法求某个范围内的所有素数(质数)
  7. 5款不妨一试的硬盘碎片整理工具
  8. 1一1剖面图方向_圆梦蓝天白云,补2019款1宝马1系提车+Alcantara方向盘作业
  9. 302-驻留集管理,清除策略和加载控制
  10. 护眼灯A级和AA级有什么区别?2022双十一国AA台灯有必要