从人数来看,每届夏奥会参赛人数都是冬奥会的4-5倍;

整体参赛人数是上涨趋势,但由于历史原因也出现过波动,如1980年莫斯科奥运会层遭遇65个国家抵制;

athlete = data.groupby(['Year', 'Season'])['Name'].nunique().reset_index()

athlete.columns = ['Year', 'Season', 'Nums']

athlete = athlete.sort_values(by="Year" , ascending=True)

x_list, y1_list, y2_list = [], [], []

for _, row in athlete.iterrows():

x_list.append(str(row['Year']))

if row['Season'] == 'Summer':

y1_list.append(row['Nums'])

y2_list.append(None)

else:

y2_list.append(row['Nums'])

y1_list.append(None)

background_color_js = (

"new echarts.graphic.LinearGradient(1, 1, 0, 0, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

line = (

Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))

.add_xaxis(x_list)

.add_yaxis("夏季奥运会",

y1_list,

is_smooth=True,

is_connect_nones=True,

symbol="circle",

symbol_size=6,

linestyle_opts=opts.LineStyleOpts(color="#fff"),

label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),

itemstyle_opts=opts.ItemStyleOpts(

color="green", border_color="#fff", border_width=3),

tooltip_opts=opts.TooltipOpts(is_show=True))

.add_yaxis("冬季季奥运会",

y2_list,

is_smooth=True,

is_connect_nones=True,

symbol="circle",

symbol_size=6,

linestyle_opts=opts.LineStyleOpts(color="#FF4500"),

label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),

itemstyle_opts=opts.ItemStyleOpts(

color="red", border_color="#fff", border_width=3),

tooltip_opts=opts.TooltipOpts(is_show=True))

.set_series_opts(

markarea_opts=opts.MarkAreaOpts(

label_opts=opts.LabelOpts(is_show=True, position="bottom", color="white"),

data=[

opts.MarkAreaItem(name="第一次世界大战", x=(1914, 1918)),

opts.MarkAreaItem(name="第二次世界大战", x=(1939, 1945)),

]

)

)

.set_global_opts(title_opts=opts.TitleOpts(title="历届奥运会参赛人数",

pos_left="center",

title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20),),

legend_opts=opts.LegendOpts(is_show=True, pos_top='5%',

textstyle_opts=opts.TextStyleOpts(color="white", font_size=12)),

xaxis_opts=opts.AxisOpts(type_="value",

min_=1904,

max_=2016,

boundary_gap=False,

axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63",

formatter=JsCode("""function (value)

{return value+'年';}""")),

axisline_opts=opts.AxisLineOpts(is_show=False),

axistick_opts=opts.AxisTickOpts(

is_show=True,

length=25,

linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),

),

splitline_opts=opts.SplitLineOpts(

is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")

),

),

yaxis_opts=opts.AxisOpts(

type_="value",

position="right",

axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),

axisline_opts=opts.AxisLineOpts(

linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")

),

axistick_opts=opts.AxisTickOpts(

is_show=True,

length=15,

linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),

),

splitline_opts=opts.SplitLineOpts(

is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")

),

),)

)

line.render_notebook()

3.2、历年女性运动员占比趋势

一开始奥运会基本是「男人的运动」,女性运动员仅为个位数,到近几届奥运会男女参赛人数基本趋于相等;

# 历年男性运动员人数

m_data = data[data.Sex=='M'].groupby(['Year', 'Season'])['Name'].nunique().reset_index()

m_data.columns = ['Year', 'Season', 'M-Nums']

m_data = m_data.sort_values(by="Year" , ascending=True)

# 历年女性运动员人数

f_data = data[data.Sex=='F'].groupby(['Year', 'Season'])['Name'].nunique().reset_index()

f_data.columns = ['Year', 'Season', 'F-Nums']

f_data = f_data.sort_values(by="Year" , ascending=True)

t_data = pd.merge(m_data, f_data, on=['Year', 'Season'])

t_data['F-rate'] = round(t_data['F-Nums'] / (t_data['F-Nums'] + t_data['M-Nums'] ), 4)

x_list, y1_list, y2_list = [], [], []

for _, row in t_data.iterrows():

x_list.append(str(row['Year']))

