-
Notifications
You must be signed in to change notification settings - Fork 0
/
individual_editions_stats.py
96 lines (64 loc) · 2.91 KB
/
individual_editions_stats.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import streamlit as st
import pandas as pd
import altair as alt
import plotly.graph_objects as go
country_colors = [
"#3a87f2",
"#050396", "#f00a0a", "#fac8c8", "#32d426", "#9733a6",
"#FFDD44", "#FF69B4", "#00CED1", "#FFD700", "#8A2BE2",
"#7FFF00", "#DC143C", "#FF8C00", "#ADFF2F"
]
def load_year(year):
st.title('Olympic Games Data Through the Years')
st.header(year)
return pd.read_csv('data/medals' + year[-4:] + '.csv')
def make_ranking(df):
st.write("")
st.write("")
df = df.reset_index(drop=True)
st.write('**Medal Chart**')
st.write("")
st.write("In this medal chart, the ranking criterion used is the gold medal count, with the number of silver and bronze medals serving as tiebreakers.")
st.write("Feel free to reorder the table by clicking on the desired column header. You can also search for countries or download the DataFrame (Hover your mouse over the table to see the options!).")
st.dataframe(df, hide_index=True)
st.write("")
st.write("")
st.write("")
st.write("")
def make_medals_bar_chart(df):
st.write('**Medal Counts by Country**')
df_chart = df.drop(['Rank', 'Total'], axis=1)
all_countries = df_chart['Country']
default = all_countries.head(5)
countries = st.multiselect(
"Pick 2 to 10 countries to compare",
all_countries.tolist(),
default.tolist(),
max_selections=10
)
df_chart = df_chart[df_chart['Country'].isin(countries)]
df_chart.drop('Country', axis=1, inplace=True)
df_long = df_chart.melt(id_vars='Country Code', var_name='Medal', value_name='Count')
chart_colors = alt.Scale(domain=df_long['Country Code'].unique(), range=country_colors[1:len(countries)+1])
chart = alt.Chart(df_long).mark_bar().encode(
x=alt.X('Country Code:N', title=None, axis=None, sort=None),
y=alt.Y('Count:Q', title='Number of Medals'),
color=alt.Color('Country Code:N', scale=chart_colors, legend=alt.Legend(title='Country', orient='left')),
column=alt.Column('Medal:N', title=None, sort=['Gold', 'Silver', 'Bronze'])
).properties(
width=200
).configure_axis(
labelAngle=0
)
st.altair_chart(chart)
st.write("")
def make_medals_pie_chart(df):
df_pie = df.drop(['Country', 'Rank'], axis=1)
total_sum = df_pie['Total'].sum()
df_pie['Percentage'] = df_pie['Total'] / total_sum * 100
df_pie['Country Code'] = df_pie.apply(lambda row: 'Other' if row['Percentage'] < 1.80 else row['Country Code'], axis=1)
df_pie = df_pie.groupby('Country Code').sum().reset_index()
df_pie = df_pie.sort_values(by='Total', ascending=False).reset_index(drop=True)
fig = go.Figure(data=[go.Pie(labels=df_pie['Country Code'], values=df_pie['Total'], hole=0.3, marker=dict(colors=country_colors))])
fig.update_layout(title_text='Medal Distribution', height=600)
st.plotly_chart(fig, use_container_width=True)