import streamlit as st import pandas as pd import requests import matplotlib.font_manager as fm import matplotlib as mpl import plotly.express as px # 设置页面标题 st.title("温室气体排放、能源管理与董事会资料分析") # 下载并设置自定义字体 @st.cache_resource def load_font(): font_url = "https://drive.google.com/uc?id=1eGAsTN1HBpJAkeVM57_C7ccp7hbgSz3_&export=download" font_response = requests.get(font_url) with open("TaipeiSansTCBeta-Regular.ttf", "wb") as font_file: font_file.write(font_response.content) fm.fontManager.addfont("TaipeiSansTCBeta-Regular.ttf") mpl.rc('font', family='Taipei Sans TC Beta') load_font() # 抓取并处理数据 @st.cache_data def fetch_and_clean_data(selected_dataset): if selected_dataset == '温室气体排放资料集': url = "https://mopsfin.twse.com.tw/opendata/t187ap46_L_1.csv" elif selected_dataset == '能源管理资料集': url = "https://mopsfin.twse.com.tw/opendata/t187ap46_O_2.csv" elif selected_dataset == '董事会资料集': url = "https://mopsfin.twse.com.tw/opendata/t187ap46_L_6.csv" else: return pd.DataFrame() # 返回空的 DataFrame 如果没有选择数据集 response = requests.get(url) with open("data.csv", "wb") as file: file.write(response.content) df = pd.read_csv("data.csv").fillna(0) return df # 创建下拉式菜单让用户选择数据集 selected_dataset = st.selectbox( "选择要分析的资料集", ['温室气体排放资料集', '能源管理资料集', '董事会资料集'] ) # 当选择数据集后,自动显示对应的数据集内容 if selected_dataset: df = fetch_and_clean_data(selected_dataset) if not df.empty: # 显示数据集内容 st.write("### 资料集内容") st.dataframe(df) # 根据所选数据集设置可选字段 if selected_dataset == '温室气体排放资料集': column_options = [ '範疇一排放量(噸CO2e)', '範疇二排放量(噸CO2e)', '範疇三排放量(噸CO2e)', '溫室氣體排放密集度(公噸CO2e/百萬元營業額)' ] elif selected_dataset == '能源管理资料集': column_options = [ '使用率(再生能源/總能源)', '取得驗證' ] elif selected_dataset == '董事会资料集': column_options = [ '董事席次(含獨立董事)(席)', '獨立董事席次(席)', '女性董事席次及比率-席', '女性董事席次及比率-比率', '董事出席董事会出席率', '董事进修时数符合进修要点比率' ] # 只显示在数据集内存在的字段 available_columns = [col for col in column_options if col in df.columns] selected_column = st.selectbox("选择要绘制的字段", available_columns) # 创建生成图表按钮 if st.button("生成图表"): # 将比例转换为浮点数 def convert_to_float(value): try: return float(str(value).replace('%', '')) / 100 if '%' in str(value) else float(value) except ValueError: return None df[selected_column] = df[selected_column].apply(convert_to_float) # 过滤掉零值或空值的数据 df_filtered = df[df[selected_column].fillna(0) > 0] if not df_filtered.empty: # 显示数据表 st.write("### 资料集内容(过滤后的数据)") st.dataframe(df_filtered) # 绘制圆饼图 st.write(f"### 圆饼图:各公司基于{selected_column}的分布") fig_pie = px.pie(df_filtered, names='公司名称', values=selected_column) st.plotly_chart(fig_pie) # 绘制长条图 st.write(f"### 长条图:各公司基于{selected_column}的分布") fig_bar = px.bar(df_filtered, x='公司名称', y=selected_column) st.plotly_chart(fig_bar) else: st.write(f"选择的字段 '{selected_column}' 无有效数据来生成图表。") else: st.write("选择的数据集中无有效数据或数据集未正确抓取。")