if row['Season'] == 'Summer':

y1_list.append(row['F-rate'])

y2_list.append(None)

else:

y2_list.append(row['F-rate'])

y1_list.append(None)

background_color_js = (

"new echarts.graphic.LinearGradient(0, 0, 0, 1, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

line = (

Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))

.add_xaxis(x_list)

.add_yaxis("夏季奥运会",

y1_list,

is_smooth=True,

is_connect_nones=True,

symbol="circle",

symbol_size=6,

linestyle_opts=opts.LineStyleOpts(color="#fff"),

label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),

itemstyle_opts=opts.ItemStyleOpts(color="green", border_color="#fff", border_width=3),

tooltip_opts=opts.TooltipOpts(is_show=True),)

.add_yaxis("冬季季奥运会",

y2_list,

is_smooth=True,

is_connect_nones=True,

symbol="circle",

symbol_size=6,

linestyle_opts=opts.LineStyleOpts(color="#FF4500"),

label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),

itemstyle_opts=opts.ItemStyleOpts(color="red", border_color="#fff", border_width=3),

tooltip_opts=opts.TooltipOpts(is_show=True),)

.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter=JsCode("""function (params)

{return params.data[0]+ '年: ' + Number(params.data[1])*100 +'%';}""")),)

.set_global_opts(title_opts=opts.TitleOpts(title="历届奥运会参赛女性占比趋势",

pos_left="center",

title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20),),

legend_opts=opts.LegendOpts(is_show=True, pos_top='5%',

textstyle_opts=opts.TextStyleOpts(color="white", font_size=12)),

xaxis_opts=opts.AxisOpts(type_="value",

min_=1904,

max_=2016,

boundary_gap=False,

axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63",

formatter=JsCode("""function (value)

{return value+'年';}""")),

axisline_opts=opts.AxisLineOpts(is_show=False),

axistick_opts=opts.AxisTickOpts(

is_show=True,

length=25,

linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),

),

splitline_opts=opts.SplitLineOpts(

is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")

),

),

yaxis_opts=opts.AxisOpts(

type_="value",

position="right",

axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63",

formatter=JsCode("""function (value)

{return Number(value *100)+'%';}""")),

axisline_opts=opts.AxisLineOpts(

linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")

),

axistick_opts=opts.AxisTickOpts(

is_show=True,

length=15,

linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),

),

splitline_opts=opts.SplitLineOpts(

is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")

),

),)

)

line.render_notebook()

3.3、获得金牌/奖牌比例

整个奥运会(包括夏季,冬季奥运会)历史上参赛人数为134732,获得过金牌的运动员只有10413,占比7.7%;

获得过奖牌(包括金银铜)的运动员有28202人,占比20.93%;

total_athlete = len(set(data['Name']))

medal_athlete = len(set(data['Name'][data['Medal'].isin(['Gold', 'Silver', 'Bronze'])]))

gold_athlete = len(set(data['Name'][data['Medal']=='Gold']))

l1 = Liquid(init_opts=opts.InitOpts(theme='dark', width='1000px', height='800px'))

l1.add("获得奖牌", [medal_athlete/total_athlete],

center=["70%", "50%"],

label_opts=opts.LabelOpts(font_size=50,

formatter=JsCode(

"""function (param) {

return (Math.floor(param.value * 10000) / 100) + '%';

}"""),

position="inside",

))

l1.set_global_opts(title_opts=opts.TitleOpts(title="获得过奖牌比例", pos_left='62%', pos_top='8%'))

l1.set_series_opts(tooltip_opts=opts.TooltipOpts(is_show=False))

l2 = Liquid(init_opts=opts.InitOpts(theme='dark', width='1000px', height='800px'))

l2.add("获得金牌",

[gold_athlete/total_athlete],

center=["25%", "50%"],

label_opts=opts.LabelOpts(font_size=50,

formatter=JsCode(

"""function (param) {

return (Math.floor(param.value * 10000) / 100) + '%';

}"""),

position="inside",

),)

l2.set_global_opts(title_opts=opts.TitleOpts(title="获得过金牌比例", pos_left='17%', pos_top='8%'))

l2.set_series_opts(tooltip_opts=opts.TooltipOpts(is_show=False))

