初级选手数据分析——Python职位数据分析全链路_基于python实现大数据相关行业的数据的薪资清洗-程序员宅基地

技术标签: python  


最近在做Python职位分析的项目,做这件事的背景是因为接触Python这么久,还没有对Python职位有一个全貌的了解。所以想通过本次分析了解Python相关的职位有哪些、在不同城市的需求量有何差异、薪资怎么样以及对工作经验有什么要求等等。分析的链路如目录所示。
总共分为上下两篇文章。上篇介绍前三部分内容,下篇重点介绍文本分析。

0. 数据采集

巧妇难为无米之炊,我们做数据分析大部分情况是用公司的业务数据,因此就不需要关心数据采集的问题。然而我们自己业余时间做的一些数据探索更多的需要自己采集数据,常用的数据采集技术就是爬虫。

本次分享所用的数据是我从拉勾网爬取的,主要分为三部分,确定如何抓取数据、编写爬虫抓取数据、将抓取的数据格式化并保存至MongoDB。关于数据采集这部分内容我之前有一篇文章单独介绍过,源码也开放了,这里我就不再赘述了,想了解的朋友可以翻看之前那篇文章《Python爬职位》。

1. 数据清洗

有了数据后,先不要着急分析。我们需要对数据先有个大概的了解,并在这个过程中剔除一些异常的记录,防止它们影响后续的统计结果。

举个例子,假设有101个职位,其中100个的薪资是正常值10k,而另外一个薪资是异常值1000k,如果算上异常值计算的平均薪资是29.7k,而剔除异常值计算的平均薪资是10k,二者差了将近3倍。

所以我们在作分析前要关注数据质量,尤其数据量比较少的情况。本次分析的职位数有1w条左右,属于比较小的数据量,所以在数据清洗这一步花了比较多的时间。

下面我们就从数据清洗开始,进入编码阶段

1.0 筛选python相关的职位

导入常用库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pymongo import MongoClient

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  #解决seaborn中文字体显示问题
%matplotlib inline

从MongoDB读取数据

mongoConn = MongoClient(host='192.168.29.132', port=27017)
db = mongoConn.get_database('lagou')
mon_data = db.py_positions.find()
# json转DataFrame
jobs = pd.json_normalize([record for record in mon_data])

预览数据

jobs.head(4)

图片职位

打印出jobs的行列信息

jobs.info()

图片
DateFrame info

一共读取了1.9w个岗位,但这些岗位里并不都是跟Python相关的。所以我们首先要做的就是筛选Python相关的职位,采用的规则是职位标题或正文包含python字符串

# 抽取职位名称或者职位正文里包含 python 的
py_jobs = jobs[(jobs['pName'].str.lower().str.contains("python")) | (jobs['pDetail'].str.lower().str.contains("python"))]

py_jobs.info()

筛选后,只剩下10705个岗位,我们继续对这部分岗位进行清洗。

1.1 按照创建时间清洗异常值

对 “职位创建时间” 维度清洗主要是为了防止有些创建时间特别离谱的岗位混进来,比如:出现了2000年招聘的岗位。

# 创建一个函数将职位创建时间戳转为月份
import time
def timestamp_to_date(ts):
    ts = ts / 1000
    time_local = time.localtime(ts)
    return time.strftime("%Y-%m", time_local)
    
# 增加'职位创建月份'一列
py_jobs['createMon'] = py_jobs['createTime'].map(timestamp_to_date)

# 按照职位id、创建月份分组计数
py_jobs[['pId', 'createMon']].groupby('createMon').count()

不同月的职位
不同月的职位

创建timestamp_to_date 函数将“职位创建时间”转为“职位创建月份”,然后按“职位创建月份”分组计数。从结果上看,职位创建的时间没有特别离谱的,也就是说没有异常值。即便如此,我仍然对职位创建时间进行了筛选,只保留了10、11、12三个月的数据,因为这三个月的职位占了大头,并且我只想关注新职位。

# 只看近三个月的职位
py_jobs_mon = py_jobs[py_jobs['createMon'] > '2020-09']

1.2 按照薪资清洗异常值

对薪资进

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_68104000/article/details/124255264

智能推荐

DDR3基本概念1 - 存储单元结构和原理_sense amplifier-程序员宅基地

文章浏览阅读1.8k次。一个基本存储单元结构图如下图, storage capacitor为一个基本存储单元,当access transitor被选通时,可读可写: 一个4行3列的DDR 存储器如下图所示: 上图中蓝色的为bit line。相邻行的对应bit的bit line之间有一个两个反相器首尾相连的sense amplifier。红色的为word line,连接了同一行的所有的存储电容的transistor的栅极。 DDR..._sense amplifier

著名游戏"植物大战僵尸",从0到1亿美元 ---- PopCap创始人自述_com.popcap.samguo-程序员宅基地

