前言
为什么要进行职位分析?职位分析是人力资源开发和管理的基础与核心,是企业人力资源规划、招聘、培训、薪酬制定、绩效评估、考核激励等各项人力资源管理工作的依据。其次我们可以根据不同岗位的职位分析,可视化展示各岗位的数据分析报告。
之前网上也有不少关于行业的分析数据,今天我们就根据不同岗位,公司类型规模,学历要求,薪资分布等来进行分析,把职位分析功能集合封装起来,做成一个小工具分享给大家吧。
首先我们来看看分析展示的效果:
下面,我们开始介绍这个小工具的制作过程。
1. 核心功能设计
总体来说,我们的这款职位分析器可以通过输入岗位关键字和岗位条数,自动爬取相关岗位的数据,并对爬虫的岗位可视化表格展示。然后分析这些岗位数据的公司类型规模,对学历要求,薪资分布等。
拆解需求,大致可以整理出核心功能如下:
-
可视化展示岗位表格数据
- 通过输入的岗位关键字和获取条数,自动爬取职位数据
- 对爬虫的职位原始数据进行清洗
- 读取展示清洗后的职位数据
-
分析岗位薪资情况
- 根据工作年限及对应平均薪资,绘制工作经验年限和薪资折线图
- 统计汇总薪资分布区间,了解该岗位薪资情况,展示薪资分布直方图
-
分析岗位公司情况
- 展示岗位中公司类型分布情况,包含民营企业、合资、上市、外企等等
- 展示公司规模人数分布情况,包含少于50人,50-150,150-500等等
- 统计岗位对于学历的要求
-
数据分析导出
- 对于可视化数据进行弹窗预览,并将数据导出保存
基本的核心功能确定,下面我们我们首先开始GUI设计。
2. GUI设计与实现
基于功能点,我们可以先考虑进行简单的UE布局设计,然后再通过GUI开发库进行设计,这里采用的是tkinker,主要是简单方便。
基于UI设计,我们gui设计编码如下:
# 创建主窗口
root = Tk()
root.title('职位查询分析数据平台 -- Dragon少年')
# 设置窗口大小
root.minsize(1380, 730)
root.resizable(False, False)
#得到屏幕宽度
sw = root.winfo_screenwidth()
#得到屏幕高度
sh = root.winfo_screenheight()
ww = 1380
wh = 730
x = (sw-ww) / 2
y = (sh-wh) / 2
root.geometry("%dx%d+%d+%d" %(ww,wh,x,y))
frame_left_top = Frame(width=1050, height=400)
frame_right_top = Frame(width=320, height=400)
# 定义列表区域
tree = ttk.Treeview(frame_left_top, show="headings", height=18,
columns=("n", "a", "b", "c", "d", "e", "f", "g", "h"))
vbar = ttk.Scrollbar(frame_left_top, orient=VERTICAL, command=tree.yview)
# 定义树形结构与滚动条
tree.configure(yscrollcommand=vbar.set)
# 表格的标题
tree.column("n", width=60, anchor="center")
tree.column("a", width=180, anchor="center")
tree.column("b", width=200, anchor="center")
tree.column("c", width=100, anchor="center")
tree.column("d", width=100, anchor="center")
tree.column("e", width=80, anchor="center")
tree.column("f", width=100, anchor="center")
tree.column("g", width=90, anchor="center")
tree.column("h", width=90, anchor="center")
tree.heading("n", text="序号")
tree.heading("a", text="岗位名称")
tree.heading("b", text="公司名称")
tree.heading("c", text="公司类型")
tree.heading("d", text="公司规模")
tree.heading("e", text="学历")
tree.heading("f", text="工作经验")
tree.heading("g", text="最低工资(k)")
tree.heading("h", text="最高工资(k)")
tree.grid(row=0, column=0, sticky=NSEW)
vbar.grid(row=0, column=1, sticky=NS)
# 整体区域定位
frame_left_top.grid(row=0, column=0, padx=4, pady=5)
frame_right_top.grid(row=0, column=1, padx=2, pady=2)
frame_left_top.grid_propagate(0)
frame_right_top.grid_propagate(0)
type_str=StringVar()
#设置滚动窗口文本
habits = tk.LabelFrame(root, text="公司类型", padx=10, pady=4 ) # 水平,垂直方向上的边距均为 10
habits.place(x=1035, y=170)
habits_Window = Label(habits, textvariable=type_str, width=30, height=10, font=('楷体', 12))
habits_Window.grid()
size_str=StringVar()
#设置滚动窗口文本
company_size = tk.LabelFrame(root, text="公司规模", padx=10, pady=4 ) # 水平,垂直方向上的边距均为 10
company_size.place(x=1035, y=370)
company_size_Window = Label(company_size, textvariable=size_str, width=30, height=8, font=('楷体', 12))
company_size_Window.grid()
edu_str=StringVar()
#设置滚动窗口文本
company_edu = tk.LabelFrame(root, text="学历要求", padx=10, pady=4 ) # 水平,垂直方向上的边距均为 10
company_edu.place(x=1035, y=540)
company_edu_Window = Label(company_edu, textvariable=edu_str, width=30, height=8, font=('楷体', 12))
company_edu_Window.grid()
# 打开文件
# right_top_button = Button(frame_right_top, text="打开文件", command=lambda :openFile(), font=('楷体', 12))
input_name = Label(frame_right_top, text='岗位关键字:', font=('楷体',