dhrumii commited on
Commit
b8597d1
Β·
verified Β·
1 Parent(s): a7db5e1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -48
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 for selected year range
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: Statewise Fuel Allocation
248
  with tab1:
249
  st.subheader("Fuel Distribution Across States")
250
  if not statewise_df.empty:
251
- # Convert from wide to long format
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
- # Allow users to select states (categories)
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
- filtered_df = melted_df[melted_df["State"].isin(selected_states)]
 
 
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 {start_year} to {end_year}",
269
  labels={"Fuel_Amount": "Amount (in units)"}, barmode="group")
270
  st.plotly_chart(fig1, use_container_width=True)
271
 
272
- # Tab 2: Norm Distribution by State
273
  with tab2:
274
  st.subheader("Emission Norm Distribution by State")
275
  if not norms_df.empty:
276
- # Convert from wide to long format
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
- # Allow users to select a state
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
- filtered_norms = melted_norms[melted_norms["State"].isin(selected_states)]
 
 
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 {start_year} to {end_year}",
294
  labels={"Count": "Count of Norms"}, barmode="group")
295
  st.plotly_chart(fig2, use_container_width=True)
296
 
297
- # Tab 3: Fuelwise Emissions
298
  with tab3:
299
  st.subheader("Norm Emissions by Fuel Type")
300
  if not fuelwise_df.empty:
301
- # Check if 'Fuel' exists and others are norms
302
- norm_columns = [col for col in fuelwise_df.columns if col != "Fuel"]
303
- if "Fuel" in fuelwise_df.columns and len(norm_columns) > 0:
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
- # Allow users to select fuel categories
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
- filtered_fuelwise = melted_fuelwise[melted_fuelwise["Fuel"].isin(selected_fuels)]
 
 
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 {start_year} to {end_year}",
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",