招聘分析

# 加载包
import pandas as pd

# 练习2 - 招聘分析 - 加载数据
'''drop_duplicates:
参数
	subset: 列标签,可选
	keep: {‘first’, ‘last’, False}, 默认值 ‘first’
		first: 删除第一次出现的重复项。
		last: 删除重复项,除了最后一次出现。
		False: 删除所有重复项。
	inplace:布尔值,默认为False,是否删除重复项或返回副本
subset=None表示考虑所有列,将这所以列对应值相同的行进行去重。默认值None。subset=[‘B’]表示只考虑’B’这列,将B列对应值相同的行进行去重。

keep='first’表示保留第一次出现的重复行,是默认值。keep另外两个取值为"last"和False,分别表示保留最后一次出现的重复行和去除所有重复行。

inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本
'''

df = pd.read_csv('data/DataAnalyst.csv', encoding='gb2312') #
df = df.drop_duplicates(subset='positionId', keep='first') # 删除重复数据drop_duplicates
df.head()

# 练习2 - 招聘分析 - 加工工资字段
'''zip函数以及upper,next函数,applay'''
def parse_salary(salary):
    arr = salary.split('-')
    low = arr[0].upper()
    low = int(low[:low.find('K')]) ####???????
    if len(arr) == 1:
        up = low
    else:
        up = arr[1].upper()
        up = int(up[:up.find('K')])
    return [low, up]

salaries = df.salary.apply(parse_salary)#####apply
salaries = zip(*salaries)
low_salaries = next(salaries)
up_salaries = next(salaries)
df['lowSalary'] = low_salaries
df['upSalary'] = up_salaries
df['avgSalary'] = (df['lowSalary'] + df['upSalary']) / 2
df.head()

# 练习2 - 招聘分析 - 保留关键列
df = df[['city', 'companyShortName', 'companySize',
         'education', 'positionName', 'positionLables',
         'workYear', 'avgSalary']]
df.head()

# 练习2 - 招聘分析 - 查看统计信息
df.describe()

# 练习2 - 招聘分析 - 查看各城市信息条数
df.city.value_counts()

# 练习2 - 招聘分析 - 查看各城市平均工资
df.groupby('city').mean()

# 练习2 - 招聘分析 - 根据城市和教育程度统计平均工资
#groupby
df_city_education = df.groupby(['city', 'education']).mean()
print(df_city_education)
###unstack:内层索引反转到列上,stack
df_city_education = df_city_education.unstack() # 内层索引转到列
print(df_city_education.head())
# df_ce=df_city_education.stack()
# print(df_ce)

# 练习2 - 招聘分析 - 查看各城市招聘需求topX的公司
#sort_values:
def topN(col, n=5):
    counts = col.value_counts()
    return counts.sort_values(ascending=False)[:n]#传进来的是公司的名字companyShortName,为什么要用【:n】因为降序取前n行

#df.groupby('city')['companyShortName'].apply(topN, n=3) # 如果是职位topX呢?
df.groupby('city').companyShortName.apply(topN, n=3) # 如果是职位topX呢?
#不能用unstack,因为第二列很不一样所以会有很多Nan

# 练习2 - 招聘分析 - 查看工资分布情况
df.avgSalary.hist(bins=15)
#直方图的横坐标是具体的区别,主要用来看样本的分布情况
#柱状图,横坐标

# 练习2 - 招聘分析 - 箱形图,看各城市工资分布。
# 箱形图的绘制步骤: [2]
# 1. 画数轴,度量单位大小和数据批的单位一致,起点比最小值稍小,长度比该数据批的全距稍长。
# 2. 画一个矩形盒,两端边的位置分别对应数据批的上下四分位数(Q3和Q1)。在矩形盒内部中位数(Xm)位置画一条线段为中位线。
# 3. 在Q3+1.5IQR和Q1-1.5IQR处画两条与中位线一样的线段,这两条线段为异常值截断点,称其为内限;在Q3+3IQR和Q1-3IQR处画两条线段,称其为外限。处于内限以外位置的点表示的数据都是异常值,其中在内限与外限之间的异常值为温和的异常值(mild outliers),在外限以外的为极端的异常值(extreme outliers)。四分位距IQR=Q3-Q1。.
# 4. 从矩形盒两端边向外各画一条线段直到不是异常值的最远点,表示该批数据正常值的分布区间。
# 5. 用“〇”标出温和的异常值,用“*”标出极端的异常值。相同值的数据点并列标出在同一数据线位置上,不同值的数据点标在不同数据线位置上。至此一批数据的箱形图便绘出了。统计软件绘制的箱形图一般没有标出内限和外限。
# 异常值被定义为小于Q1-1.5IQR或大于Q3+1.5IQR(IQR = Q3 - Q1)的值。
df.boxplot(column='avgSalary', by='city') # 如果看学历呢?

# 练习2 - 招聘分析 - 箱形图,根据城市学历组合看工资分布。

#怎么计算四分位数
df_bj_sh = df[df['city'].isin(['上海', '北京'])]
df_bj_sh.boxplot(column='avgSalary', by=['education','city'], figsize=(18, 6))

# 练习2 - 招聘分析 - 柱状图看各城市工资分布。
df.groupby('city').mean().plot.bar()

# 练习2 - 招聘分析 - 柱状图看各城市学历组合对应工资分布。
df.groupby(['city', 'education']).mean().unstack().plot.bar(figsize=(10, 3))



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值