金融数据分析-基于 Python 的申万行业财务数据可视化分析系统
一、项目背景与意义
在金融投资和行业研究领域,及时掌握各行业的财务表现是做出明智决策的关键。申万行业分类作为国内常用的行业划分标准,其涵盖的行业数据具有重要的参考价值。本项目通过 Python 实现了申万行业的营业收入与营业利润可视化分析系统,帮助研究者快速了解不同行业在 2018-2024 年间的财务表现及增长趋势。
该系统主要解决了以下问题:
- 多年度财务数据的整合与处理
- 行业分类数据与财务数据的关联分析
- 关键财务指标的可视化展示
- 行业增长趋势的直观对比
二、技术栈选择
本项目主要采用以下技术:
- Pandas:用于数据读取、清洗、合并和分析
- Streamlit:构建交互式 Web 应用,实现数据可视化展示
- Matplotlib:绘制行业财务指标的柱状图
- NumPy:提供数值计算支持
选择这些技术的原因在于它们的组合能够快速实现数据分析与可视化的全流程,且 Streamlit 的交互式特性非常适合构建数据看板类应用。
三、核心功能实现
1. 数据读取与预处理
首先需要读取行业分类数据和各年度财务数据,并进行必要的预处理:
# 读取申万行业分类数据
try:
info = pd.read_excel('申万行业分类2.xlsx')
# 读取各年度数据
years = [2018, 2019, 2020, 2021, 2022, 2023, 2024]
data_dict = {}
for year in years:
data_dict[year] = pd.read_excel(f'Data{year}.xlsx')
# 读取上市公司基本信息
company_info = pd.read_excel('上市公司基本信息.xlsx')
# 读取股票基本信息
stock_info = pd.read_excel('股票基本信息表.xlsx')
except FileNotFoundError as e:
st.error(f"文件未找到:{e},请检查文件路径和名称是否正确")
st.stop()
这里使用了异常处理机制,当文件不存在时能够给出明确提示,提高了程序的健壮性。
2. 数据合并与处理
数据合并是本项目的关键步骤,需要将行业分类数据与各年度财务数据正确关联:
# 合并数据:将行业分类与各年度财务数据关联
merged_data = {}
for year in years:
# 核心修正:统一合并键的数据类型(转为字符串)
# 财务数据的ts_code列转字符串
data_dict[year]['ts_code'] = data_dict[year]['ts_code'].astype(str)
# 申万行业分类的股票代码列转字符串
info['股票代码'] = info['股票代码'].astype(str)
# 按股票代码合并
merged = pd.merge(data_dict[year], info, left_on='ts_code', right_on='股票代码', how='left')
merged_data[year] = merged
# 添加年度列
merged_data[year]['年度'] = year
# 合并所有年度数据
all_data = pd.concat(merged_data.values(), ignore_index=True)
特别需要注意的是,这里将股票代码统一转为字符串类型,避免了因数据类型不一致导致的合并错误,这是处理金融数据时的常见问题点。
3. 行业数据统计分析
对合并后的数据按行业和年度进行分组统计,计算关键指标:
# 按行业和年度分组聚合
group_cols = [level, '年度']
industry_summary = all_data.groupby(group_cols).agg(
分析指标= (cla, 'sum'),
上市公司数量= ('ts_code', 'nunique') # 统计上市公司数量
).reset_index()
# 重命名“分析指标”为当前选择的cla
industry_summary.rename(columns={'分析指标': cla}, inplace=True)
# 计算增长率(同比)
industry_summary = industry_summary.sort_values([level, '年度'])
# 按行业分组计算增长率
industry_summary[f'{cla}增长率'] = industry_summary.groupby(level)[cla].pct_change() * 100
# 填充NaN(第一年无增长率)
industry_summary[f'{cla}增长率'] = industry_summary[f'{cla}增长率'].fillna(0)

这段代码实现了两个核心功能:一是统计各行业的财务总和与公司数量,二是计算各行业财务指标的同比增长率,为后续分析提供了数据基础。
4. 可视化展示
使用 Matplotlib 绘制行业增长率的可视化图表:
# 创建3*2的子图布局
fig, axes = plt.subplots(3, 2, figsize=(20, 15))
axes = axes.flatten() # 展平轴数组,方便遍历
for idx, year in enumerate(target_years):
# 筛选该年度数据
year_data = growth_data[growth_data['年度'] == year]
# 按增长率降序排序,取前8个行业
top8 = year_data.sort_values(f'{cla}增长率', ascending=False).head(8)
# 绘制柱状图
axes[idx].bar(top8[level], top8[f'{cla}增长率'], color='skyblue')
axes[idx].set_title(f'{year}年{cla}增长率TOP8行业')
axes[idx].set_xlabel(level)
axes[idx].set_ylabel(f'{cla}增长率(%)')
axes[idx].tick_params(axis='x', rotation=45)
# 在柱子上显示数值
for bar in axes[idx].patches:
height = bar.get_height()
axes[idx].text(bar.get_x() + bar.get_width()/2., height + 0.5,
f'{height:.2f}%', ha='center', va='bottom')

通过 3×2 的子图布局,直观展示了 2019-2024 年间各年度增长率最高的 8 个行业,方便进行跨年度对比分析。
5. 交互式界面设计
使用 Streamlit 构建交互式界面,实现用户选择功能:
with st.sidebar:
st.subheader('请选择申万行业级别')
level = st.selectbox(" ", ['新版一级行业', '新版二级行业', '新版三级行业'])
st.subheader('请选择分析类型')
cla = st.selectbox(" ", ['营业收入', '营业利润'])



侧边栏的选择框允许用户灵活切换不同的行业级别(一级、二级、三级)和分析指标(营业收入、营业利润),增强了系统的交互性和实用性。
四、系统特色与创新点
- 多维度分析:支持不同级别行业分类和不同财务指标的灵活切换
- 数据处理严谨:特别处理了股票代码的数据类型统一问题,确保合并准确性
- 可视化直观:通过多子图布局展示多年度数据,便于趋势对比
- 用户体验优化:提供数据表格和图表双重展示方式,满足不同需求
五、使用说明与展望
使用本系统时,只需将相关 Excel 数据文件与代码放在同一目录下,运行程序后即可通过浏览器访问分析界面。用户可以通过侧边栏的选择框切换不同的分析维度,系统会实时更新展示内容。
未来可以从以下方面进行优化:
- 增加更多财务指标的分析功能
- 实现行业间的对比分析功能
- 加入数据预测模型,提供未来趋势预测
- 优化界面设计,提升用户体验
通过这个项目,我们展示了如何利用 Python 的数据分析和可视化库快速构建行业财务分析系统,为行业研究和投资决策提供数据支持。
更多推荐


所有评论(0)