""" World Population Dataset Monitoring city population (per country) with upper/lower bounds intervals """ # -- filter on arbitrarily selected countries countries = df.sample(5)['country'].values # countries = ["Japan", "Argentina", "Greece", "Thailand", "Peru", "Saudi Arabia", "Jordan" ,"United States"]; # -- add a new column to df (mean or std) df = df.groupby("country", as_index=False).apply( lambda d: d.assign(city_population_avg=d["population"].std().astype(int)) ); # -- measure members distance from LCL df = df.groupby("country", as_index=False).apply( lambda d: d.assign(upper_bound=abs((d["city_population_avg"]*1.1).astype(int)+d["city_population_avg"])) ); df = df.groupby("country", as_index=False).apply( lambda d: d.assign(lower_bound=abs((d["city_population_avg"]*1.1).astype(int)-d["city_population_avg"])) ); for country in countries: _df = df[df['country']==country] b = px.bar(_df, x="city", y="population", facet_col="country", facet_col_wrap=4) s = px.line( _df, x="city", y="city_population_avg", facet_col="country", facet_col_wrap=4, color="city_population_avg" ).update_traces(line_color="orange") b.add_traces(s.data) u = px.line( _df, x="city", y="upper_bound", facet_col="country", facet_col_wrap=4, color="upper_bound" ).update_traces(line_color="green") b.add_traces(u.data) l = px.line( _df, x="city", y="lower_bound", facet_col="country", facet_col_wrap=4, color="lower_bound" ).update_traces(line_color="red") b.add_traces(l.data) st.markdown(f"# {country}") col1, col2 = st.columns(2) col1.plotly_chart(b) col2.write(_df) below_control = _df[_df['population']<_df['lower_bound']].shape[0] msg = f"{round((below_control/_df.shape[0]), 2)*100}% of the cities are below the `lower_bound` of population control" st.markdown(f"> ### {msg}")