import streamlit as st import pandas as pd import plotly.express as px from datetime import datetime excel_file_name = 'updated_dataset.csv' # Streamlit title st.title("Bangladesh Accident Monitoring System (BAMS)") # Display a note to the user st.write("Please Note, First Date must be smaller than Last date. Example: First Date = 25-08-2024 and Last Date = 28-08-2024") # Get today's date today = datetime.strptime(datetime.today().strftime('%d-%m-%Y'), '%d-%m-%Y') # Input fields for date range start = st.date_input("Enter first date", max_value=today, format="DD-MM-YYYY") start_string = start.strftime('%d-%m-%Y') end = st.date_input("Enter last date", max_value=today, format="DD-MM-YYYY") end_string = end.strftime('%d-%m-%Y') # Button to generate dataset based on date range if st.button("Generate Dataset"): # Read the selected excel file df3 = pd.read_csv(excel_file_name) # Convert 'Publish Date' column to datetime with 'day-month-year' format df3['Publish Date'] = pd.to_datetime(df3['Publish Date'], format='%d-%m-%Y') # Fixing date formats for i in range(len(df3)): if '/' in df3['Accident Date'][i]: day=int(df3['Accident Date'][i].split('/')[0]) mon=int(df3['Accident Date'][i].split('/')[1]) yr=int(df3['Accident Date'][i].split('/')[2]) df3['Publish Date'][i]=f"{day}-{mon}-{yr}" print(df3.tail()) # Convert user input dates to datetime start_date = pd.to_datetime(start_string, format='%d-%m-%Y') end_date = pd.to_datetime(end_string, format='%d-%m-%Y') # Filter rows based on the specified date range filtered_entries = df3[(df3['Publish Date'] >= start_date) & (df3['Publish Date'] <= end_date)] filtered_entries.reset_index(inplace=True, drop=True) # Display the filtered data st.dataframe(filtered_entries) # Create a bar chart for accident count over days if not filtered_entries.empty: # Create a bar chart for accident count over days if not filtered_entries.empty: import plotly.express as px # Convert 'Accident Date' to datetime format filtered_entries['Accident Date'] = pd.to_datetime(filtered_entries['Accident Date'], format='%d-%m-%Y') # Count accidents per date and sort by date accident_counts = filtered_entries['Accident Date'].value_counts().sort_index() # Reset the index and rename columns accident_counts = accident_counts.reset_index() accident_counts.columns = ['Accident Date', 'Accident Count'] # Convert 'Accident Date' back to string format accident_counts['Accident Date'] = accident_counts['Accident Date'].dt.strftime('%d-%m-%Y') filtered_entries['Accident Date'] = accident_counts['Accident Date'] fig1 = px.bar(accident_counts, x='Accident Date', y='Accident Count', title="Accident Count Over Days", labels={'Accident Date': 'Date', 'Accident Count': 'Number of Accidents'}, color='Accident Count', color_continuous_scale='Viridis') st.plotly_chart(fig1) # Convert 'Accident Date' to datetime format filtered_entries['Accident Date'] = pd.to_datetime(filtered_entries['Accident Date'], format='%d-%m-%Y') # Group by 'Accident Date' and sum the 'Killed' column killed_per_day = filtered_entries.groupby('Accident Date')['Killed'].sum().reset_index() killed_per_day.columns = ['Accident Date', 'Total Killed'] # Sort the dates in ascending order killed_per_day = killed_per_day.sort_values(by='Accident Date') # Convert 'Accident Date' back to string format killed_per_day['Accident Date'] = killed_per_day['Accident Date'].dt.strftime('%d-%m-%Y') fig2 = px.bar(killed_per_day, x='Accident Date', y='Total Killed', title="Number of People Killed Each Day", labels={'Accident Date': 'Date', 'Total Killed': 'Number of People Killed'}, color='Total Killed', color_continuous_scale='Reds') st.plotly_chart(fig2) # Bar chart showing the number of accidents in each district district_accidents = filtered_entries['District'].value_counts().reset_index() district_accidents.columns = ['District', 'Number of Accidents'] fig3 = px.bar(district_accidents, x='District', y='Number of Accidents', title="Accidents in Each District", labels={'Number of Accidents': 'Number of Accidents', 'District': 'District'}, color='Number of Accidents', color_continuous_scale='Cividis') st.plotly_chart(fig3) ### Pie Chart Code ### yes_count=0 no_count=0 not_available_count=0 for i in range(len(filtered_entries)): if ('Yes' in filtered_entries['Pedestrian_Involved'][i] or 'yes' in filtered_entries['Pedestrian_Involved'][i]): yes_count+=1 if ('No' in filtered_entries['Pedestrian_Involved'][i] or 'no' in filtered_entries['Pedestrian_Involved'][i]): no_count+=1 if ('Not Available' in filtered_entries['Pedestrian_Involved'][i]): not_available_count+=1 Pedestrian_Involved_list = ['Yes', 'No', 'Not Available'] Count_list = [yes_count, no_count, not_available_count] # dictionary of lists dict = {'Pedestrian Involved': Pedestrian_Involved_list, 'Count':Count_list} pedestrian_involvement = pd.DataFrame(dict) # Pie chart showing the percentage of accidents involving pedestrians vs. those that don't # pedestrian_involvement = filtered_entries['Pedestrian_Involved'].value_counts().reset_index() # pedestrian_involvement.columns = ['Pedestrian Involved', 'Count'] fig4 = px.pie(pedestrian_involvement, names='Pedestrian Involved', values='Count', title="Accidents Involving Pedestrians", labels={'Pedestrian Involved': 'Pedestrian Involved'}, color_discrete_sequence=['Green', 'Red', 'Blue']) st.plotly_chart(fig4) else: st.write("No data available for the selected date range.") # Display selected start and end dates st.write("Start date is:", start) st.write("End date is:", end)