查看原文
其他

高管数据 | 使用pandas对xlsx中的简介字段做文本分析

大邓 大邓和他的Python
2024-09-09



一、高管数据集


1.1 介绍

下载数据集 | 90w条中国上市公司高管数据

90w 条中国上市公司高管简历,数据源-新浪财经,统计的日期范围1990-2021年。

1.2 字段

数据集的字段含,大多是从「个人简历」中计算衍生出来的。

- ID
- 姓名
- 证券代码
- 统计截止日期
- 个人简历
- 国籍
- 籍贯
- 籍贯所在地区代码
- 出生地
- 出生地所在地区代码
- 性别
- 年龄
- 毕业院校
- 学历  1=中专及中专以下;2=大专;3=本科;4=硕士研究生;5=博士研究生;6=其他(以其他形式公布的学历,如荣誉博士、函授等);7=MBA/EMBA
- 专业
- 职称
- 是否领取薪酬
- 报告期报酬总额
- 年末持股数
- 是否高管团队成员
- 是否董事会成员
- 是否独立董事
- 是否兼任董事长和CEO
- 是否监事
- 具体职务

1.3 应用价值

这里粘贴部分应用高管数据论文

何瑛,于文蕾,戴逸驰,王砚羽.高管职业经历与企业创新[J].管理世界,2019,35(11):174-192.
杨林,和欣,顾红芳.高管团队经验、动态能力与企业战略突变:管理自主权的调节效应[J].管理世界,2020,36(06):168-188+201+252.
周楷唐,麻志明,吴联生.高管学术经历与公司债务融资成本[J].经济研究,2017,52(07):169-183.
陆瑶,张叶青,黎波,赵浩宇.高管个人特征与公司业绩——基于机器学习的经验证据[J].管理科学学报,2020,23(02):120-140.
柳光强,孔高文.高管经管教育背景与企业内部薪酬差距[J].会计研究,2021,(03):110-121.
郑建明,孙诗璐,李金甜.高管文化背景与企业债务成本——基于劳模文化的视角[J].会计研究,2021,(03):137-145.


二、代码案例

用Python实现以下五个技术难题,主要对高管简介进行操作

  1. 读取xlsx文件(90w高管数据)
  2. 简介文本中是否含指定词语(例如找出有【清华大学】求学经历的高管)
  3. 大学高管数量排行榜
  4. 统计文本中指定词语出现次数(例如统计每位高管内【大学】出现次数)
  5. 找出每位高管的出生年份(用正则表达式)
  6. 统计每位高管经历的时间点个数 ...

2.1 导入数据

import pandas as pd

df = pd.read_excel('高管数据.xlsx')
#剔除「个人简历」字段中的缺失值
df.dropna(subset=['个人简历'], inplace=True)
df.head()


2.2 简介文本长度

df['个人简历'].str.len()

#新增一个字段length,将简介文本长度保存到length中
#df['length'] = df['个人简历'].str.len()
0 161
1 154
2 395
3 306
4 335
...
900882 40
900883 54
900884 71
900885 41
900886 62
Name: 个人简历, Length: 736970, dtype: int64

2.3 简介文本中是否含指定词语

例如找出有【清华大学】求学经历的高管,这里直接使用**Series.str.contains()**方法来直接搜某字段(Series)是否含某个词

  • len(df[df['个人简历'].str.contains('清华大学')]) 有「清华大学」学习经历的高管人数
  • len(df[df['个人简历'].str.contains('北京大学')]) 有「北京大学」学习经历的高管人数
  • len(df[df['个人简历'].str.contains('清华大学|北京大学')]) 有「清华大学」或「北京大学」学习经历的高管人数
  • len(df[df['个人简历'].str.contains('清华大学') & df['个人简历'].str.contains('北京大学')]) 同时有「清华大学」和「北京大学」学习经历的高管人数

第三个(北大清华)表达式的数量应该是最多的(前两者之和), 第四个表达式是最少。注意, 逻辑【或|】【且&】可以有任意多个

#统计有【清华大学】学习经历的高管人数
len(df[df['个人简历'].str.contains('清华大学')])
10377

len(df[df['个人简历'].str.contains('北京大学')])8709

len(df[df['个人简历'].str.contains('清华大学|北京大学')])18647

len(df[df['个人简历'].str.contains('清华大学') & df['个人简历'].str.contains('北京大学')])439

2.4 大学高管数量排行榜

#测试列表(凭记忆手动输入的大学,各位可以自己设计测试列表)
test_universitys = ['清华大学''北京大学''中国人民大学''浙江大学'
                    '上海交通大学''西安交通大学''同济大学''南开大学''天津大学'
                    '武汉大学''华中科技大学''中国科学技术大学''南京大学',
                    '中山大学''中南大学''四川大学''重庆大学''兰州大学''湖南大学'
                    '山东大学''吉林大学''大连理工大大学''东北大学''北京航空航天大学''中国地质大学']


