猎聘招聘网数据可视化
Data Cleaning
import pandas as pd
import numpy as np
import re
from pyecharts.charts import Bar,Map,WordCloud,HeatMap
from pyecharts import options as opts
import matplotlib.pyplot as plt
import nltk
# 下载所需的资源
nltk.download('punkt')
import jieba
from collections import Counter
from matplotlib import rcParams
config = {"font.family":'serif',"font.size": 13,"mathtext.fontset":'stix',"font.serif": ['SimSun'],
}
rcParams.update(config)plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决中文显示问题
data = pd.read_csv('liepin.csv')
data.head()# 去重
print(len(data))
data1 = data.drop_duplicates()
print(len(data1))# 对于缺失值删除所在行的数据
data.dropna(inplace=True)
#统计所有列缺失值
data.isnull().sum()data['工作地区']=data['工作地区'].str.replace(r'-.*', '').str.strip()# 对“工资”列数据进行数据清洗,取中间值来替换
def get_middle_salary(salary_str):# 匹配 8-15k·13薪" 类型的字符串match = re.match(r'(\d{1,2})-?(\d{1,3})k·(\d+)薪', salary_str)if match:min_salary = ((float(match.group(1)) + float(match.group(2))) / 2) * 1000salary_per_month = float(match.group(3))month = salary_per_month - 12middle_salary = ((month * min_salary) / 12) + min_salaryreturn int(middle_salary)match = re.match(r'(\d{1,2})-?(\d{1,3})k', salary_str)if match:middle_salary = (float(match.group(1)) + float(match.group(2))) / 2return int(middle_salary * 1000)# 如果都匹配不上,返回 4000return 4000data['工资'] = data['工资'].apply(get_middle_salary)
Data Visualization
xueli = data['学历'].value_counts().index.to_list()
xueli_num = data['学历'].value_counts().values.tolist()fig, ax = plt.subplots(figsize=(9,6))
plt.bar(xueli, xueli_num, label='academic qualifications')
for a,b,i in zip(xueli,xueli_num,range(len(xueli))): # zip 函数plt.text(a,b+0.01,"%.f"%xueli_num[i],ha='center',fontsize=13) # plt.text 函数plt.title('学历占比情况', size=18)
plt.legend(loc=1)
plt.xlabel('学历', size=17)
plt.ylabel('数量', size=17)
plt.show()
exp = data['经验'].value_counts().index.to_list()
exp_num = data['经验'].value_counts().values.tolist()
guimo = data['规模'].value_counts().index.to_list()
guimo_num = data['规模'].value_counts().values.tolist()fig, axs = plt.subplots(1, 2, figsize=(10, 6), layout='constrained')
axs[0].pie(exp_num, labels=exp, autopct='%1.1f%%')
axs[0].set_title("岗位对象分布图", size=20)axs[1].pie(guimo_num, labels=guimo, autopct='%1.1f%%')
axs[1].set_title('公司规模大小', size=20)
plt.show()
grouped = data.groupby('工作地区')['工资'].mean().round(2)
# 将分组结果转换为列表
places = grouped.index.tolist()
salaries = grouped.tolist()
total_avg_salary = round((sum(salaries) / len(salaries)), 2)# 设置画布大小plt.figure(figsize=(width, height)) 来设置画布大小,其中 width 和 height 分别为画布的宽度和高度
plt.figure(figsize=(10, 5))# 绘制折线图
plt.plot(places, salaries, label='Average wage')
plt.legend(loc=1)
# 绘制参考线
plt.axhline(y=total_avg_salary, color='r', linestyle='-', label='Reference line('+ str(total_avg_salary) + ' RMB)')
# plt.text(-10, 8397, total_avg_salary, ha='left', va='bottom', fontsize=12)
plt.legend(loc=1)
plt.title('各城市平均工资趋势图', size=19)
plt.xlabel('City', size=16)
plt.ylabel('Average salary', size=16)
# 设置 x 轴刻度 plt.xticks(places[::2]) 来设置 x 轴刻度,其中 places[::2] 表示每隔一个标签取一个标签进行显示。
plt.xticks(places[::5])
# 设置 x 轴标签垂直显示
plt.xticks(rotation=90)plt.show()
company_name = data['岗位名称'].value_counts().index.to_list()
company_name_num = data['岗位名称'].value_counts().values.tolist()
# print(company_name_num)
# 计算点的颜色和大小
colors = np.log10(company_name_num)
sizes = company_name_numplt.figure(figsize=(15, 5))
# cmap='coolwarm' 参数来指定颜色条的颜色映射;alpha是一种用于控制图形透明度的参数。它的取值范围是0到1,其中0表示完全透明,1表示完全不透明。
plt.scatter(company_name, company_name_num, c=colors, s=sizes, cmap='coolwarm',label='Job demand',alpha=0.5)
plt.xlabel('Job Name', size=16)
plt.ylabel('Number of jobs recruited', size=16)
plt.title('岗位需求散点图', size=21)
# 添加颜色条
plt.colorbar(label='Number of jobs')
plt.legend(loc=1)
plt.xticks(company_name[::75])
plt.xticks(rotation=90)# 显示图形
plt.show()
df1 = data.groupby(['公司名称', '学历']).size()
# 将结果重塑为一个表格,并将缺失值填充为 0
df1 = df1.unstack(fill_value=0)df1 = pd.DataFrame(df1)
# 将前两列相加并添加为新列
df1['次数'] =df1.iloc[:, 1:-1].sum(axis=1)# 获取列名列表
column_names = df1.columns.tolist()# 各公司招聘岗位中,各学历'中专/中技', '博士', '大专', '学历不限', '本科', '硕士', '统招本科', '高中',是需要情况;
# '次数':公司要招聘的岗位数
zhongzhuan_list = df1.loc[:, column_names[0]].tolist()
boshi_list = df1.loc[:, column_names[1]].tolist()
dazhuan_list = df1.loc[:, column_names[2]].tolist()
xuelibuxian_list = df1.loc[:, column_names[3]].tolist()
benke_list = df1.loc[:, column_names[4]].tolist()
shuoshi_list = df1.loc[:, column_names[5]].tolist()
tongzhaobenke_list = df1.loc[:, column_names[6]].tolist()
gaozhong_list = df1.loc[:, column_names[7]].tolist()
# cishu_list = df1.loc[:, column_names[8]].tolist()# 公司名称列表
company_list = df1.index.tolist()# plt.figure(figsize=(16, 8))
fig, axs = plt.subplots(2, 1, figsize=(16, 15))
plt.suptitle('各公司招聘学历折线图', fontsize=30)
# top参数用于设置Figure对象的顶部边缘到子图顶部的距离,hspace参数用于设置子图之间的垂直间距,取值范围为0到1
plt.subplots_adjust(top=0.92, hspace=1)axs[0].plot(company_list, zhongzhuan_list, label='中专/中技')
axs[0].plot(company_list, boshi_list, label='博士')
axs[0].plot(company_list, dazhuan_list, label='大专')
axs[0].plot(company_list, xuelibuxian_list, label='学历不限')
axs[0].set_xlabel('Company Name',size=16)
axs[0].set_ylabel('Number of Academic Degrees',size=16)
axs[0].grid(True)
axs[0].set_xticks(company_list[::75])
axs[0].tick_params(axis='x', labelrotation=90)
axs[0].legend()axs[1].plot(company_list, benke_list, label='本科')
axs[1].plot(company_list, shuoshi_list, label='硕士')
axs[1].plot(company_list, tongzhaobenke_list, label='统招本科')
axs[1].plot(company_list, gaozhong_list, label='高中')
# plt.plot(company_list, cishu_list, label='招聘岗位数')
axs[1].set_xlabel('Company Name', size=16)
axs[1].set_ylabel('Number of Academic Degrees', size=16)
axs[1].grid(True)
axs[1].set_xticks(company_list[::75])
axs[1].tick_params(axis='x', labelrotation=90)
axs[1].legend()plt.show()
city_list = data['工作地区'].value_counts().index.to_list()
city_num = data['工作地区'].value_counts().values.tolist()new_city_list = [] # 创建一个新的空列表来存储更新后的元素
for city in city_list:if city[-1] == '县':new_city_list.append(city)else:new_city = city + "市" # 在每个元素后面添加"市"字符串new_city_list.append(new_city) # 将更新后的元素添加到新列表中province_list = [(z) for z in zip(new_city_list, city_num)]def china_map():c = (Map().add("Company",province_list,"china-cities",label_opts=opts.LabelOpts(is_show=False),).set_global_opts(title_opts=opts.TitleOpts(title="招聘岗位在全国的分布情况",title_textstyle_opts=opts.TextStyleOpts(font_size=27, font_family='SimSun')),visualmap_opts=opts.VisualMapOpts(),))return cchina_map().render_notebook()
diqu = ['北京','上海','广州','深圳','天津','苏州','重庆','苏州','杭州','大连','成都','武汉','西安','南宁','中山','厦门','山东','延安','太原','湛江']
# df2 = data[data['工作地区'].isin(diqu)].reset_index(drop=True)
df2 = data[data['工作地区'].isin(pd.Series(diqu))].reset_index(drop=True)df3 = df2.groupby(['工作地区', '学历']).size()
df3 = df3.unstack(fill_value=0)
df3 = pd.DataFrame(df3)xuelis = df3.columns.tolist()
citys = df3.index.tolist()print(df3)result = []
for i, row in enumerate(df3.index):for j, col in enumerate(df3.columns):value = df3.iloc[i, j]result.append([i, j, value])
data1 = [[d[0], d[1], d[2] or "-"] for d in result]def heatmap_diqu():c = (HeatMap().add_xaxis(xaxis_data=citys).add_yaxis(series_name="Qualifications",yaxis_data=xuelis,value=data1,label_opts=opts.LabelOpts(is_show=True, color="#fff", position="bottom", horizontal_align="50%"),).set_series_opts().set_global_opts(legend_opts=opts.LegendOpts(is_show=False), #隐藏图例title_opts=opts.TitleOpts(title="热力图-----热门城市各学历需求",title_textstyle_opts=opts.TextStyleOpts(font_size=27, font_family='SimSun')),
# 设置 X 轴为类别型,显示分割区域,并设置分割区域的样式为不透明xaxis_opts=opts.AxisOpts(type_="category",splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),axislabel_opts=opts.LabelOpts(font_size=14)),yaxis_opts=opts.AxisOpts(type_="category",splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),axislabel_opts=opts.LabelOpts(font_size=14)),
# 颜色条:orient="horizontal"水平,pos_left="center"居中显示visualmap_opts=opts.VisualMapOpts(min_=10, max_=100, is_calculable=True, orient="horizontal", pos_left="center"),))return cheatmap_diqu().render_notebook()
Original data set
猎聘招聘网数据可视化相关推荐
- python + selenium 爬取猎聘招聘网
Selenium 本是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,模拟用户操作.而这一特性为爬虫开发提供了一个选择及方向,由于其本身依赖于浏览器,所以使用Python的s ...
- 【2020-10-27】 scrapy爬虫之猎聘招聘信息爬取
声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! scrapy爬虫之猎聘招聘信息爬取 1.项目场景 目标网址:https://www.liepin.com/zhao ...
- Python爬虫实战,pytesseract模块,Python实现BOOS直聘拉勾网岗位数据可视化
前言 利用Python实现BOOS直聘&拉勾网岗位数据可视化.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: requests模块 pyspider模 ...
- Scrapy框架学习笔记 - 爬取腾讯招聘网数据
文章目录 一.Scrapy框架概述 (一)网络爬虫 (二)Scrapy框架 (三)安装Scrapy框架 (四)Scrapy核心组件 (五)Scrapy工作流程 二. Scrapy案例演示 (一)爬取目 ...
- Pandas+Pyecharts | 招聘信息数据可视化
文章目录 1. 导入模块 2. Pandas数据处理 2.1 读取数据 2.2 查看索引.数据类型和内存信息 2.3 缺失值填充 2.4 列拆分(地区列拆分为城市.城区.地址三列) 2.5 删除部分列 ...
- 基于Echarts构建大数据招聘岗位数据可视化大屏
- 猎聘数据:32.61万!电子通信行业程序员招聘平均年薪最高
程序员作为互联网技术的关键支撑力量,是携带互联网基因的灵魂人物.5月16日,猎聘大数据研究院推出<2022互联网大厂程序员出路大数据探析>,分析大厂程序员面临的机会以及可能的出路,为大厂程 ...
- Python爬虫实战,pytesseract模块,Python实现拉勾网岗位数据可视化
前言 利用Python实现BOOS直聘&拉勾网岗位数据可视化.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: requests模块 pyspider模块 ...
- 数据可视化项目(一)
目录 简介 技术选型 canvas svg WebGL zrender D3 three.js 图片压缩案例 HighCharts Antv ECharts ECharts 对比 数据报表项目 Top ...
最新文章
- 网络流24题(2) P4014 分配问题
- volatile关键字及JMM模型
- Java提高篇 —— Java内部类详解
- 微信小程序入门四:实现table效果
- 解决 sublime text3 运行python文件无法input的问题
- 寻找不到iframe元素
- 不支持给定路径的格式_【国考那些事】2021国/省考,申论答题格式,建议收藏!...
- carlife android 无线,carlife为什么不能无线连接 不能无线连接解决方法
- QT QComboBox使用详解
- 未明学院:大学四年应当如何度过,才算不辜负?
- 体验服和平精英服务器维护,和平精英:体验服申请入口
- 服务器篇 使用Windows Server 2012R2搭建DHCP服务器-01
- Python写的我的世界源码
- endnote设置文献第二行悬挂缩进办法
- Glide加载常用类型图片(带白色边框的圆形图、圆角矩形图片、圆形图片)
- anbox android 镜像,Anbox将使Ubuntu手机能运行Android应用程序
- 奶牛慢跑 (寒假每日一题 18)
- 实时弹幕系统的设计与实现
- 原创|推荐一个月入过万的副业项目!
- 计算机软件产业分析,中国工业软件产业链上中下游布局分析及企业一览(附图表)...
热门文章
- 夸克浏览器视频缓存的简单合并
- java基础入门第二版第二章课后答案,知识点总结+面试题解析
- python内置函数什么可以返回列表、元组_Python内置函数_________可以返回列表、元组、字典、集合、字符串以及range对象中元素个数。...
- 通讯协议学习-SPI通信(1)
- 使用pinyin4j
- 程序中有游离的...
- 抖音上退货如何赔偿?星志远电商
- iOS 11 系统的录屏功能
- php语言根据回车换行符来分割字符串
- CORS跨域问题原因和解决方案