Rozeeeee commited on
Commit
3576042
·
verified ·
1 Parent(s): 6f97954

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -39
app.py CHANGED
@@ -34,50 +34,36 @@ def beautify_chart(fig):
34
  def generate_plots(df, df_name, selected_columns, chart_type):
35
  selected_columns = list(selected_columns) # 確保是列表
36
 
37
- if not selected_columns:
38
- st.error("❌ 沒有選擇數據欄位,請至少選擇一個!")
39
- return
40
-
41
- if "公司名稱" not in df.columns:
42
- st.error("❌ 缺少 公司名稱 欄位,請確認數據格式!")
43
- return
44
 
45
- # **確保所有 y 軸數據與 x 軸 (公司名稱) 長度一致**
46
- df = df.dropna(subset=["公司名稱"] + selected_columns) # **移除 NaN 確保長度相同**
47
- df[selected_columns] = df[selected_columns].apply(pd.to_numeric, errors='coerce') # **轉換數據類型**
48
-
49
- # 移除 "出表日期" 和 "原地報告"
50
- df = df.drop(columns=["出表日期", "原地報告"], errors='ignore')
51
-
52
- valid_columns = [col for col in selected_columns if col in df.columns and len(df[col]) == len(df["公司名稱"])]
53
-
54
- if not valid_columns:
55
- st.error(f"❌ 選擇的欄位長度與 公司名稱 不匹配,請檢查數據!\n"
56
- f"📊 公司名稱 長度: {len(df['公司名稱'])}\n"
57
- f"🟢 可用欄位: {valid_columns}")
58
  return
59
 
 
 
 
60
  with st.expander(f"📊 顯示 {df_name} 圖表"):
61
  st.subheader(f"{df_name} - {chart_type} 圖")
 
62
 
63
- # **根據選擇的圖表類型來繪製**
64
  if chart_type == "折線圖":
65
- fig = px.line(df, x="公司名稱", y=valid_columns, title=f"{df_name} - 折線圖", color_discrete_sequence=theme)
66
-
67
  elif chart_type == "散點圖":
68
- fig = px.scatter(df, x="公司名稱", y=valid_columns, title=f"{df_name} - 散點圖", color_discrete_sequence=theme)
69
-
70
  elif chart_type == "長條圖":
71
- fig = px.bar(df, x="公司名稱", y=valid_columns, title=f"{df_name} - 長條圖", color_discrete_sequence=theme)
72
-
73
  elif chart_type == "餅圖":
74
- total_emissions = df.groupby("公司名稱")[valid_columns].sum().reset_index()
75
- total_emissions = total_emissions.melt(id_vars=["公司名稱"], value_vars=valid_columns, var_name="排放類型", value_name="總排放量")
76
  fig = px.pie(total_emissions, values='總排放量', names='公司名稱', title=f"{df_name} - 餅圖", color_discrete_sequence=theme, hole=0.3)
77
  fig.update_traces(textposition='inside', textinfo='percent+label')
78
 
79
- fig = beautify_chart(fig)
80
- st.plotly_chart(fig, use_container_width=True) # ✅ **讓圖表自適應畫面**
 
81
 
82
  # **下載數據**
