namdini commited on
Commit
d29859a
·
verified ·
1 Parent(s): 3ac7f7a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -0
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import streamlit as st
2
  import pandas as pd
3
  import plotly.express as px
 
4
  import folium
5
  from folium.plugins import HeatMap, MarkerCluster
6
  from streamlit_folium import st_folium
@@ -128,6 +129,120 @@ def create_map(df, selected_year):
128
 
129
  return m
130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  def main():
132
  st.title('Traffic Crash Analysis')
133
 
@@ -185,5 +300,11 @@ def main():
185
  returned_objects=["null_drawing"]
186
  )
187
 
 
 
 
 
 
 
188
  if __name__ == "__main__":
189
  main()
 
1
  import streamlit as st
2
  import pandas as pd
3
  import plotly.express as px
4
+ import altair as alt
5
  import folium
6
  from folium.plugins import HeatMap, MarkerCluster
7
  from streamlit_folium import st_folium
 
129
 
130
  return m
131
 
132
+ def 5_create_injuries_fatalities_chart(crash_data):
133
+
134
+ # 5th visualization title
135
+ st.header("5. Total Injuries and Fatalities by Month")
136
+
137
+ # Filter rows where we have valid data for all necessary columns
138
+ crash_data = crash_data[['DateTime', 'Totalinjuries', 'Totalfatalities', 'Unittype_One', 'Unittype_Two']].dropna()
139
+
140
+ # Convert "DateTime" to datetime type
141
+ crash_data['DateTime'] = pd.to_datetime(crash_data['DateTime'], errors='coerce')
142
+ crash_data['Month'] = crash_data['DateTime'].dt.month_name()
143
+
144
+ # sort months in order
145
+ month_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
146
+ crash_data['Month'] = pd.Categorical(crash_data['Month'], categories=month_order, ordered=True)
147
+
148
+ # Dropdown for Unit Type selection
149
+ # Dropdown for Unit Type selection
150
+ # st.sidebar.selectbox("Select Unit Type", options=['Total'] + crash_data['Unittype_One'].dropna().unique().tolist()) # previous location of dropdown in sidebar
151
+ # unit_type = st.selectbox("Select Unit Type", options=['Total'] + crash_data['Unittype_One'].dropna().unique().tolist())
152
+ unit_type_pairs = set()
153
+ for _, row in crash_data[['Unittype_One', 'Unittype_Two']].dropna().iterrows():
154
+ if row['Unittype_One'] != 'Driverless' or row['Unittype_Two'] != 'Driverless':
155
+ pair = ' vs '.join(sorted([row['Unittype_One'], row['Unittype_Two']]))
156
+ unit_type_pairs.add(pair)
157
+ # unit_type_pairs = list(unit_type_pairs) # modified as below to sort the dropdown options in alphabetical order
158
+ unit_type_pairs = sorted(list(unit_type_pairs))
159
+ unit_type = st.selectbox("Select Unit Type Pair", options=['Total'] + unit_type_pairs)
160
+
161
+ # Filter data based on the selected unit type
162
+ if unit_type == 'Total':
163
+ filtered_data = crash_data
164
+ else:
165
+ unit_one, unit_two = unit_type.split(' vs ')
166
+ filtered_data = crash_data[((crash_data['Unittype_One'] == unit_one) & (crash_data['Unittype_Two'] == unit_two)) |
167
+ ((crash_data['Unittype_One'] == unit_two) & (crash_data['Unittype_Two'] == unit_one))]
168
+
169
+ # Group data by month and calculate total injuries and fatalities
170
+ monthly_sum = filtered_data.groupby('Month').agg({'Totalinjuries': 'sum', 'Totalfatalities': 'sum'}).reset_index()
171
+
172
+ # Reshape the data for easier plotting
173
+ injuries = monthly_sum[['Month', 'Totalinjuries']].rename(columns={'Totalinjuries': 'Value'})
174
+ injuries['Measure'] = 'Total Injuries'
175
+
176
+ fatalities = monthly_sum[['Month', 'Totalfatalities']].rename(columns={'Totalfatalities': 'Value'})
177
+ fatalities['Measure'] = 'Total Fatalities'
178
+
179
+ combined_data = pd.concat([injuries, fatalities])
180
+
181
+ # Originally tried to use bar chart but switched to line chart for better trend visualization
182
+ # alt.Chart(monthly_sum).mark_bar().encode(
183
+ # x=alt.X('Month', sort=month_order, title='Month'),
184
+ # y=alt.Y('Totalinjuries', title='Total Injuries', axis=alt.Axis(titleColor='blue', labelColor='blue', tickColor='blue')),
185
+ # color=alt.value('blue'),
186
+ # tooltip=['Month', 'Totalinjuries']
187
+ # ).properties(
188
+ # title='Total Injuries and Fatalities by Month',
189
+ # width=300,
190
+ # height=300
191
+ # ) + alt.Chart(monthly_sum).mark_bar().encode(
192
+ # x=alt.X('Month', sort=month_order, title='Month'),
193
+ # y=alt.Y('Totalfatalities', title='Total Fatalities', axis=alt.Axis(titleColor='red', labelColor='red', tickColor='red')),
194
+ # color=alt.value('red'),
195
+ # tooltip=['Month', 'Totalfatalities']
196
+ # )
197
+
198
+ # Tried to figure out how to plot a legend using altair
199
+ # line_chart = alt.Chart(monthly_sum).mark_line(point=True).encode(
200
+ # x=alt.X('Month', sort=month_order, title='Month'),
201
+ # y=alt.Y('Totalinjuries', title='Total Injuries & Fatalities', axis=alt.Axis(titleColor='black')),
202
+ # color=alt.value('blue'),
203
+ # tooltip=['Month', 'Totalinjuries']
204
+ # ).properties(
205
+ # title=f'Total Injuries and Fatalities by Month for Unit Type Pair: {unit_type}',
206
+ # width=600,
207
+ # height=400
208
+ # ) + alt.Chart(monthly_sum).mark_line(point=True).encode(
209
+ # x=alt.X('Month', sort=month_order, title='Month'),
210
+ # y=alt.Y('Totalfatalities', axis=alt.Axis(titleColor='red')),
211
+ # color=alt.value('red'),
212
+ # tooltip=['Month', 'Totalfatalities']
213
+ # ).configure_legend(
214
+ # titleFontSize=14,
215
+ # labelFontSize=12,
216
+ # titleColor='black',
217
+ # labelColor='black'
218
+ # )
219
+
220
+ # Plot line chart
221
+ line_chart = alt.Chart(combined_data).mark_line(point=True).encode(
222
+ x=alt.X('Month:N', sort=month_order, title='Month'),
223
+ y=alt.Y('Value:Q', title='Total Injuries & Fatalities'),
224
+ color=alt.Color('Measure:N', title='', scale=alt.Scale(domain=['Total Injuries', 'Total Fatalities'], range=['blue', 'red'])),
225
+ tooltip=['Month', 'Measure:N', 'Value:Q']
226
+ ).properties(
227
+ title=f'Total Injuries and Fatalities by Month for Unit Type Pair: {unit_type}',
228
+ width=600,
229
+ height=400
230
+ )
231
+
232
+ # # Combine the charts (trying to make legend)
233
+ # combined_chart = alt.layer(line_chart_injuries, line_chart_fatalities).properties(
234
+ # title=f'Total Injuries and Fatalities by Month for Unit Type Pair: {unit_type}',
235
+ # width=600,
236
+ # height=400
237
+ # ).configure_legend(
238
+ # titleFontSize=14,
239
+ # labelFontSize=12,
240
+ # titleColor='black',
241
+ # labelColor='black'
242
+ # )
243
+
244
+ return line_chart
245
+
246
  def main():
247
  st.title('Traffic Crash Analysis')
248
 
 
300
  returned_objects=["null_drawing"]
301
  )
302
 
303
+ # Create 5th Visualization: Injuries and fatalities chart
304
+ injuries_fatalities_chart = 5_create_injuries_fatalities_chart(df)
305
+ st.altair_chart(injuries_fatalities_chart, use_container_width=True)
306
+ st.markdown("#### TODO: add write-up for this 5th chart.")
307
+
308
+
309
  if __name__ == "__main__":
310
  main()