一、行业净利润增长率计算
1.任务描述
今有“申万行业分类表.xlsx”,字段依次为:行业名称、股票代码、股票简称。“公司净利润数据表.xlsx”,字段依次为:
股票代码(Stkcd)、会计期间(Accper)、净利润(B002000101),其中会计期间为2011到2017年,计算获得每个行业2012年到2017年的行业净利润增长率,其中当年行业净利润=当年该行业所有上市公司的净利润之和。当年行业经利润增长率=(当年行业净利润-上年行业净利润)/上年行业净利润,返回结果用一个数据框D1来表示,其中index为行业名称,列2012~2017年的净利润增长率。
2.示例代码
# -*- coding: utf-8 -*-
#今有“申万行业分类表.xlsx”,字段依次为:
#行业名称、股票代码、股票简称
# “公司净利润数据表.xlsx”,字段依次为:
# 股票代码(Stkcd)、会计期间(Accper)、净利润(B002000101)
# 其中会计期间为2011-2017年
# 计算获得每个行业2012年~2017年的行业净利润增长率
# 其中当年行业净利润=当年该行业所有上市公司的净利润之和
# 当年行业经利润增长率=(当年行业净利润-上年行业净利润)/上年行业净利润
#返回结果用一个数据框D1来表示,
# 其中index为行业名称,列2012~2017年的净利润增长率
def return_values():
import pandas as pd
import numpy as np
data=pd.read_excel('公司净利润数据表.xlsx')
td=pd.read_excel('申万行业分类表.xlsx')
name=td['行业名称'].value_counts()
name=list(name.index)
D=np.zeros((len(name),7)) # len(name)行,7列的0值矩阵
D1=np.zeros((len(name),6)) # len(name)行,6列的0值矩阵
for i in range(len(name)):
s=td.loc[td['行业名称'].values==name[i],'股票代码'].values # 筛选td中行业名称=i 的股票代码的值
for y in range(2011,2018):
date=str(y)+'-12-31' # 拼接日期2011-2018 12月31日
stk=data.loc[data['Accper'].values==date,'Stkcd'].values # 筛选data中 日期为y年12-31的 stkcd 数据
lr=data.loc[data['Accper'].values==date,'B002000101'].values # 筛选data中 日期为y年12-31的 B002000101 数据
S=pd.Series(lr,index=stk)
s = [i for i in s if i in S.index] # 去掉td中有股票代码值,但是 data中没有股票代码的数据,只保留能对上的数据
D[i,y-2011]=S[s].sum()
for k in range(len(name)):
D1[k,:]=(D[k,1:]-D[k,:-1])/D[k,:-1]
D1=pd.DataFrame(D1,index=name)
return D1
二、绘制2012-2017年净利润增长率排名前8的行业分布图子图
1.任务描述
本关任务:用一个3*2的子图,分别绘制2012年-2017年各个年度净利润增长率前8的行业柱状图,横轴为行业名称(采用字符刻度,字符旋转45度),无需打x轴标签,纵轴为净利润增长率,无需打y轴标签,标题为“xx年净利润增长率前8的行业”,xx为年份。保存图片名称和路径为:
‘2012-2017年净利润增长率排名前8的行业分布图’
2.示例代码
# -*- coding: utf-8 -*-
# 用一个3*2的子图,
#分别绘制2012年-2017年各个年度净利润增长率前8的行业柱状图
# 其中每个年份的柱状图
# 横轴为行业名称(采用字符刻度,字符旋转45度),无需打x轴标签
# 纵轴为净利润增长率,无需打y轴标签
# 标题为“xx年净利润增长率前8的行业”,xx为年份。
# 保存图片名称和路径为:
# plt.savefig('output/2012-2017年净利润增长率排名前8的行业分布图')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import os # 导入os模块管理文件路径和目录
def test():
# 设置matplotlib配置以支持中文显示
font = {'family': 'SimHei'}
matplotlib.rc('font', **font)
data = pd.read_excel('公司净利润数据表.xlsx')
td = pd.read_excel('申万行业分类表.xlsx')
name = td['行业名称'].value_counts()
name = list(name.index)
D = np.zeros((len(name), 7))
D1 = np.zeros((len(name), 6))
for i in range(len(name)):
s = td.loc[td['行业名称'].values == name[i], '股票代码'].values
for y in range(2011, 2018):
date = str(y) + '-12-31'
stk = data.loc[data['Accper'].values == date, 'Stkcd'].values
lr = data.loc[data['Accper'].values == date, 'B002000101'].values
S = pd.Series(lr, index=stk)
s = [x for x in s if x in S.index]
D[i, y - 2011] = S[s].sum()
for k in range(len(name)):
D1[k, :] = (D[k, 1:] - D[k, :-1]) / D[k, :-1]
D1 = pd.DataFrame(D1, index=name)
plt.figure(figsize=(10, 8))
for i in range(6):
plt.subplot(3, 2, i + 1)
plt.title(str(2012 + i) + '年净利润增长率前8的行业')
plt.tight_layout()
q = D1.iloc[:, i].sort_values()[-8:]
plt.bar(range(1, 9), q.values)
plt.xticks(range(1, 9), q.index, rotation=45)
# 确认输出目录存在,如果不存在则创建
output_dir = 'output'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 保存图像文件
file_path = f'{output_dir}/2012-2017年净利润增长率排名前8的行业分布图.png'
plt.savefig(file_path)
test() # 调用函数执行代码