一、数据概览
背景描述
该数据集整理了从1896年雅典奥运会至2016年里约热内卢奥运会120年的奥林匹克运动会的历史数据。
需要注意的是,在1896年-1992年期间,冬季奥运会与夏季奥运会都是在同一年举行的。在这之后,冬季与夏季的奥运会才被错开举办,冬季奥运会从1994年开始4年举办一次,夏季奥运会从1996开始4年举办一次。大家在分析这些数据时,经常会犯得一个错误就是认为夏季与冬季奥运会是一直错开举办的。
受疫情影响,2020东京奥运会将延期至2021年举行;虽然延期,但此次奥运会依旧会沿用「2020东京奥运会」这个名称;
这也将是奥运会历史上首次延期(1916年、1940年、1944年曾因一战,二战停办);
数据说明
文件列表 该数据集包含两个文件:athlete_events.csv :参赛运动员基本生物数据和奖牌结果
noc_regions.csv : 国家奥委会3个字母的代码与对应国家信息
属性描述
文件athlete_events.csv中包含15个字段,具体信息如下:
每一行代表的是一个参加个人比赛运动员
No 属性 数据类型 字段描述
1 ID Integer 给每个运动员的唯一ID
2 Name String 运动员名字
3 Sex Integer 性别
4 Age Float 年龄
5 Height Float 身高
6 Weight Float 体重
7 Team String 所代表的国家队
8 NOC String 国家奥委会3个字母的代码
9 Games String 年份与季节
10 Year Integer 比赛年份
11 Season String 比赛季节
12 City String 举办城市
13 Sport String 运动类别
14 Event String 比赛项目
15 Medal Sring 奖牌
文件noc_regions.csv中包含3个字段,具体信息如下:
No
属性
数据类型
字段描述
1
NOC
String
国家奥委会3个字母的代码
2
Region
String
国家
3
Notes
String
地区
数据来源
数据集源自于kaggle平台用户分享,基于证书 CC0: Public Domain 发布,具体信息内容源自Sports Reference。
二、数据集可探索、研究的方向
可以从以下几个方面来探索奥林匹克运动会的演变历程:
- 历年来 男女参赛运动员的表现如何?
- 那不同地区?
- 不同运动项目?
- 不同比赛项目?
三、可视化分析
1.各国累计奖牌数
import pandas as pdfrom pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
athlete_data = pd.read_csv('./data/athlete_events.csv')
noc_region = pd.read_csv('./data/noc_regions.csv')
# 关联代表国家
data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
print(data.head())
medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
medal_data = medal_data.sort_values(by="Year", ascending=True)
def medal_stat(year, season='Summer'):
t_data = medal_data[(medal_data['Year'] <= year) & (medal_data['Season'] == season)]
t_data = t_data.groupby(['region', 'Medal'])['Nums'].sum().reset_index()
t_data = t_data.set_index(['region', 'Medal']).unstack().reset_index().fillna(0, inplace=False)
t_data = sorted(
[(row['region'][0], int(row['Nums']['Gold']), int(row['Nums']['Silver']), int(row['Nums']['Bronze']))
for _, row in t_data.iterrows()], key=lambda x: x[1] + x[2] + x[3], reverse=True)[:20]
return t_data
year_list = sorted(list(set(medal_data['Year'].to_list())), reverse=True)
tl = Timeline(init_opts=opts.InitOpts(theme='dark', width='1000px', height='1000px'))
tl.add_schema(is_timeline_show=True, is_rewind_play=True, is_inverse=False,
label_opts=opts.LabelOpts(is_show=False))
for year in year_list:
t_data = medal_stat(year)[::-1]
bar = (
Bar(init_opts=opts.InitOpts())
.add_xaxis([x[0] for x in t_data])
.add_yaxis("铜牌