print('大学高管人数排行')

uni_infos = []
for university in test_universitys:
    num = len(df[df['个人简历'].str.contains(university)])
    uni_infos.append((university, num))
    
uni_infos = sorted(uni_infos, key=lambda k:k[1], reverse=True)
uni_infos

Run

大学高管人数排行

[('清华大学', 10377),
('北京大学', 8709),
('中国人民大学', 7012),
('浙江大学', 5816),
('中山大学', 4065),
('上海交通大学', 3844),
('武汉大学', 3578),
('南京大学', 3272),
('西安交通大学', 2972),
('南开大学', 2716),
('湖南大学', 2502),
('华中科技大学', 2356),
('同济大学', 2089),
('吉林大学', 2044),
('四川大学', 1934),
('山东大学', 1847),
('中南大学', 1615),
('天津大学', 1598),
('重庆大学', 1440),
('北京航空航天大学', 1334),
('东北大学', 1241),
('中国科学技术大学', 842),
('兰州大学', 745),
('中国地质大学', 437),
('大连理工大大学', 0)]

2.5 统计文本中指定词语出现次数

例如统计每位高管内【大学】出现次数

df['个人简历'].str.count('大学')0 0
1 2
2 0
3 0
4 0
..
900882 0
900883 0
900884 0
900885 0
900886 0
Name: 个人简历, Length: 736970, dtype: int64

print('高管总人数: ', len(df))
#简历中无「大学」字眼
print('无大学经历高管人数:' , len(df[df['个人简历'].str.count('大学')==0]))
#简历中有「大学」字眼
print('有大学经历高管人数:' , len(df[df['个人简历'].str.count('大学')>0]))
高管总人数: 736970
无大学经历高管人数: 515172
有大学经历高管人数: 221798

#有些企业单位名字中带有「大学」,但这类企业非常少。
#「大学」词语出现次数可以近似看做学习经历次数
#如此, 1可以看做本科学历,2看做研究生学历, 3看做博士学历
df['个人简历'].str.count('大学').value_counts(normalize=True).plot(kind='bar')


2.6 找出每位高管的出生年份(用正则表达式)

df['个人简历'].str.findall('\d{4}')0 [1969]
1 [1965, 1984, 1986, 1990, 1994, 1995]
2 [1972, 1998, 1999, 2000, 2015, 2002, 2016, 200...
3 [1960, 1982, 1989, 1990, 1991, 1991, 2002, 200...
4 [1962, 2009, 1985, 1996, 1996, 2008, 1993, 200...
...
900882 []
900883 []
900884 []
900885 []
900886 []
Name: 个人简历, Length: 736970, dtype: object

def birth_year(years):
    try:
        #返回出生年份
        return years[0]
    except:
        #没有年份的,返回0
        return 0
    
    
#高管出生年份
df['个人简历'].str.findall('\d{4}').apply(birth_year)
0 1969
1 1965
2 1972
3 1960
4 1962
...
900882 0
900883 0
900884 0
900885 0
900886 0
Name: 个人简历, Length: 736970, dtype: object

#高管时间点个数(感觉可以看做经历的个数)
df['个人简历'].str.findall('\d{4}').apply(lambda ys: len(set(ys)))
0 1
1 6
2 10
3 10
4 8
..
900882 0
900883 0
900884 0
900885 0
900886 0
Name: 个人简历, Length: 736970, dtype: int64



精选内容

管理世界 | 使用文本分析词构建并测量 短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

管理世界 | 用正则表达式、文本向量化、线性回归算法从md&a数据中计算 「企业融资约束指标

管理世界 | 政府与市场心理因素的经济影响及其测度

文本分析 | 中国企业高管团队创新注意力(含代码)

金融研究 | 使用Python构建「关键审计事项信息含量」

PNAS | 14000+篇心理学顶刊论文可复现性调研(含代码)

网络爬虫 | 使用Python采集B站弹幕和评论数据

网络爬虫 | 使用Python披露采集 Up 主视频详情信息

B站 | "高铁互殴"视频词云图绘制

可视化 | 绘制《三体》人物关系网络图

可视化 | 99-21年地方政府报告关键词变化趋势

使用 Word2Vec 和 TF-IDF 计算五类企业文化

采购合同数据集 | 政府采购何以牵动企业创新

96G数据集 | 2亿条中国大陆企业工商注册信息

70G数据集 | 3571万条专利申请数据集(1985-2022年)

93G数据集 | 中国裁判文书网(2010~2021)

数据集 | 3.9G全国POI地点兴趣点数据集

数据集 | 「问询函」

实验数据 | 194城市楼市政策梳理(2010-2022)

数据集 | 07-21年上市公司「委托贷款公告」

单个csv文件体积大于电脑内存,怎么办?

继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存