Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import folium | |
| from folium.plugins import MarkerCluster, HeatMap | |
| from streamlit_plotly_events import plotly_events | |
| import plotly.express as px | |
| # Function to create the map | |
| def create_map(df, selected_year, selected_severity=None): | |
| # Filter data by selected year | |
| filtered_df = df[df['Year'] == selected_year] | |
| # Filter further by selected severity if provided | |
| if selected_severity: | |
| filtered_df = filtered_df[filtered_df['Injuryseverity'] == selected_severity] | |
| # Remove rows with missing latitude or longitude | |
| filtered_df = filtered_df.dropna(subset=['Latitude', 'Longitude']) | |
| # Create the map | |
| m = folium.Map( | |
| location=[33.4255, -111.9400], # Default location (can be customized) | |
| zoom_start=12, | |
| control_scale=True, | |
| tiles='CartoDB positron' | |
| ) | |
| # Add marker cluster | |
| marker_cluster = MarkerCluster(name="Accident Locations").add_to(m) | |
| # Add accident markers | |
| for _, row in filtered_df.iterrows(): | |
| folium.Marker( | |
| location=[row['Latitude'], row['Longitude']], | |
| popup=f"Accident at {row['Longitude']}, {row['Latitude']}<br>Date: {row['DateTime']}<br>Severity: {row['Injuryseverity']}", | |
| icon=folium.Icon(color='red') | |
| ).add_to(marker_cluster) | |
| # Add heatmap | |
| heat_data = filtered_df[['Latitude', 'Longitude']].values.tolist() | |
| HeatMap(heat_data, radius=15, max_zoom=13, min_opacity=0.3, name="Heat Map").add_to(m) | |
| folium.LayerControl().add_to(m) | |
| return m | |
| # Function to create a bar chart based on accident severity | |
| def create_bar_chart(df, selected_year): | |
| filtered_df = df[df['Year'] == selected_year] | |
| severity_count = filtered_df['Injuryseverity'].value_counts().reset_index() | |
| severity_count.columns = ['Injuryseverity', 'Count'] | |
| fig = px.bar( | |
| severity_count, | |
| x='Injuryseverity', | |
| y='Count', | |
| title="Accidents by Severity", | |
| labels={'Injuryseverity': 'Severity', 'Count': 'Number of Accidents'} | |
| ) | |
| fig.update_traces(marker_color='blue') | |
| fig.update_layout(clickmode='event+select') # Enable interactivity | |
| return fig | |
| # Streamlit app | |
| def app(): | |
| # Load your dataset here | |
| df = pd.read_csv("Crash_Data_Report.csv") # Replace with your actual dataset | |
| # Sidebar for selection | |
| st.sidebar.header("Select Filters") | |
| selected_year = st.sidebar.selectbox("Select Year", df['Year'].unique()) | |
| # Initialize session state for selected severity | |
| if "selected_severity" not in st.session_state: | |
| st.session_state["selected_severity"] = None | |
| # Bar Chart visualization | |
| st.subheader("Accidents by Severity") | |
| bar_chart = create_bar_chart(df, selected_year) | |
| # Capture user interaction | |
| selected_points = plotly_events(bar_chart, click_event=True, hover_event=False) | |
| if selected_points: | |
| # Get the selected severity from the clicked bar | |
| selected_severity = selected_points[0]['x'] | |
| st.session_state["selected_severity"] = selected_severity | |
| else: | |
| selected_severity = st.session_state["selected_severity"] | |
| # Map visualization | |
| st.subheader("Accidents Map") | |
| map_obj = create_map(df, selected_year, selected_severity) | |
| st.components.v1.html(map_obj._repr_html_(), height=600) | |
| # Display current filter | |
| st.sidebar.write(f"Selected Severity: {selected_severity if selected_severity else 'All'}") | |
| # Run the Streamlit app | |
| if __name__ == "__main__": | |
| app() | |