grid = Grid().add(l1, grid_opts=opts.GridOpts()).add(l2, grid_opts=opts.GridOpts())

grid.render_notebook()

运动员平均体质数据

根据不同的运动项目进行统计

运动员平均身高最高的项目是篮球,女子平均身高达182cm,男子平均身高达到194cm;

在男子项目中,运动员平均体重最大的项目是拔河,平均体重达到96kg(拔河自第七届奥运会后已取消);

运动员平均年龄最大的项目是Art competition(自行百度这奇怪的项目),平均年龄46岁,除此之外便是马术和射击,男子平均年龄分别为34.4岁和34.2岁,女子平均年龄34.22岁和29.12岁;

tool_js = """function (param) {return param.data[2] +'
'

+'平均体重: '+Number(param.data[0]).toFixed(2)+' kg
'

+'平均身高: '+Number(param.data[1]).toFixed(2)+' cm
'

+'平均年龄: '+Number(param.data[3]).toFixed(2);}"""

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

temp_data = data[data['Sex']=='M'].groupby(['Sport'])['Age', 'Height', 'Weight'].mean().reset_index().dropna(how='any')

scatter = (Scatter(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))

.add_xaxis(temp_data['Weight'].tolist())

.add_yaxis("男性", [[row['Height'], row['Sport'], row['Age']] for _, row in temp_data.iterrows()],

# 渐变效果实现部分

color=JsCode("""new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{

offset: 0,

color: 'rgb(129, 227, 238)'

}, {

offset: 1,

color: 'rgb(25, 183, 207)'

}])"""))

.set_series_opts(label_opts=opts.LabelOpts(is_show=False))

.set_global_opts(

title_opts=opts.TitleOpts(title="各项目运动员平均升高体重年龄",pos_left="center",

title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20)),

legend_opts=opts.LegendOpts(is_show=True, pos_top='5%',

textstyle_opts=opts.TextStyleOpts(color="white", font_size=12)),

tooltip_opts = opts.TooltipOpts(formatter=JsCode(tool_js)),

xaxis_opts=opts.AxisOpts(

name='体重/kg',

# 设置坐标轴为数值类型

type_="value",

is_scale=True,

# 显示分割线

axislabel_opts=opts.LabelOpts(margin=30, color="white"),

axisline_opts=opts.AxisLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),

axistick_opts=opts.AxisTickOpts(is_show=True, length=25,

linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),

splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")

)),

yaxis_opts=opts.AxisOpts(

name='身高/cm',

# 设置坐标轴为数值类型

type_="value",

# 默认为False表示起始为0

is_scale=True,

axislabel_opts=opts.LabelOpts(margin=30, color="white"),

axisline_opts=opts.AxisLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),

axistick_opts=opts.AxisTickOpts(is_show=True, length=25,

linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),

splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")

)),

visualmap_opts=opts.VisualMapOpts(is_show=False, type_='size', range_size=[5,50], min_=10, max_=40)

))

temp_data = data[data['Sex']=='F'].groupby(['Sport'])['Age', 'Height', 'Weight'].mean().reset_index().dropna(how='any')

