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

猎聘招聘网数据可视化相关推荐

  1. python + selenium 爬取猎聘招聘网

    Selenium 本是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,模拟用户操作.而这一特性为爬虫开发提供了一个选择及方向,由于其本身依赖于浏览器,所以使用Python的s ...

  2. 【2020-10-27】 scrapy爬虫之猎聘招聘信息爬取

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! scrapy爬虫之猎聘招聘信息爬取 1.项目场景 目标网址:https://www.liepin.com/zhao ...

  3. Python爬虫实战,pytesseract模块,Python实现BOOS直聘拉勾网岗位数据可视化

    前言 利用Python实现BOOS直聘&拉勾网岗位数据可视化.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: requests模块 pyspider模 ...

  4. Scrapy框架学习笔记 - 爬取腾讯招聘网数据

    文章目录 一.Scrapy框架概述 (一)网络爬虫 (二)Scrapy框架 (三)安装Scrapy框架 (四)Scrapy核心组件 (五)Scrapy工作流程 二. Scrapy案例演示 (一)爬取目 ...

  5. Pandas+Pyecharts | 招聘信息数据可视化

    文章目录 1. 导入模块 2. Pandas数据处理 2.1 读取数据 2.2 查看索引.数据类型和内存信息 2.3 缺失值填充 2.4 列拆分(地区列拆分为城市.城区.地址三列) 2.5 删除部分列 ...

  6. 基于Echarts构建大数据招聘岗位数据可视化大屏

  7. 猎聘数据:32.61万!电子通信行业程序员招聘平均年薪最高

    程序员作为互联网技术的关键支撑力量,是携带互联网基因的灵魂人物.5月16日,猎聘大数据研究院推出<2022互联网大厂程序员出路大数据探析>,分析大厂程序员面临的机会以及可能的出路,为大厂程 ...

  8. Python爬虫实战,pytesseract模块,Python实现拉勾网岗位数据可视化

    前言 利用Python实现BOOS直聘&拉勾网岗位数据可视化.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: requests模块 pyspider模块 ...

  9. 数据可视化项目(一)

    目录 简介 技术选型 canvas svg WebGL zrender D3 three.js 图片压缩案例 HighCharts Antv ECharts ECharts 对比 数据报表项目 Top ...

最新文章

  1. 网络流24题(2) P4014 分配问题
  2. volatile关键字及JMM模型
  3. Java提高篇 —— Java内部类详解
  4. 微信小程序入门四:实现table效果
  5. 解决 sublime text3 运行python文件无法input的问题
  6. 寻找不到iframe元素
  7. 不支持给定路径的格式_【国考那些事】2021国/省考,申论答题格式,建议收藏!...
  8. carlife android 无线,carlife为什么不能无线连接 不能无线连接解决方法
  9. QT QComboBox使用详解
  10. 未明学院:大学四年应当如何度过,才算不辜负?
  11. 体验服和平精英服务器维护,和平精英:体验服申请入口
  12. 服务器篇 使用Windows Server 2012R2搭建DHCP服务器-01
  13. Python写的我的世界源码
  14. endnote设置文献第二行悬挂缩进办法
  15. Glide加载常用类型图片(带白色边框的圆形图、圆角矩形图片、圆形图片)
  16. anbox android 镜像,Anbox将使Ubuntu手机能运行Android应用程序
  17. 奶牛慢跑 (寒假每日一题 18)
  18. 实时弹幕系统的设计与实现
  19. 原创|推荐一个月入过万的副业项目!
  20. 计算机软件产业分析,中国工业软件产业链上中下游布局分析及企业一览(附图表)...

热门文章

  1. 夸克浏览器视频缓存的简单合并
  2. java基础入门第二版第二章课后答案,知识点总结+面试题解析
  3. python内置函数什么可以返回列表、元组_Python内置函数_________可以返回列表、元组、字典、集合、字符串以及range对象中元素个数。...
  4. 通讯协议学习-SPI通信(1)
  5. 使用pinyin4j
  6. 程序中有游离的...
  7. 抖音上退货如何赔偿?星志远电商
  8. iOS 11 系统的录屏功能
  9. php语言根据回车换行符来分割字符串
  10. CORS跨域问题原因和解决方案