83
  urls = [
@@ -89,12 +75,6 @@ urls = [
89
  dfs = [download_and_load_csv(url) for url in urls]
90
  combined_df = pd.concat(dfs, ignore_index=True).fillna(0) # 合併數據並填充 NaN 值
91
 
92
- # **再次填充 NaN 值**
93
- combined_df = combined_df.fillna(0)
94
-
95
- # **只顯示前10筆數據**
96
- combined_df = combined_df.head(10)
97
-
98
  # **Streamlit UI**
99
  st.title("📊 台灣企業 ESG 數據分析")
100
 
@@ -102,8 +82,8 @@ st.subheader("📂 數據預覽")
102
  st.dataframe(combined_df)
103
 
104
  # **選擇數據欄位**
105
- emission_columns = ["範疇一排放量(噸CO2e)", "範疇二排放量(噸CO2e)", "範疇三排放量(噸CO2e)"]
106
- selected_columns = st.multiselect("選擇要顯示的排放類別", emission_columns, default=emission_columns[:1])
107
 
108
  # **選擇圖表類型**
109
  chart_type = st.selectbox("選擇圖表類型", ["折線圖", "散點圖", "長條圖", "餅圖"])
 
34
  def generate_plots(df, df_name, selected_columns, chart_type):
35
  selected_columns = list(selected_columns) # 確保是列表
36
 
37
+ # 🛠️ 確保選擇的欄位存在
38
+ existing_columns = set(df.columns)
39
+ valid_selected_columns = [col for col in selected_columns if col in existing_columns]
 
 
 
 
40
 
41
+ if not valid_selected_columns:
42
+ st.error(f" 選擇的欄位無法在數據中找到,請檢查欄位名稱!\n\n📋 可用欄位: {list(existing_columns)}")
 
 
 
 
 
 
 
 
 
 
 
43
  return
44
 
45
+ df = df.dropna(subset=["公司名稱"] + valid_selected_columns) # **移除 NaN 確保長度相同**
46
+ df[valid_selected_columns] = df[valid_selected_columns].apply(pd.to_numeric, errors='coerce')
47
+
48
  with st.expander(f"📊 顯示 {df_name} 圖表"):
49
  st.subheader(f"{df_name} - {chart_type} 圖")
50
+ fig = None # 預設圖表為 None
51
 
 
52
  if chart_type == "折線圖":
53
+ fig = px.line(df, x="公司名稱", y=valid_selected_columns, title=f"{df_name} - 折線圖", color_discrete_sequence=theme)
 
54
  elif chart_type == "散點圖":
55
+ fig = px.scatter(df, x="公司名稱", y=valid_selected_columns, title=f"{df_name} - 散點圖", color_discrete_sequence=theme)
 
56
  elif chart_type == "長條圖":
57
+ fig = px.bar(df, x="公司名稱", y=valid_selected_columns, title=f"{df_name} - 長條圖", color_discrete_sequence=theme)
 
58
  elif chart_type == "餅圖":
59
+ total_emissions = df.groupby("公司名稱")[valid_selected_columns].sum().reset_index()
60
+ total_emissions = total_emissions.melt(id_vars=["公司名稱"], value_vars=valid_selected_columns, var_name="排放類型", value_name="總排放量")
61
  fig = px.pie(total_emissions, values='總排放量', names='公司名稱', title=f"{df_name} - 餅圖", color_discrete_sequence=theme, hole=0.3)
62
  fig.update_traces(textposition='inside', textinfo='percent+label')
63
 
64
+ if fig:
65
+ fig = beautify_chart(fig)
66
+ st.plotly_chart(fig, use_container_width=True)
67
 
68
  # **下載數據**
69
  urls = [
 
75
  dfs = [download_and_load_csv(url) for url in urls]
76
  combined_df = pd.concat(dfs, ignore_index=True).fillna(0) # 合併數據並填充 NaN 值
77
 
 
 
 
 
 
 
78
  # **Streamlit UI**
79
  st.title("📊 台灣企業 ESG 數據分析")
80
 
 
82
  st.dataframe(combined_df)
83
 
84
  # **選擇數據欄位**
85
+ emission_columns = [col for col in ["範疇一排放量(噸CO2e)", "範疇二排放量(噸CO2e)", "範疇三排放量(噸CO2e)"] if col in combined_df.columns]
86
+ selected_columns = st.multiselect("選擇要顯示的排放類別", emission_columns, default=emission_columns[:1] if emission_columns else [])
87
 
88
  # **選擇圖表類型**
89
  chart_type = st.selectbox("選擇圖表類型", ["折線圖", "散點圖", "長條圖", "餅圖"])