本文分享基于Streamlit的申万行业数据分析平台,从设计背景、代码实现、界面展示三方面展开,平台支持行业指数走势、个股数据展示及上市公司综合评价等等。

一、设计背景

(一)项目定位与核心目标

申万行业分类是国内主流标准,本平台打造轻量化可视化工具,自动化完成“选行业-看数据-做评价”流程,降低非技术门槛,提升研究效率。

(二)核心需求拆解

  • 自由筛选申万一级行业,精准匹配数据;

  • 图表化展示行业指数及个股走势;

  • 结构化呈现核心数据(指数交易、公司信息等);

  • 基于PCA实现上市公司综合评分排名。

(三)技术选型依据

围绕“轻量化、开发快、可视化优”诉求,技术栈选择如下:

  • 前端:Streamlit,Python直出界面,无需前端知识,自带可视化组件;

  • 数据处理:Pandas,高效完成数据读筛、合并等操作;

  • 综合评价:Scikit-learn,调用标准化及PCA模块,简化算法实现;

  • 可视化:Matplotlib,自定义图表,兼容Streamlit渲染。

二、代码实现

平台采用模块化设计,核心为三个关键函数,分工明确、协同实现全功能。

(一)数据处理与绘图模块(st_data函数)

核心功能:输入行业名称与分类表,完成数据读筛、绘图、关联,输出图表与结构化数据。核心逻辑:

1. 数据读取层

读取行业指数、股票交易、财务、上市公司信息等基础数据。

# 读取相关数据
import pandas as pd
data=pd.read_csv('index_trdata.csv')  # 行业指数交易数据
trdata=pd.read_csv('stk_trdata.csv')  # 股票交易数据
findata=pd.read_csv('fin_data.csv')   # 财务数据
co_data=pd.read_excel('上市公司基本信息.xlsx')  # 上市公司基本信息
2. 行业数据筛选与清洗

筛选目标行业指数数据(需>600条),按交易日期排序并标准化列名。

data_i=data.iloc[data['name'].values==nm,:]  # 筛选目标行业指数数据
data_i=data_i.sort_values(['trade_date'])    # 按交易日期排序
data_i.columns=['指数代码','行业名称','交易日期','开盘指数','收盘指数','成交量','市盈率','市净率']  # 标准化列名
if len(data_i)>600:  # 仅处理数据量充足的行业
3. 可视化图表绘制

绘制两类图表并返回句柄:

  • 行业指数走势图(f1):Matplotlib绘折线图,优化坐标轴标签;

  • 个股价格走势图(f2):筛选>600条记录个股,前6只绘3行2列子图。

  • # 行业指数走势图绘制
    plt.rcParams['font.sans-serif'] = 'SimHei'  # 解决中文乱码
    f1,ax=plt.subplots()
    plt.title('申万'+nm+'行业指数走势图')
    x1=data_i['交易日期'].values
    y1=data_i['收盘指数'].values
    plt.plot(range(len(x1)),y1)
    plt.xticks([0,100,200,300,400,500,600],x1[[0,100,200,300,400,500,600]],rotation=45)

4. 数据关联与整合

基于股票代码关联目标行业上市公司信息、交易及财务数据。

# 关联上市公司基本信息
chy_code=info.iloc[(info['新版一级行业'].values==nm)&(info['交易所'].values=='A股'),[2,3]]
chy_code.columns=['ts_code','nm']
co_data=pd.merge(co_data,chy_code,how='inner',on='ts_code')

# 关联股票交易数据
trdata_hy=pd.merge(trdata,chy_code,how='inner',on='ts_code')
trdata_hy=trdata_hy.sort_values(['ts_code','trade_date'])

(二)综合评价模块(Fr函数)

基于PCA实现上市公司财务指标综合评价,输入财务数据与年度,输出排名数据。核心逻辑:筛选年度数据→匹配有效指标→缺失值填充+标准化→PCA分析→计算得分与排名。

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 标准化数据
scaler = StandardScaler()
scaled_data = scaler.fit_transform(pca_data)

# 执行PCA
n_components = min(2, len(pca_columns))
pca = PCA(n_components=n_components)
pca_scores = pca.fit_transform(scaled_data)

# 计算综合得分与排名
yearly_data['综合得分'] = pca_scores[:, 0]
yearly_data['排名'] = yearly_data['综合得分'].rank(ascending=False, method='dense')

(三)界面布局与交互模块(st_fig函数)

实现Streamlit可视化交互界面,核心逻辑:页面配置→侧边栏选行业→调用数据模块→分栏展结果。

1. 界面基础配置

设置页面标题与宽布局,读取申万行业分类表并提取一级行业列表。

import streamlit as st
st.set_page_config(
        page_title="数据解读案例",  # 页面标题
        layout='wide',  # 宽布局
    )
info=pd.read_excel('最新个股申万行业分类(完整版-截至7月末).xlsx')
nm_L=list(set(info['新版一级行业'].values))  # 提取一级行业列表
2. 侧边栏行业选择

设置行业下拉框,默认加载首个行业数据。

with st.sidebar:
    st.subheader('请选择指数&行业')
    nm = st.selectbox(" ", nm_L)  # 行业选择下拉框

分栏展示图表(行业指数+个股走势),呈现四类结构化数据,提供年度与排名数量选择,展示综合排名。

三、界面展示

界面分为侧边栏选择区与主内容区,核心展示如下:

(一)整体界面布局

宽布局,侧边栏紧凑,主内容区按“图表-表格-评价”排序,贴合使用习惯。

【图片插入位置1:平台整体布局截图】 图注:申万行业数据分析平台整体界面,展示侧边栏行业选择区与主内容区的布局关系

(二)行业选择与图表展示界面

侧边栏支持全一级行业切换,主内容区两栏展示行业指数与3行2列个股走势图。

(三)结构化数据展示界面

依次展示四类核心数据表格,股票交易数据限前2000条,列名标准化。

(四)综合评价交互界面

提供年度与前N名选择框,实时展示上市公司综合排名核心信息。

四、总结

核心优势:轻量化易上手,无需前端经验;数据处理全流程,交互贴合需求。后续可优化数据导出、图表交互及异常处理。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