Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -190,7 +190,6 @@ def ev_insights():
|
|
| 190 |
|
| 191 |
|
| 192 |
def fuel_norm_distribution_dashboard(root_dir, state_mapping_file, start_year=2009, end_year=2025):
|
| 193 |
-
|
| 194 |
# Folder paths
|
| 195 |
folders = {
|
| 196 |
"statewise": os.path.join(root_dir, "Fuel_vs_state"),
|
|
@@ -210,11 +209,11 @@ def fuel_norm_distribution_dashboard(root_dir, state_mapping_file, start_year=20
|
|
| 210 |
file_path = os.path.join(folder_path, year_file)
|
| 211 |
if os.path.exists(file_path):
|
| 212 |
df = pd.read_csv(file_path)
|
| 213 |
-
# Remove 'Total' row/column if present
|
| 214 |
if "Total" in df.columns:
|
| 215 |
df = df.drop(columns=["Total"])
|
| 216 |
if df.iloc[:, 0].str.contains("Total", na=False).any():
|
| 217 |
df = df[~df.iloc[:, 0].str.contains("Total", na=False)]
|
|
|
|
| 218 |
return df
|
| 219 |
else:
|
| 220 |
st.warning(f"File not found: {file_path}")
|
|
@@ -229,107 +228,87 @@ def fuel_norm_distribution_dashboard(root_dir, state_mapping_file, start_year=20
|
|
| 229 |
combined_df = pd.concat([combined_df, df], ignore_index=True)
|
| 230 |
return combined_df
|
| 231 |
|
| 232 |
-
# Load data
|
| 233 |
statewise_df = load_data_for_year_range(folders["statewise"], start_year, end_year)
|
| 234 |
norms_df = load_data_for_year_range(folders["norms"], start_year, end_year)
|
| 235 |
fuelwise_df = load_data_for_year_range(folders["fuelwise"], start_year, end_year)
|
| 236 |
|
| 237 |
-
# Set up Streamlit app title
|
| 238 |
st.title("π’ Fuel Allocation & Emission Norms Dashboard (2009β2025)")
|
| 239 |
|
| 240 |
-
# Tabs for different visualizations
|
| 241 |
tab1, tab2, tab3 = st.tabs([
|
| 242 |
"π Fuel Distribution over States",
|
| 243 |
"π Norm Distribution by State",
|
| 244 |
"π₯ Emission by Fuel Type"
|
| 245 |
])
|
| 246 |
|
| 247 |
-
# Tab 1
|
| 248 |
with tab1:
|
| 249 |
st.subheader("Fuel Distribution Across States")
|
| 250 |
if not statewise_df.empty:
|
| 251 |
-
|
| 252 |
-
melted_df = pd.melt(statewise_df, id_vars=["Fuel"], var_name="State", value_name="Fuel_Amount")
|
| 253 |
-
|
| 254 |
-
# Replace state codes with full state names (case-insensitive matching)
|
| 255 |
melted_df["State"] = melted_df["State"].apply(lambda x: state_dict.get(x.upper(), x))
|
| 256 |
|
| 257 |
-
|
| 258 |
-
selected_states = st.multiselect("Select States", ["Select All"] + list(melted_df["State"].unique()), default=[], key="state_selection")
|
| 259 |
-
|
| 260 |
-
# If "Select All" is chosen, select all states
|
| 261 |
if "Select All" in selected_states:
|
| 262 |
selected_states = list(melted_df["State"].unique())
|
| 263 |
|
| 264 |
-
|
|
|
|
|
|
|
| 265 |
|
| 266 |
-
# Create and display the plot
|
| 267 |
fig1 = px.bar(filtered_df, x="State", y="Fuel_Amount", color="Fuel",
|
| 268 |
-
title=f"Fuel Distribution from {
|
| 269 |
labels={"Fuel_Amount": "Amount (in units)"}, barmode="group")
|
| 270 |
st.plotly_chart(fig1, use_container_width=True)
|
| 271 |
|
| 272 |
-
# Tab 2
|
| 273 |
with tab2:
|
| 274 |
st.subheader("Emission Norm Distribution by State")
|
| 275 |
if not norms_df.empty:
|
| 276 |
-
|
| 277 |
-
melted_norms = pd.melt(norms_df, id_vars=["Norms"], var_name="State", value_name="Count")
|
| 278 |
-
|
| 279 |
-
# Replace state codes with full state names (case-insensitive matching)
|
| 280 |
melted_norms["State"] = melted_norms["State"].apply(lambda x: state_dict.get(x.upper(), x))
|
| 281 |
|
| 282 |
-
|
| 283 |
-
selected_states = st.multiselect("Select States", ["Select All"] + list(melted_norms["State"].unique()), default=[], key="norm_state_selection")
|
| 284 |
-
|
| 285 |
-
# If "Select All" is chosen, select all states
|
| 286 |
if "Select All" in selected_states:
|
| 287 |
selected_states = list(melted_norms["State"].unique())
|
| 288 |
|
| 289 |
-
|
|
|
|
|
|
|
| 290 |
|
| 291 |
-
# Create and display the plot
|
| 292 |
fig2 = px.bar(filtered_norms, x="State", y="Count", color="Norms",
|
| 293 |
-
title=f"Emission Norms Distribution from {
|
| 294 |
labels={"Count": "Count of Norms"}, barmode="group")
|
| 295 |
st.plotly_chart(fig2, use_container_width=True)
|
| 296 |
|
| 297 |
-
# Tab 3
|
| 298 |
with tab3:
|
| 299 |
st.subheader("Norm Emissions by Fuel Type")
|
| 300 |
if not fuelwise_df.empty:
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
# Melt the DataFrame to long format
|
| 305 |
-
melted_fuelwise = pd.melt(fuelwise_df, id_vars=["Fuel"],
|
| 306 |
var_name="Norm_Type", value_name="Emission")
|
| 307 |
-
|
| 308 |
-
# Drop missing or non-numeric values if necessary
|
| 309 |
melted_fuelwise = melted_fuelwise.dropna()
|
| 310 |
melted_fuelwise["Emission"] = pd.to_numeric(melted_fuelwise["Emission"], errors="coerce")
|
| 311 |
melted_fuelwise = melted_fuelwise.dropna(subset=["Emission"])
|
| 312 |
|
| 313 |
-
|
| 314 |
-
selected_fuels = st.multiselect("Select Fuel Types", ["Select All"] + list(melted_fuelwise["Fuel"].unique()), default=[], key="fuel_selection")
|
| 315 |
-
|
| 316 |
-
# If "Select All" is chosen, select all fuels
|
| 317 |
if "Select All" in selected_fuels:
|
| 318 |
selected_fuels = list(melted_fuelwise["Fuel"].unique())
|
| 319 |
|
| 320 |
-
|
|
|
|
|
|
|
| 321 |
|
| 322 |
-
# Create and display the plot
|
| 323 |
fig3 = px.bar(filtered_fuelwise, x="Fuel", y="Emission", color="Norm_Type",
|
| 324 |
-
title=f"Emission per Fuel Type from {
|
| 325 |
labels={"Emission": "Emission Amount"}, barmode="stack")
|
| 326 |
st.plotly_chart(fig3, use_container_width=True)
|
| 327 |
|
| 328 |
-
# Additional visualization for Top Fuels emitting most pollution
|
| 329 |
-
top_fuels = melted_fuelwise.groupby("Fuel")["Emission"].sum().reset_index()
|
| 330 |
-
top_fuels_sorted = top_fuels.sort_values(by="Emission", ascending=False).head(10)
|
| 331 |
-
|
| 332 |
st.subheader("Top Fuels Emitting Most Pollution")
|
|
|
|
|
|
|
| 333 |
st.write(top_fuels_sorted)
|
| 334 |
|
| 335 |
fig4 = px.bar(top_fuels_sorted, x="Fuel", y="Emission", title="Top Fuels by Emission",
|
|
|
|
| 190 |
|
| 191 |
|
| 192 |
def fuel_norm_distribution_dashboard(root_dir, state_mapping_file, start_year=2009, end_year=2025):
|
|
|
|
| 193 |
# Folder paths
|
| 194 |
folders = {
|
| 195 |
"statewise": os.path.join(root_dir, "Fuel_vs_state"),
|
|
|
|
| 209 |
file_path = os.path.join(folder_path, year_file)
|
| 210 |
if os.path.exists(file_path):
|
| 211 |
df = pd.read_csv(file_path)
|
|
|
|
| 212 |
if "Total" in df.columns:
|
| 213 |
df = df.drop(columns=["Total"])
|
| 214 |
if df.iloc[:, 0].str.contains("Total", na=False).any():
|
| 215 |
df = df[~df.iloc[:, 0].str.contains("Total", na=False)]
|
| 216 |
+
df["Year"] = int(year_file.split(".")[0])
|
| 217 |
return df
|
| 218 |
else:
|
| 219 |
st.warning(f"File not found: {file_path}")
|
|
|
|
| 228 |
combined_df = pd.concat([combined_df, df], ignore_index=True)
|
| 229 |
return combined_df
|
| 230 |
|
| 231 |
+
# Load all data
|
| 232 |
statewise_df = load_data_for_year_range(folders["statewise"], start_year, end_year)
|
| 233 |
norms_df = load_data_for_year_range(folders["norms"], start_year, end_year)
|
| 234 |
fuelwise_df = load_data_for_year_range(folders["fuelwise"], start_year, end_year)
|
| 235 |
|
|
|
|
| 236 |
st.title("π’ Fuel Allocation & Emission Norms Dashboard (2009β2025)")
|
| 237 |
|
|
|
|
| 238 |
tab1, tab2, tab3 = st.tabs([
|
| 239 |
"π Fuel Distribution over States",
|
| 240 |
"π Norm Distribution by State",
|
| 241 |
"π₯ Emission by Fuel Type"
|
| 242 |
])
|
| 243 |
|
| 244 |
+
# Tab 1
|
| 245 |
with tab1:
|
| 246 |
st.subheader("Fuel Distribution Across States")
|
| 247 |
if not statewise_df.empty:
|
| 248 |
+
melted_df = pd.melt(statewise_df, id_vars=["Fuel", "Year"], var_name="State", value_name="Fuel_Amount")
|
|
|
|
|
|
|
|
|
|
| 249 |
melted_df["State"] = melted_df["State"].apply(lambda x: state_dict.get(x.upper(), x))
|
| 250 |
|
| 251 |
+
selected_states = st.multiselect("Select States", ["Select All"] + sorted(melted_df["State"].unique()), default=[], key="state_selection")
|
|
|
|
|
|
|
|
|
|
| 252 |
if "Select All" in selected_states:
|
| 253 |
selected_states = list(melted_df["State"].unique())
|
| 254 |
|
| 255 |
+
year_range = st.slider("Select Year Range", min_value=start_year, max_value=end_year, value=(start_year, end_year), key="fuel_state_year")
|
| 256 |
+
filtered_df = melted_df[(melted_df["State"].isin(selected_states)) &
|
| 257 |
+
(melted_df["Year"].between(year_range[0], year_range[1]))]
|
| 258 |
|
|
|
|
| 259 |
fig1 = px.bar(filtered_df, x="State", y="Fuel_Amount", color="Fuel",
|
| 260 |
+
title=f"Fuel Distribution from {year_range[0]} to {year_range[1]}",
|
| 261 |
labels={"Fuel_Amount": "Amount (in units)"}, barmode="group")
|
| 262 |
st.plotly_chart(fig1, use_container_width=True)
|
| 263 |
|
| 264 |
+
# Tab 2
|
| 265 |
with tab2:
|
| 266 |
st.subheader("Emission Norm Distribution by State")
|
| 267 |
if not norms_df.empty:
|
| 268 |
+
melted_norms = pd.melt(norms_df, id_vars=["Norms", "Year"], var_name="State", value_name="Count")
|
|
|
|
|
|
|
|
|
|
| 269 |
melted_norms["State"] = melted_norms["State"].apply(lambda x: state_dict.get(x.upper(), x))
|
| 270 |
|
| 271 |
+
selected_states = st.multiselect("Select States", ["Select All"] + sorted(melted_norms["State"].unique()), default=[], key="norm_state_selection")
|
|
|
|
|
|
|
|
|
|
| 272 |
if "Select All" in selected_states:
|
| 273 |
selected_states = list(melted_norms["State"].unique())
|
| 274 |
|
| 275 |
+
year_range = st.slider("Select Year Range", min_value=start_year, max_value=end_year, value=(start_year, end_year), key="norm_state_year")
|
| 276 |
+
filtered_norms = melted_norms[(melted_norms["State"].isin(selected_states)) &
|
| 277 |
+
(melted_norms["Year"].between(year_range[0], year_range[1]))]
|
| 278 |
|
|
|
|
| 279 |
fig2 = px.bar(filtered_norms, x="State", y="Count", color="Norms",
|
| 280 |
+
title=f"Emission Norms Distribution from {year_range[0]} to {year_range[1]}",
|
| 281 |
labels={"Count": "Count of Norms"}, barmode="group")
|
| 282 |
st.plotly_chart(fig2, use_container_width=True)
|
| 283 |
|
| 284 |
+
# Tab 3
|
| 285 |
with tab3:
|
| 286 |
st.subheader("Norm Emissions by Fuel Type")
|
| 287 |
if not fuelwise_df.empty:
|
| 288 |
+
norm_columns = [col for col in fuelwise_df.columns if col not in ["Fuel", "Year"]]
|
| 289 |
+
if "Fuel" in fuelwise_df.columns and norm_columns:
|
| 290 |
+
melted_fuelwise = pd.melt(fuelwise_df, id_vars=["Fuel", "Year"],
|
|
|
|
|
|
|
| 291 |
var_name="Norm_Type", value_name="Emission")
|
|
|
|
|
|
|
| 292 |
melted_fuelwise = melted_fuelwise.dropna()
|
| 293 |
melted_fuelwise["Emission"] = pd.to_numeric(melted_fuelwise["Emission"], errors="coerce")
|
| 294 |
melted_fuelwise = melted_fuelwise.dropna(subset=["Emission"])
|
| 295 |
|
| 296 |
+
selected_fuels = st.multiselect("Select Fuel Types", ["Select All"] + sorted(melted_fuelwise["Fuel"].unique()), default=[], key="fuel_selection")
|
|
|
|
|
|
|
|
|
|
| 297 |
if "Select All" in selected_fuels:
|
| 298 |
selected_fuels = list(melted_fuelwise["Fuel"].unique())
|
| 299 |
|
| 300 |
+
year_range = st.slider("Select Year Range", min_value=start_year, max_value=end_year, value=(start_year, end_year), key="fuel_year")
|
| 301 |
+
filtered_fuelwise = melted_fuelwise[(melted_fuelwise["Fuel"].isin(selected_fuels)) &
|
| 302 |
+
(melted_fuelwise["Year"].between(year_range[0], year_range[1]))]
|
| 303 |
|
|
|
|
| 304 |
fig3 = px.bar(filtered_fuelwise, x="Fuel", y="Emission", color="Norm_Type",
|
| 305 |
+
title=f"Emission per Fuel Type from {year_range[0]} to {year_range[1]}",
|
| 306 |
labels={"Emission": "Emission Amount"}, barmode="stack")
|
| 307 |
st.plotly_chart(fig3, use_container_width=True)
|
| 308 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
st.subheader("Top Fuels Emitting Most Pollution")
|
| 310 |
+
top_fuels = filtered_fuelwise.groupby("Fuel")["Emission"].sum().reset_index()
|
| 311 |
+
top_fuels_sorted = top_fuels.sort_values(by="Emission", ascending=False).head(10)
|
| 312 |
st.write(top_fuels_sorted)
|
| 313 |
|
| 314 |
fig4 = px.bar(top_fuels_sorted, x="Fuel", y="Emission", title="Top Fuels by Emission",
|