文章浏览阅读844次。PopCap是哪家公司我就不介绍了,如果没有玩过他们的游戏,可以说你没有玩儿过PC游戏 8 )比较震惊的是他所说的最后一句话:“我们始终有一个信念,那就是一定要做出顶尖游戏,那样才能赚到大钱,如果一个游戏只是勉强可玩,那就一分钱也赚不到。” 可以类推到我们所做的其他产品。记得小时候,我有个舅爷,正月卖灯笼,7几年的时候,那种用纸扎的小羊灯笼,底下四个轮子,我们一帮小屁孩拉着可以到处跑的灯笼。但我舅爷的小羊轮子不能转,他说没事,别人卖1块5,我卖1块就可以了。结果。_com.popcap.samguo

spring boot 异常处理_serverproperties getservletprefix() springboot 2.0-程序员宅基地

文章浏览阅读4.9k次。spring boot在异常的处理中,默认实现了一个EmbeddedServletContainerCustomizer并定义了一个错误页面到”/error”中,在ErrorMvcAutoConfiguration源码中可以看到/** * {@link EmbeddedServletContainerCustomizer} that configures the container's error_serverproperties getservletprefix() springboot 2.0

jQuery实现页面滑动时导航背景色切换_jquery仿导航栏向下滑动导航栏变色-程序员宅基地

文章浏览阅读774次,点赞2次,收藏2次。<script type="text/javascript" src="./files-m/jquery-1.9.1.min.js"></script><script >//网页加载时运行$(function(){ navHeader(); $(window).scroll(function () { navHeader(); }) function navHeader() { if ($(windo_jquery仿导航栏向下滑动导航栏变色

错用mybatis映射文件#和$导致的问题_mybatis #{list.size} 预编译失败-程序员宅基地

文章浏览阅读254次。如下Mapper.xml文件:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="c..._mybatis #{list.size} 预编译失败

rust-lldb调试Rust程序-程序员宅基地

文章浏览阅读1.2k次。rust-lldb如何调试带有选项的程序# rust-lldb -- target/debug/racon --root /opt/run/racon run 2333 --bundle /opt/mycontainer/很简单只需要在rust-lldb与程序之间添加 --_lldb调试rust

随便推点

Visual Studio各版本区别-程序员宅基地

文章浏览阅读119次。Visual Studio 是微软公司推出的开发环境,Visual Studio 可以用来创建 Windows 平台下的 Windows 应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office 插件。V.S.2012  .1、VS2012和VS2010相比,最大的新特性莫过于对Windows 8 Metro开发的支持。Metro天生为云+端而生,简洁、数..._visual studio 各个版本的区别

列表排序-程序员宅基地

文章浏览阅读41次。原理:  1、用rows方法获取到所有的行并放进Array里,不能用for..in的方式获取,因为for..in会获取所有rows方法相关的参数。  2、用sort方法或其他排序方法Function参数进行排序。  3、创建Fragment元素,append方法会将所有原table内容转移至Fragment元素内。  4、table元素加载Fragment。..._"排序\">"

【论文摘要】基于多数投票模式和超混沌加密的彩色图像鲁棒安全零水印算法_多数投票机制 水印-程序员宅基地

文章浏览阅读1.8k次。Robust and secure zero-watermarking algorithm for color images based on majority voting pattern and hyper-chaotic encryption标题:基于多数投票模式和超混沌加密的彩色图像鲁棒安全零水印算法作者:Xiao-bing Kang,Guang-feng Lin,Ya-jun Chen,Fan Zhao,Er-hu Zhang,Cui-ning Jing发布年份:2019摘要:鲁棒零水_多数投票机制 水印

Windows下用anaconda装python,添加jupyter的kernel以及装包_jupyter kernel没有安装包但可以用-程序员宅基地

文章浏览阅读5.1k次。环境:Windows 7 主要问题: 1. 先在anaconda官网上下载了python3+的版本,其他人安装时一般先安装python2再安装python3,没有相关经验可供参考;2. 安装anaconda时选了非默认路径(C盘某处),安装在D盘下,为后来的cmd调用命令造成了困难,无法用cd更换路径解决;3. 安装完python2的jupyter notebook的kernel时_jupyter kernel没有安装包但可以用

即将上线主网的Telegram区块链和Libra,谁的野心更大?-程序员宅基地

文章浏览阅读391次。两者在穿越两年之后十分戏剧化地 “会面” 了。文 | 芦荟 运营 | 盖遥编辑| 卢晓明出品|Odaily星球日报(ID:o-daily)继 Facebook..._fiftusdt

C++基础三_设有一组结点,其权值w={1,4,9,16,25,36,49,64,81,100},画出由这些结点所-程序员宅基地

文章浏览阅读189次。C++基础学习三对象的构造和析构构造函数和析构函数构造函数语法:析构函数语法:构造函数的分类及调用匿名拷贝构造函数(错误)拷贝构造函数的调用时机构造函数调用规则深拷贝和浅拷贝浅拷贝深拷贝多个对象构造和析构初始化列表类对象作为成员explicit关键字动态对象创建对象创建C动态分配内存(隐患)newdelete用于数组的new和delete使用new和delete采用相同形式delete void*..._设有一组结点,其权值w={1,4,9,16,25,36,49,64,81,100},画出由这些结点所构成