fp3 / pages /2_Child Mortality vs Population.py
jiyachachan's picture
Rename pages/Child Mortality vs Population.py to pages/2_Child Mortality vs Population.py
fc0159f verified
raw
history blame
3.53 kB
import streamlit as st
import pandas as pd
import altair as alt
# Load data
child_mortality_path = pd.read_csv("https://huggingface.co/spaces/jiyachachan/fp2/resolve/main/child_mortality_0_5_year_olds_dying_per_1000_born.csv") # Format: Country, Year, Value
population_path = pd.read_csv("https://huggingface.co/spaces/jiyachachan/fp2/resolve/main/pop.csv")
child_mortality = pd.read_csv(child_mortality_path)
population = pd.read_csv(population_path)
# Data Cleaning
def convert_population(value):
if isinstance(value, str):
if 'B' in value:
return float(value.replace('B', '')) * 1_000_000_000
elif 'M' in value:
return float(value.replace('M', '')) * 1_000_000
elif 'k' in value:
return float(value.replace('k', '')) * 1_000
else:
return float(value)
return value
population.iloc[:, 1:] = population.iloc[:, 1:].applymap(convert_population)
# Title and Description
st.title("Child Mortality Rate vs Population")
st.write("""
This visualization explores the relationship between child mortality rates (per 1,000 live births) and population size for a selected country over time.
By displaying both metrics side-by-side on a dual-y-axis chart, the visual aims to provide insights into how population trends and child mortality rates have evolved across decades.
The visualization is interactive, allowing users to select a country from the dropdown menu. This enables tailored exploration of trends specific to different countries.
Hovering over the chart provides tooltips with detailed information for each data point, including the year, population size, and child mortality rate.
""")
st.subheader("Select a Country")
countries = sorted(child_mortality['country'].unique())
selected_country = st.selectbox("Country", countries, index=0)
if selected_country:
mortality_country = child_mortality[child_mortality['country'] == selected_country].melt(
id_vars='country', var_name='year', value_name='child_mortality'
)
population_country = population[population['country'] == selected_country].melt(
id_vars='country', var_name='year', value_name='population'
)
merged_country_data = pd.merge(mortality_country, population_country, on=['country', 'year'], how='inner')
merged_country_data['year'] = merged_country_data['year'].astype(int)
merged_country_data = merged_country_data[merged_country_data['year'] % 20 == 0]
# Dual-Y Axis Chart
dual_axis_chart = alt.layer(
# First Layer: Child Mortality
alt.Chart(merged_country_data).mark_line(point=True).encode(
x=alt.X('year:O', title='Year (Every 20 Years)', axis=alt.Axis(labelAngle=0)),
y=alt.Y('child_mortality:Q', title='Child Mortality Rate (per 1,000 live births)', axis=alt.Axis(titleColor='lightblue')),
tooltip=['year', 'child_mortality']
).properties(
width=800,
height=400,
),
# Second Layer: Population
alt.Chart(merged_country_data).mark_line(color='orange', point=True).encode(
x=alt.X('year:O'),
y=alt.Y('population:Q', title='Population (in millions)', axis=alt.Axis(titleColor='orange')),
tooltip=['year', 'population']
)
).resolve_scale(
y='independent'
).properties(
title=f" Child Mortality and Population Trends in {selected_country}"
)
st.altair_chart(dual_axis_chart, use_container_width=True)