使用jqdatasdk来探究“裁员”情况是否属实,进一步验证需要等2018年年报数据。
行业人员情况研究¶
背景:最近经常看到裁员等信息,但是并不能确定整个行业的情况,所以希望通过数据验证一下真实的情况
研究思路:¶
通过上市公司,根据行业筛选出来行业内的上市公司,对行业内上市公司公布的年报中的人员信息计算均值,得到历年行业内上市公司人员的均值,观察均值的趋势是否符合预期
需后续验证的问题:¶
因为所处IT行业,就对传统软件行业和互联网行业比较关注,主要是观察了这两个行业分类中的数据。
由于2018年年报还没有出来,待出来后再进行验证现阶段所说裁员的实际情况。
数据选择:¶
- 行业使用的是证监会行业
- 数据使用的是2012-2017年年报数据
结果:¶
- 传统软件行业(在证监会行业列表中的“软件和信息技术服务业”),人数稳定上升。
- 互联网行业(互联网和相关服务),人数在2016年后开始下降
- 展示了按人员数量最多的10个行业和较之前增长率最高的20个行业的信息
import jqdatasdk
jqdatasdk.auth(tel, pwd)
# 获取行业列表
# "sw_l1": 申万一级行业
# "sw_l2": 申万二级行业
# "sw_l3": 申万三级行业
# "jq_l1": 聚宽一级行业
# "jq_l2": 聚宽二级行业
# "zjw": 证监会行业
industries_list = jqdatasdk.get_industries(name='zjw')
industries_list
# 按行业列表获取每个行业公司的列表
def get_complany_lists(industries_list):
complany_lists = []
for industrie in industries_list:
complany_lists.append(jqdatasdk.get_industry_stocks(industrie))
return complany_lists
# 行业内公司的员工信息
def get_employee_df_lists(complany_lists, end_date_list):
employee_df_lists = []
for complany_list in complany_lists:
q=jqdatasdk.query(jqdatasdk.finance.STK_EMPLOYEE_INFO).filter(jqdatasdk.finance.STK_EMPLOYEE_INFO.code.in_(complany_list),jqdatasdk.finance.STK_EMPLOYEE_INFO.end_date.in_(end_date_list)).limit(3000)
employee_df_lists.append(jqdatasdk.finance.run_query(q))
return employee_df_lists
# 计算从2012-2017年行业人数均值
def compute_employee_info(employee_df_lists):
dict_list = []
for employee_df in employee_df_lists:
employee_list = []
employee_dict = {}
for name, group in employee_df.groupby('end_date'):
employee_list.append(group['employee'].sum() / len(group))
employee_dict[name] = group['employee'].sum() / len(group)
dict_list.append(employee_dict)
return dict_list
industries_list = jqdatasdk.get_industries(name='zjw')
end_date_list = ['2012-12-31', '2013-12-31', '2014-12-31', '2015-12-31', '2016-12-31', '2017-12-31']
complany_lists = get_complany_lists(industries_list.index)
employee_df_lists = get_employee_df_lists(complany_lists, end_date_list)
dict_list = compute_employee_info(employee_df_lists)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
industries_dict = {}
for i in range(len(dict_list)):
employee_dict = dict_list[i]
industries_dict[industries_list['name'].iloc[i]] = employee_dict
def plot_industrie_info(industrie_name):
employee_dict = industries_dict[industrie_name]
fig = plt.figure(figsize=(16,6))
ax1 = fig.add_subplot(1,1,1)
ax1.plot(list(employee_dict.keys()), list(employee_dict.values()))
ax1.set_title(industrie_name)
plt.show()
plot_industrie_info('软件和信息技术服务业')
plot_industrie_info('互联网和相关服务')
# 人数前十行业展示
sort_dict = {}
for industrie,employee_dict in industries_dict.items():
if employee_dict:
sort_dict[industrie] = list(employee_dict.values())[-1]
sort_dict = sorted(sort_dict.items(),key = lambda x:x[1],reverse = True)
fig = plt.figure(figsize=(16,6))
ax1 = fig.add_subplot(1,1,1)
for i in range(len(sort_dict)):
if i == 10:
break
employee_dict = industries_dict[sort_dict[i][0]]
ax1.plot(list(employee_dict.keys()), list(employee_dict.values()), label=sort_dict[i][0])
plt.legend()
plt.show()
# 对行业增长情况进行排序
sort_dict = {}
for industrie,employee_dict in industries_dict.items():
if employee_dict:
group_percent = 0
for value in employee_dict.values():
if value != 0:
group_percent = (list(employee_dict.values())[-1] - value) / value
break
sort_dict[industrie] = group_percent
sort_dict = sorted(sort_dict.items(),key = lambda x:x[1],reverse = True)
sort_dict[:20]
fig = plt.figure(figsize=(16,6))
ax1 = fig.add_subplot(1,1,1)
for i in range(len(sort_dict)):
if i == 20:
break
employee_dict = industries_dict[sort_dict[i][0]]
ax1.plot(list(employee_dict.keys()), list(employee_dict.values()), label=sort_dict[i][0])
plt.legend()
plt.show()