Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import pandas as pd | |
| import plotly.express as px | |
| import plotly.graph_objects as go | |
| from gapminder import gapminder | |
| ####### | |
| # Data loading | |
| ####### | |
| df = gapminder | |
| year_values = (int(df["year"].min()), int(df["year"].max())) | |
| metrics = ["lifeExp", "pop", "gdpPercap"] | |
| dimension = ["country", "continent", "year"] | |
| ####### | |
| # Helper functions | |
| ####### | |
| def get_filtered_data( | |
| continents="All", | |
| countries="All", | |
| min_year=year_values[0], | |
| max_year=year_values[1], | |
| ): | |
| if isinstance(continents, str) and continents != "All": | |
| mask_continent = df["continent"] == continents | |
| else: | |
| mask_continent = df["continent"].isin(continents) | |
| if isinstance(countries, str) and countries != "All": | |
| mask_country = df["country"] == countries | |
| else: | |
| mask_country = df["country"].isin(countries) | |
| mask_year = ((df["year"] >= min_year) & (df["year"] <= max_year)) | |
| return df[mask_continent & mask_country & mask_year] | |
| def box_plot(df, x, y): | |
| fig = px.box( | |
| df, x=x, y=y, hover_data=df[dimension + [x]], | |
| points="all", color=x) | |
| return fig | |
| def scatter_plot(df, x, y, hue): | |
| fig = px.scatter( | |
| df, x=x, y=y, | |
| color=hue, symbol=hue) | |
| return fig | |
| def line_plot(df, y_axis, label, highlighted): | |
| fig = go.Figure() | |
| if label=="continent": | |
| df = df.groupby(["continent", "year"]).agg({ | |
| "lifeExp": "mean", | |
| "pop": "sum", | |
| "gdpPercap": "mean", | |
| }).reset_index() | |
| data = df[df[label]==highlighted] | |
| x = data["year"] | |
| y = data[y_axis] | |
| fig.add_trace(go.Scatter(x=x, y=y, | |
| hovertext=[ | |
| f"{label}: {highlighted}<br>year: {year}<br>{y_axis}: {value}" | |
| for year, value in zip(x,y) | |
| ], | |
| hoverinfo="text", | |
| mode='lines', | |
| line = dict(color='orange', width=10), | |
| # name=highlighted | |
| )) | |
| for i in df[label].unique(): | |
| if i == highlighted: | |
| continue | |
| data = df[df[label]==i] | |
| x = data["year"] | |
| y = data[y_axis] | |
| fig.add_trace(go.Scatter(x=x, y=y, | |
| hovertext=[ | |
| f"{label}: {i}<br>year: {year}<br>{y_axis}: {value}" | |
| for year, value in zip(x,y) | |
| ], | |
| hoverinfo="text", | |
| mode='lines', | |
| line = dict(color='gray', width=1), | |
| # name=i | |
| )) | |
| fig.update_layout(showlegend=False) | |
| return fig | |
| ####### | |
| # Streamlit app code | |
| ####### | |
| st.title('[Gapminder] Exploratory Data Analysis') | |
| st.markdown("## Gapminder Table") | |
| selected_continents = st.multiselect("Select Continents:", df["continent"].unique(), key="table_continent") | |
| selected_countries = st.multiselect("Select Countries:", df.loc[df["continent"].isin(selected_continents), "country"].unique(), key="table_country") | |
| min_year, max_year = st.slider("Select Year:", year_values[0], year_values[1], year_values, key="table_year") | |
| st.dataframe(get_filtered_data(selected_continents, selected_countries, min_year, max_year)) | |
| st.markdown("## Gapminder Boxplot") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| x = st.selectbox("Select x Axis", dimension, key="boxplot_x") | |
| with col2: | |
| y = st.selectbox("Select y Axis", metrics, key="boxplot_y") | |
| st.plotly_chart(box_plot(df, x, y)) | |
| st.markdown('## Gapminder Lineplot') | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| label = st.selectbox("Select label", ["country", "continent"], key="lineplot_label") | |
| with col2: | |
| highlighted = st.selectbox("Select value to hightlight", df[label].unique(), key="lineplot_highlighting") | |
| with col3: | |
| y = st.selectbox("Select hue", metrics, key="lineplot_y") | |
| st.plotly_chart(line_plot(df, y, label, highlighted)) | |
| st.markdown('## Gapminder Scatterplot') | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| x = st.selectbox("Select x Axis", metrics, key="scatterplot_x") | |
| with col2: | |
| y = st.selectbox("Select y Axis", metrics, key="scatterplot_y") | |
| with col3: | |
| hue = st.selectbox("Select hue", ["country", "continent"], key="scatterplot_hue") | |
| st.plotly_chart(scatter_plot(df, x, y, hue)) | |