行业盈利状况可视化分析在线实验闯关


一、行业净利润增长率计算

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()  # 调用函数执行代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值