In [2]:
import pandas as pd
import plotly.graph_objects as go
In [3]:
school_rename_map = {
    'Dr. Martin Luther King Jr. Literary & Fine Arts School': 'King Arts',
    'Dr Martin Luther King Jr Literary & Fine Arts School': 'King Arts',
    'Dr. Martin Luther King Jr. Literary and Fine Arts School': 'King Arts',
    'Washington Elementary School': 'Washington',
    'Lincoln Elementary School': 'Lincoln',
    'Oakton Elementary School': 'Oakton',
    'Dawes Elementary School': 'Dawes',
    'Dewey Elementary School': 'Dewey',
    'Walker Elementary School': 'Walker',
    'Lincolnwood Elementary School': 'Lincolnwood',
    'Willard Elementary School': 'Willard',
    'Kingsley Elementary School': 'Kingsley',
    'Dr. Bessie Rhodes School of Global Studies': 'Bessie Rhodes',
    'Orrington Elementary School': 'Orrington',
    "Rice Children's Center": "Rice Center",
    'Chute Middle School': 'Chute',
    'Nichols Middle School': 'Nichols',
    'Haven Middle School': 'Haven',
    'Foster School': 'Foster'
}

gen_ed_elementary_schools = [
    'King Arts',
    'Washington',
    'Lincoln',
    'Oakton',
    'Dawes',
    'Dewey',
    'Walker',
    'Lincolnwood',
    'Willard',
    'Kingsley',
    'Bessie Rhodes',
    'Orrington',
    'Foster'
]
In [5]:
transportation_1A = pd.read_csv('data/1A_transportation_idot_d65.csv')
transportation_1A = transportation_1A.rename(columns={'new_attendance_area_school': 'Schools'})
transportation_1A['Schools'] = transportation_1A['Schools'].replace(school_rename_map)
transportation_1A['Enroll Total'] = transportation_1A['Bus'] + transportation_1A['Hazard'] + transportation_1A['Walk <=.75 miles'] + transportation_1A['Walk >.75 miles']
transportation_1A['walk_pct'] = transportation_1A['Walk <=.75 miles'] / transportation_1A['Enroll Total'] * 100

transportation_1B = pd.read_csv('data/1B_transportation_idot_d65.csv')
transportation_1B = transportation_1B.rename(columns={'new_attendance_area_school': 'Schools'})
transportation_1B['Schools'] = transportation_1B['Schools'].replace(school_rename_map)
transportation_1B['Enroll Total'] = transportation_1B['Bus'] + transportation_1B['Hazard'] + transportation_1B['Walk <=.75 miles'] + transportation_1B['Walk >.75 miles']
transportation_1B['walk_pct'] = transportation_1B['Walk <=.75 miles'] / transportation_1B['Enroll Total'] * 100

transportation_2FR = pd.read_csv('data/2FR_transportation_idot_d65.csv')
transportation_2FR['Schools'] = transportation_2FR['Schools'].replace(school_rename_map)
transportation_2FR['Enroll Total'] = transportation_2FR['Bus'] + transportation_2FR['Hazard'] + transportation_2FR['Walk <=.75 miles'] + transportation_2FR['Walk >.75 miles']
transportation_2FR['walk_pct'] = transportation_2FR['Walk <=.75 miles'] / transportation_2FR['Enroll Total'] * 100

transportation_2DR = pd.read_csv('data/2DR_transportation_idot_d65.csv')
transportation_2DR['Schools'] = transportation_2DR['Schools'].replace(school_rename_map)
transportation_2DR['Enroll Total'] = transportation_2DR['Bus'] + transportation_2DR['Hazard'] + transportation_2DR['Walk <=.75 miles'] + transportation_2DR['Walk >.75 miles']
transportation_2DR['walk_pct'] = transportation_2DR['Walk <=.75 miles'] / transportation_2DR['Enroll Total'] * 100
In [6]:
elementary_transportation_1A = transportation_1A[transportation_1A['Schools'].isin(gen_ed_elementary_schools)].copy()
elementary_transportation_1B = transportation_1B[transportation_1B['Schools'].isin(gen_ed_elementary_schools)].copy()
elementary_transportation_2FR = transportation_2FR[transportation_2FR['Schools'].isin(gen_ed_elementary_schools)].copy()
elementary_transportation_2DR = transportation_2DR[transportation_2DR['Schools'].isin(gen_ed_elementary_schools)].copy()
In [7]:
feeder_map = {
    'Washington': 'Nichols',
    'Lincoln': 'Nichols',
    'Oakton': 'Chute',
    'Dawes': 'Chute',
    'Dewey': 'Nichols',
    'Walker': 'Chute',
    'Lincolnwood': 'Haven',
    'Willard': 'Haven',
    'Kingsley': 'Haven',
    'Orrington': 'Haven',
    'Foster': 'Haven'
}