scatter1 = (Scatter()

.add_xaxis(temp_data['Weight'].tolist())

.add_yaxis("女性", [[row['Height'], row['Sport'], row['Age']] for _, row in temp_data.iterrows()],

itemstyle_opts=opts.ItemStyleOpts(

color=JsCode("""new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{

offset: 0,

color: 'rgb(251, 118, 123)'

}, {

offset: 1,

color: 'rgb(204, 46, 72)'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=False))

)

scatter.overlap(scatter1)

scatter.render_notebook()

🇨🇳中国奥运会表现

CN_data = data[data.region=='China']

CN_data.head()

历届奥运会参赛人数

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

athlete = CN_data.groupby(['Year', 'Season'])['Name'].nunique().reset_index()

athlete.columns = ['Year', 'Season', 'Nums']

athlete = athlete.sort_values(by="Year" , ascending=False)

s_bar = (

Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))

.add_xaxis([row['Year'] for _, row in athlete[athlete.Season=='Summer'].iterrows()])

.add_yaxis("参赛人数", [row['Nums'] for _, row in athlete[athlete.Season=='Summer'].iterrows()],

category_gap='40%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 1,

color: '#00BFFF'

}, {

offset: 0,

color: '#32CD32'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="中国历年奥运会参赛人数-夏奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=0, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

w_bar = (

Bar(init_opts=opts.InitOpts(theme='dark',width='1000px', height='300px'))

.add_xaxis([row['Year'] for _, row in athlete[athlete.Season=='Winter'].iterrows()])

.add_yaxis("参赛人数", [row['Nums'] for _, row in athlete[athlete.Season=='Winter'].iterrows()],

category_gap='50%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 1,

color: '#00BFFF'

}, {

offset: 0.8,

color: '#FFC0CB'

}, {

offset: 0,

color: '#40E0D0'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="中国历年奥运会参赛人数-冬奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=-300, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

page = (

Page()

.add(s_bar,)

.add(w_bar,)

)

page.render_notebook()

历届奥运会获得金牌数🏅️

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

CN_medals = CN_data.groupby(['Year', 'Season', 'Medal'])['Event'].nunique().reset_index()

CN_medals.columns = ['Year', 'Season', 'Medal', 'Nums']

CN_medals = CN_medals.sort_values(by="Year" , ascending=False)

s_bar = (

Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))

.add_xaxis(sorted(list(set([row['Year'] for _, row in CN_medals[CN_medals.Season=='Summer'].iterrows()])), reverse=True))

.add_yaxis("金牌", [row['Nums'] for _, row in CN_medals[(CN_medals.Season=='Summer') & (CN_medals.Medal=='Gold')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#FFD700'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("银牌", [row['Nums'] for _, row in CN_medals[(CN_medals.Season=='Summer') & (CN_medals.Medal=='Silver')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#C0C0C0'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("铜牌", [row['Nums'] for _, row in CN_medals[(CN_medals.Season=='Summer') & (CN_medals.Medal=='Bronze')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#DAA520'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="中国历年奥运会获得奖牌数数-夏奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=0, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

w_bar = (

Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))

.add_xaxis(sorted(list(set([row['Year'] for _, row in CN_medals[CN_medals.Season=='Winter'].iterrows()])), reverse=True))

.add_yaxis("金牌", [row['Nums'] for _, row in CN_medals[(CN_medals.Season=='Winter') & (CN_medals.Medal=='Gold')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#FFD700'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("银牌", [row['Nums'] for _, row in CN_medals[(CN_medals.Season=='Winter') & (CN_medals.Medal=='Silver')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#C0C0C0'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("铜牌", [row['Nums'] for _, row in CN_medals[(CN_medals.Season=='Winter') & (CN_medals.Medal=='Bronze')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#DAA520'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="中国历年奥运会获得奖牌数-冬奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=-300, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

page = (

Page()

.add(s_bar,)

.add(w_bar,)

)

page.render_notebook()

优势项目

跳水,体操,射击,举重,乒乓球,羽毛球

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0.5, color: '#FFC0CB'}, {offset: 1, color: '#F0FFFF'}, {offset: 0, color: '#EE82EE'}], false)"

)

CN_events = CN_data[CN_data.Medal=='Gold'].groupby(['Year', 'Sport'])['Event'].nunique().reset_index()

CN_events = CN_events.groupby(['Sport'])['Event'].sum().reset_index()

CN_events.columns = ['Sport', 'Nums']

data_pair = [(row['Sport'], row['Nums']) for _, row in CN_events.iterrows()]

wc = (WordCloud(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))

.add("", data_pair,word_size_range=[30, 80])

.set_global_opts(title_opts=opts.TitleOpts(title="中国获得过金牌运动项目",pos_left="center",

title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20)))

)

wc.render_notebook()

🇺🇸美国奥运会表现

USA_data = data[data.region=='USA']

USA_data.head()

历届奥运会参加人数

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

athlete = USA_data.groupby(['Year', 'Season'])['Name'].nunique().reset_index()

athlete.columns = ['Year', 'Season', 'Nums']

athlete = athlete.sort_values(by="Year" , ascending=False)

s_bar = (

Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))

.add_xaxis([row['Year'] for _, row in athlete[athlete.Season=='Summer'].iterrows()])

.add_yaxis("参赛人数", [row['Nums'] for _, row in athlete[athlete.Season=='Summer'].iterrows()],

category_gap='40%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 1,

color: '#00BFFF'

}, {

offset: 0,

color: '#32CD32'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="美国历年奥运会参赛人数-夏奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=0, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

w_bar = (

Bar(init_opts=opts.InitOpts(theme='dark',width='1000px', height='300px'))

.add_xaxis([row['Year'] for _, row in athlete[athlete.Season=='Winter'].iterrows()])

.add_yaxis("参赛人数", [row['Nums'] for _, row in athlete[athlete.Season=='Winter'].iterrows()],

category_gap='50%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 1,

color: '#00BFFF'

}, {

offset: 0.8,

color: '#FFC0CB'

}, {

offset: 0,

color: '#40E0D0'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="美国历年奥运会参赛人数-冬奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=-300, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

page = (

Page()

.add(s_bar,)

.add(w_bar,)

)

page.render_notebook()

历届奥运会获得奖牌数

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

medals = USA_data.groupby(['Year', 'Season', 'Medal'])['Event'].nunique().reset_index()

medals.columns = ['Year', 'Season', 'Medal', 'Nums']

medals = medals.sort_values(by="Year" , ascending=False)

s_bar = (

Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))

.add_xaxis(sorted(list(set([row['Year'] for _, row in medals[medals.Season=='Summer'].iterrows()])), reverse=True))

.add_yaxis("金牌", [row['Nums'] for _, row in medals[(medals.Season=='Summer') & (medals.Medal=='Gold')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#FFD700'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("银牌", [row['Nums'] for _, row in medals[(medals.Season=='Summer') & (medals.Medal=='Silver')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#C0C0C0'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("铜牌", [row['Nums'] for _, row in medals[(medals.Season=='Summer') & (medals.Medal=='Bronze')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#DAA520'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="美国历年奥运会获得奖牌数数-夏奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=0, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

w_bar = (

Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))

.add_xaxis(sorted(list(set([row['Year'] for _, row in medals[medals.Season=='Winter'].iterrows()])), reverse=True))

.add_yaxis("金牌", [row['Nums'] for _, row in medals[(medals.Season=='Winter') & (medals.Medal=='Gold')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#FFD700'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("银牌", [row['Nums'] for _, row in medals[(medals.Season=='Winter') & (medals.Medal=='Silver')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#C0C0C0'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.add_yaxis("铜牌", [row['Nums'] for _, row in medals[(medals.Season=='Winter') & (medals.Medal=='Bronze')].iterrows()],

category_gap='20%',

itemstyle_opts=opts.ItemStyleOpts(

border_color='rgb(220,220,220)',

color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,

[{

offset: 0,

color: '#DAA520'

}, {

offset: 1,

color: '#FFFFF0'

}])""")))

.set_series_opts(label_opts=opts.LabelOpts(is_show=True,

position='top',

font_style='italic'))

.set_global_opts(

title_opts=opts.TitleOpts(title="美国历年奥运会获得奖牌数-冬奥会", pos_left='center'),

xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),

legend_opts=opts.LegendOpts(is_show=False),

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),

