Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
if "公司名稱" not in df.columns:
|
42 |
-
st.error("❌ 缺少 公司名稱 欄位,請確認數據格式!")
|
43 |
-
return
|
44 |
|
45 |
-
|
46 |
-
|
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=
|
66 |
-
|
67 |
elif chart_type == "散點圖":
|
68 |
-
fig = px.scatter(df, x="公司名稱", y=
|
69 |
-
|
70 |
elif chart_type == "長條圖":
|
71 |
-
fig = px.bar(df, x="公司名稱", y=
|
72 |
-
|
73 |
elif chart_type == "餅圖":
|
74 |
-
total_emissions = df.groupby("公司名稱")[
|
75 |
-
total_emissions = total_emissions.melt(id_vars=["公司名稱"], value_vars=
|
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 |
-
|
80 |
-
|
|
|
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("選擇圖表類型", ["折線圖", "散點圖", "長條圖", "餅圖"])
|