import gradio as gr import pandas as pd import requests import io def fetch_data(url): """從 URL 獲取資料並返回 DataFrame""" try: response = requests.get(url) response.raise_for_status() return pd.read_csv(io.StringIO(response.content.decode('utf-8-sig'))) except Exception as e: return f"錯誤:{str(e)}" def load_board_data(): """載入董事會資料""" url = "https://mopsfin.twse.com.tw/opendata/t187ap46_O_16.csv" df = fetch_data(url) if isinstance(df, pd.DataFrame): return df, "董事會資料載入成功!" return None, df def load_ghg_data(): """載入溫室氣體排放資料""" url = "https://mopsfin.twse.com.tw/opendata/t187ap46_O_6.csv" df = fetch_data(url) if isinstance(df, pd.DataFrame): return df, "溫室氣體排放資料載入成功!" return None, df def load_esg_data(): """載入 ESG 綜合資料""" url = "https://mopsfin.twse.com.tw/opendata/t187ap46_O_1.csv" df = fetch_data(url) if isinstance(df, pd.DataFrame): df = df.dropna() return df, "ESG 綜合資料載入成功!" return None, df def process_and_display(data_choice): """處理並顯示所選資料""" if data_choice == "董事會": df, message = load_board_data() elif data_choice == "溫室氣體": df, message = load_ghg_data() else: df, message = load_esg_data() if df is not None: # 計算基本統計資訊 stats = f""" 資料列數:{len(df)} 資料欄位:{', '.join(df.columns)} """ return df.head().to_html(), stats, message return "", "", message # 創建 Gradio 介面 with gr.Blocks() as app: gr.Markdown("# 上櫃公司 ESG 資訊查詢系統") with gr.Row(): data_choice = gr.Radio( choices=["董事會", "溫室氣體", "ESG綜合"], label="選擇資料類型", value="董事會" ) with gr.Row(): load_btn = gr.Button("載入資料") with gr.Row(): output_message = gr.Textbox(label="狀態訊息") with gr.Row(): stats_display = gr.Textbox(label="資料統計", lines=5) with gr.Row(): data_display = gr.HTML(label="資料預覽") load_btn.click( process_and_display, inputs=[data_choice], outputs=[data_display, stats_display, output_message] ) if __name__ == "__main__": app.launch()