graphic_opts=[

opts.GraphicImage(

graphic_item=opts.GraphicItem(

id_="logo", right=0, top=-300, z=-10, bounding="raw", origin=[75, 75]

),

graphic_imagestyle_opts=opts.GraphicImageStyleOpts(

image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",

width=1000,

height=600,

opacity=0.6,),

)

],)

)

page = (

Page()

.add(s_bar,)

.add(w_bar,)

)

page.render_notebook()

优势项目

田径,游泳

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0.5, color: '#FFC0CB'}, {offset: 1, color: '#F0FFFF'}, {offset: 0, color: '#EE82EE'}], false)"

)

events = USA_data[USA_data.Medal=='Gold'].groupby(['Year', 'Sport'])['Event'].nunique().reset_index()

events = events.groupby(['Sport'])['Event'].sum().reset_index()

events.columns = ['Sport', 'Nums']

data_pair = [(row['Sport'], row['Nums']) for _, row in events.iterrows()]

wc = (WordCloud(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))

.add("", data_pair,word_size_range=[30, 80])

.set_global_opts(title_opts=opts.TitleOpts(title="美国获得过金牌运动项目",pos_left="center",

title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20)))

)

wc.render_notebook()

被单个国家统治的奥运会项目

很多运动长期以来一直是被某个国家统治,譬如我们熟知的中国🇨🇳的乒乓球,美国🇺🇸的篮球;