# Add column for feeder middle school
elementary_transportation_2DR['Feeder'] = elementary_transportation_2DR['Schools'].map(feeder_map)
elementary_transportation_2FR['Feeder'] = elementary_transportation_2FR['Schools'].map(feeder_map)
elementary_transportation_1A['Feeder'] = elementary_transportation_1A['Schools'].map(feeder_map)
elementary_transportation_1B['Feeder'] = elementary_transportation_1B['Schools'].map(feeder_map)

# Group by feeder middle school and sum the Walk and Enroll Total columns
feeder_walk_2DR = elementary_transportation_2DR.groupby('Feeder').agg({
    'Walk <=.75 miles': 'sum',
    'Enroll Total': 'sum'
}).reset_index()
feeder_walk_2DR['walk_pct'] = feeder_walk_2DR['Walk <=.75 miles'] / feeder_walk_2DR['Enroll Total'] * 100

feeder_walk_2FR = elementary_transportation_2FR.groupby('Feeder').agg({
    'Walk <=.75 miles': 'sum',
    'Enroll Total': 'sum'
}).reset_index()
feeder_walk_2FR['walk_pct'] = feeder_walk_2FR['Walk <=.75 miles'] / feeder_walk_2FR['Enroll Total'] * 100   

feeder_walk_1A = elementary_transportation_1A.groupby('Feeder').agg({
    'Walk <=.75 miles': 'sum',
    'Enroll Total': 'sum'
}).reset_index()
feeder_walk_1A['walk_pct'] = feeder_walk_1A['Walk <=.75 miles'] / feeder_walk_1A['Enroll Total'] * 100

feeder_walk_1B = elementary_transportation_1B.groupby('Feeder').agg({
    'Walk <=.75 miles': 'sum',
    'Enroll Total': 'sum'
}).reset_index()
feeder_walk_1B['walk_pct'] = feeder_walk_1B['Walk <=.75 miles'] / feeder_walk_1B['Enroll Total'] * 100
In [16]:
# Create a side by side bar chart comparing walkability percentages across scenarios for each elementary school
fig = go.Figure()
fig.add_trace(go.Bar(
    y=elementary_transportation_1A['Schools'],
    x=elementary_transportation_1A['walk_pct'],
    name='Scenario 1A',
    text=elementary_transportation_1A['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.add_trace(go.Bar(
    y=elementary_transportation_1B['Schools'],
    x=elementary_transportation_1B['walk_pct'],
    name='Scenario 1B',
    text=elementary_transportation_1B['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.add_trace(go.Bar(
    y=elementary_transportation_2FR['Schools'],
    x=elementary_transportation_2FR['walk_pct'],
    name='Scenario 2FR',
    text=elementary_transportation_2FR['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.add_trace(go.Bar(
    y=elementary_transportation_2DR['Schools'],
    x=elementary_transportation_2DR['walk_pct'],
    name='Scenario 2DR',
    text=elementary_transportation_2DR['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.update_layout(
    title='Walkability Percentage by Elementary School Across Scenarios',
    xaxis_title='Percentage of Students Walking (%)',
    yaxis_title='School',
    barmode='group',
    height=1600
)
fig.write_html('assets/elementary_walkability_comparison.html')
fig.show()
In [17]:
# Plot walkability percentages by feeder middle school
fig = go.Figure()
fig.add_trace(go.Bar(
    y=feeder_walk_1A['Feeder'],
    x=feeder_walk_1A['walk_pct'],
    name='Scenario 1A',
    text=feeder_walk_1A['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.add_trace(go.Bar(
    y=feeder_walk_1B['Feeder'],
    x=feeder_walk_1B['walk_pct'],
    name='Scenario 1B',
    text=feeder_walk_1B['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.add_trace(go.Bar(
    y=feeder_walk_2FR['Feeder'],
    x=feeder_walk_2FR['walk_pct'],
    name='Scenario 2FR',
    text=feeder_walk_2FR['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.add_trace(go.Bar(
    y=feeder_walk_2DR['Feeder'],
    x=feeder_walk_2DR['walk_pct'],
    name='Scenario 2DR',
    text=feeder_walk_2DR['walk_pct'].round(1),
    textposition='auto',
    orientation='h'
))
fig.update_layout(
    title='Walkability Percentage of Elementary Schools Grouped by Feeder Pattern Across Scenarios',
    xaxis_title='Percentage of Students Walking (%)',
    yaxis_title='Feeder Pattern',
    barmode='group',
    height=800
)
fig.write_html('assets/feeder_walkability_comparison.html')
fig.show()