基于Streamlit的申万行业数据分析平台设计-实训二
本文分享基于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名选择框,实时展示上市公司综合排名核心信息。

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


所有评论(0)