此次筛选了近5届奥运会(2000年悉尼奥运会之后)上累计产生10枚金牌以上且存在单个国家「夺金率」超过50%的项目;

俄罗斯🇷🇺包揽了2000年以后花样游泳 & 艺术体操两个项目上所有的20枚金牌;

中国🇨🇳在乒乓球项目上获得了2000年之后10枚金牌中的9枚,丢失金牌的一次是在04年雅典奥运会男单项目上;

美国🇺🇸在篮球项目上同样获得了过去10枚金牌中的9枚,丢失金牌的一次同样在04年,男篮半决赛中输给了阿根廷,最终获得铜牌;

跳水项目上,中国🇨🇳获得了过去40枚金牌中的31枚,梦之队名不虚传;

射箭项目上,韩国🇰🇷获得了过去20枚金牌中的15枚;

羽毛球项目上,中国🇨🇳获得了过去25枚金牌中的17枚;

沙滩排球项目上,美国🇺🇸获得了过去10枚金牌中的5枚;

f1 = lambda x:max(x['Event']) / sum(x['Event'])

f2 = lambda x: x.sort_values('Event', ascending=False).head(1)

t_data = data[(data.Medal=='Gold') & (data.Year>=2000) &(data.Season=='Summer')].groupby(['Year', 'Sport', 'region'])['Event'].nunique().reset_index()

t_data = t_data.groupby(['Sport', 'region'])['Event'].sum().reset_index()

t1 = t_data.groupby(['Sport']).apply(f2).reset_index(drop=True)

t2 = t_data.groupby(['Sport'])['Event'].sum().reset_index()

t_data = pd.merge(t1, t2, on='Sport', how='inner')

t_data['gold_rate'] = t_data.Event_x/ t_data.Event_y

t_data = t_data.sort_values('gold_rate', ascending=False).reset_index(drop=True)

t_data = t_data[(t_data.gold_rate>=0.5) & (t_data.Event_y>=10)]

background_color_js = (

"new echarts.graphic.LinearGradient(1, 0, 0, 1, "

"[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"

)

fn = """

function(params) {

if(params.name == '其他国家')

return '\\n\\n\\n' + params.name + ' : ' + params.value ;

return params.seriesName+ '\\n' + params.name + ' : ' + params.value;

}

"""

def new_label_opts():

return opts.LabelOpts(formatter=JsCode(fn), position="center")

pie = Pie(init_opts=opts.InitOpts(theme='dark', width='1000px', height='1000px'))

idx = 0

for _, row in t_data.iterrows():

if idx % 2 == 0:

x = 30

y = int(idx/2) * 22 + 18

else:

x = 70

y = int(idx/2) * 22 + 18

idx += 1

pos_x = str(x)+'%'

pos_y = str(y)+'%'

pie.add(

row['Sport'],

[[row['region'], row['Event_x']], ['其他国家', row['Event_y']-row['Event_x']]],

center=[pos_x, pos_y],

radius=[70, 100],

label_opts=new_label_opts(),)

pie.set_global_opts(

title_opts=opts.TitleOpts(title="被单个国家统治的项目",

subtitle='统计周期:2000年悉尼奥运会起',

pos_left="center",

title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20)),

legend_opts=opts.LegendOpts(is_show=False),

)

pie.render_notebook()

2020东京奥运会金牌分布🏅️

数据准备

import requests

import pandas as pd

data_url = 'https://app-sc.miguvideo.com/vms-livedata/olympic\

-medal/total-table/15/110000004609'

# 请求数据

data = requests.get(data_url).json()

df = pd.DataFrame()

for item in data['body']['allMedalData']:

df = df.append([[item['countryName'],

item['countryId'],

item['rank'],

item['goldMedalNum'],

item['silverMedalNum'],

item['bronzeMedalNum'],

item['totalMedalNum']]])

# 修改列名

df.columns = ['国家', '国家id', '排名', '金牌', '银牌', '铜牌', '奖牌']

# 重置索引

