Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -243,14 +243,45 @@ def create_injuries_fatalities_chart(crash_data):
|
|
243 |
|
244 |
return line_chart
|
245 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
246 |
def main():
|
247 |
st.title('Traffic Crash Analysis')
|
248 |
|
249 |
# Load data
|
250 |
df = load_and_preprocess_data('1.08_Crash_Data_Report_(detail).csv')
|
|
|
|
|
|
|
251 |
|
252 |
# Create tabs for different visualizations
|
253 |
-
tab1, tab2 = st.tabs(["Crash Statistics", "Crash Map"])
|
254 |
|
255 |
with tab1:
|
256 |
# Age group selection
|
@@ -299,7 +330,17 @@ def main():
|
|
299 |
key=f"map_{selected_year}",
|
300 |
returned_objects=["null_drawing"]
|
301 |
)
|
302 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
303 |
# Create 5th Visualization: Injuries and fatalities chart
|
304 |
injuries_fatalities_chart = create_injuries_fatalities_chart(df)
|
305 |
st.altair_chart(injuries_fatalities_chart, use_container_width=True)
|
|
|
243 |
|
244 |
return line_chart
|
245 |
|
246 |
+
def create_crash_trend_chart(df, weather=None):
|
247 |
+
"""
|
248 |
+
Creates a line graph showing crash trends over time, optionally filtered by weather condition.
|
249 |
+
"""
|
250 |
+
# Filter by weather condition if provided
|
251 |
+
if weather and weather != 'All Conditions':
|
252 |
+
df = df[df['Weather'] == weather]
|
253 |
+
|
254 |
+
# Group data by year and count unique Incident IDs
|
255 |
+
trend_data = df.groupby('Year')['Incidentid'].nunique().reset_index()
|
256 |
+
trend_data.columns = ['Year', 'Crash Count']
|
257 |
+
|
258 |
+
# Create line graph
|
259 |
+
fig = px.line(
|
260 |
+
trend_data,
|
261 |
+
x='Year',
|
262 |
+
y='Crash Count',
|
263 |
+
title=f'Crash Trend Over Time ({weather})',
|
264 |
+
labels={'Year': 'Year', 'Crash Count': 'Number of Unique Crashes'},
|
265 |
+
markers=True,
|
266 |
+
height=600
|
267 |
+
)
|
268 |
+
|
269 |
+
fig.update_traces(line=dict(width=2), marker=dict(size=8))
|
270 |
+
fig.update_layout(legend_title_text='Trend')
|
271 |
+
|
272 |
+
return fig
|
273 |
+
|
274 |
def main():
|
275 |
st.title('Traffic Crash Analysis')
|
276 |
|
277 |
# Load data
|
278 |
df = load_and_preprocess_data('1.08_Crash_Data_Report_(detail).csv')
|
279 |
+
|
280 |
+
if 'Weather' not in df.columns:
|
281 |
+
df['Weather'] = 'Unknown'
|
282 |
|
283 |
# Create tabs for different visualizations
|
284 |
+
tab1, tab2, tab3 = st.tabs(["Crash Statistics", "Crash Map", "Crash Trend"])
|
285 |
|
286 |
with tab1:
|
287 |
# Age group selection
|
|
|
330 |
key=f"map_{selected_year}",
|
331 |
returned_objects=["null_drawing"]
|
332 |
)
|
333 |
+
|
334 |
+
with tab3:
|
335 |
+
# Weather condition filter
|
336 |
+
weather = ['All Conditions'] + sorted(df['Weather'].unique())
|
337 |
+
selected_weather = st.selectbox('Select Weather Condition:', weather)
|
338 |
+
|
339 |
+
# Create and display line graph
|
340 |
+
st.markdown("### Crash Trend Over Time")
|
341 |
+
trend_fig = create_crash_trend_chart(df, selected_weather)
|
342 |
+
st.plotly_chart(trend_fig, use_container_width=True)
|
343 |
+
|
344 |
# Create 5th Visualization: Injuries and fatalities chart
|
345 |
injuries_fatalities_chart = create_injuries_fatalities_chart(df)
|
346 |
st.altair_chart(injuries_fatalities_chart, use_container_width=True)
|