import streamlit as st import pandas as pd import numpy as np import pydeck as pdk import plotly.express as px st.set_page_config(layout="wide") @st.cache(persist = True) def load_data(n_rows): data = pd.read_csv("Motor_Vehicle_Collisions_-_Crashes.csv" , nrows = n_rows , parse_dates = [['CRASH DATE','CRASH TIME']]) data.dropna(subset = ['LATITUDE','LONGITUDE'],inplace =True) data = data[(data['LATITUDE'] != 0) & (data['LONGITUDE'] != 0)] lowercase = lambda x : str(x).lower() data.rename(lowercase , axis = 'columns', inplace = True) data.rename(columns = {'crash date_crash time':'date/time'},inplace=True) return data data = load_data(100000) original_data = data cols = str(data.columns) # Set the title of your Streamlit app title = 'Motor Vehicle Collision in New York Dashboard' # Set the URL of the logo image logo_url = "https://mustafasa.com/images/motorcrash.png" # Create the HTML markup to display the logo logo_html = f'Logo' # Combine the logo HTML with the title text title_html = f'{logo_html}{title}' # Render the title with logo using markdown st.markdown(title_html, unsafe_allow_html=True) tab1, tab2, tab3 = st.tabs(["Most injured", "Collisions count", "Top dangerous streets"]) with tab1: st.header("Where are the most people injured in NYC?") injured_people = st.slider("Number of people injured in vehicle colllisions" , 1 ,18) st.map(data.query("injured_persons >= @injured_people")[['latitude','longitude']].dropna(how ='any')) with tab2: st.header("How many collisions occur during a given time of the day?") hour = st.slider("Houe to look at " , 0,23,1) data = data[data['date/time'].dt.hour == hour] st.markdown("Vehicle collisions between %i:00 and %i:00 "% (hour, (hour+1 ) % 24)) midpoint = (np.average(data['latitude']), np.average(data['longitude'])) st.write(pdk.Deck( map_style = "mapbox://styles/mapbox/light-v9", initial_view_state ={ 'latitude':midpoint[0], 'longitude':midpoint[1], 'zoom':11, 'pitch':50, }, layers =[ pdk.Layer( "HexagonLayer", data = data[['date/time', 'latitude','longitude']], get_position = ['longitude','latitude'], radius = 100, extruded = True, pickable = True, elevation_scale = 4 , elevation_range = [0,1000], ), ] )) st.subheader("Breakdowm by minute between %i:00 and %i:00 "%(hour,(hour+1)%24)) filter = data[ (data['date/time'].dt.hour >= hour) & (data['date/time'].dt.hour < (hour+1)) ] hist = np.histogram(filter['date/time'].dt.minute , bins = 60 , range = (0,60))[0] chart_data = pd.DataFrame({'minute':range(60) , 'crashes':hist}) fig = px.bar(chart_data , x = 'minute' , y ='crashes' ,hover_data = ['minute','crashes'],height = 400) st.write(fig) with tab3: st.header("Top 5 dangerous streets affected type") select = st.selectbox("Affected type of people", ['Pedestrians','Cyclists','Motorists']) if select == 'Pedestrians': st.dataframe(original_data.query("injured_pedestrians >= 1")[["on street name","injured_pedestrians"]].sort_values(by = ['injured_pedestrians'], ascending = False).dropna(how='any')[:5],width=1200) elif select == 'Cyclists': st.dataframe(original_data.query("injured_cyclists >= 1")[["on street name","injured_cyclists"]].sort_values(by = ['injured_cyclists'], ascending = False).dropna(how='any')[:5],width=1200) else: st.dataframe(original_data.query("injured_motorists >= 1")[["on street name","injured_motorists"]].sort_values(by = ['injured_motorists'], ascending = False).dropna(how='any')[:5],width=1200) if st.checkbox("Show Raw Data",False): st.subheader("Raw Data") st.dataframe(data,width=1200,height=1200)