df.reset_index(drop=True, inplace=True)

df.head()

data_url = 'https://app-sc.miguvideo.com/\

vms-livedata/olympic-medal/detail-total/15/110000004609'

data = requests.get(data_url).json()

detail_df = pd.DataFrame()

# 请求数据

for item in data['body']['medalTableDetail']:

detail_df = detail_df.append([[item['awardTime'],

item['medalType'],

item['sportsName'],

item['countryId'],

item['bigItemName']]])

# 修改列名

detail_df.columns = ['获奖时间', '奖牌类型', '运动员', '国家id', '运动类别']

# 重置索引

detail_df.reset_index(drop=True, inplace=True)

detail_df.head()

detail_df.loc[detail_df['奖牌类型'] == 1, '奖牌类型'] = '金牌'

detail_df.loc[detail_df['奖牌类型'] == 2, '奖牌类型'] = '银牌'

detail_df.loc[detail_df['奖牌类型'] == 3, '奖牌类型'] = '铜牌'

courtry_df = df.loc[:, ['国家', '国家id']]

detail_df = pd.merge(detail_df, courtry_df, on='国家id', how = "inner")

detail_df.head()

df.to_csv('东京奥运会国家排名.csv', index=False)

detail_df.to_csv('东京奥运会获奖详情.csv', index=False)

分布图展示

data = [("United States", 113), ("China", 88), ("Japan", 58), ("United Kingdom", 65), ("United Kingdom", 65), ("Russia", 71),

("Australia", 46), ("Netherlands", 36), ("France", 33), ("Germany", 37), ("Italy", 40), ("Canada", 24),

("Brazil", 21), ("New Zealand", 20), ("Cuba", 15), ("Hungary", 20), ("South Korea", 20), ("Poland", 14),

("Czech Republic", 11), ("Kenya", 10), ("Norway", 8), ("Jamaica", 9), ("Spain", 17), ("Sweden", 9),

("Switzerland", 13), ("Denmark", 11), ("Croatia", 8), ("Iran", 7), ("Serbia", 9), ("Belgium", 7),

("Bulgaria", 6), ("Slovenia", 5), ("Uzbekistan", 5), ("Georgia", 8), ("China Taibei", 12), ("Turkey", 13),

("Greece", 4), ("Uganda", 4), ("Ecuador", 3), ("Ireland", 4), ("Israel", 4), ("Qatar", 3),

("Bahamas", 2), ("kosovo", 2), ("Ukraine", 19), ("Belarus", 7), ("Romania", 4), ("Venezuela", 4),

("India", 7), ("Hong Kong China", 6), (" Philippine Islands", 4), ("Slovakia", 4), ("South Africa", 3), ("Austria", 7),

("Egypt", 6), ("Indonesia", 5), ("Ethiopia", 4), ("Portugal", 4), ("Tunisia", 2), ("Estonia", 2),

("Fiji", 2), ("Latvia", 2), ("Thailand", 2), ("Bermuda", 1), ("Morocco", 1), ("Puerto Rico", 1),

("Columbia", 5), ("Azerbaijan", 7), ("Dominican", 5), ("Armenian", 4), ("Kyrgyzstan", 3), ("Mongolia", 4),

("Argentina", 3), ("San Marino", 3), ("Jordan", 2), ("Malaysia", 2), ("Nigeria", 2), ("Bahrain", 1),

("Lithuania", 1), ("Namibia", 1), ("Northern Macedonia", 1), ("Saudi Arabia", 1), ("Turkmenistan", 1), ("Kazakhstan", 8),

("Mexico",4 ), ("Finland", 2), ("Botswana", 1), ("burkina faso", 1), ("Ghana", 1), ("Grenada", 1),

("Côte d'Ivoire", 1), ("Kuwait", 1), ("Moldova", 1), ("Syria", 1)]

charts = (Map()

.add("奖牌",data,"world",is_map_symbol_show=False)

.set_series_opts(label_opts=opts.LabelOpts(is_show=False))

.set_global_opts(title_opts=opts.TitleOpts(title="2020东京奥运会各国金牌分布图"),

visualmap_opts=opts.VisualMapOpts(max_=120,is_piecewise=True,split_number=3)))

charts.render_notebook()