失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python北京奥运会_Python分析奥运会1历史 谁才是奥运历史的王者?

python北京奥运会_Python分析奥运会1历史 谁才是奥运历史的王者?

时间:2022-02-05 12:16:58

相关推荐

python北京奥运会_Python分析奥运会1历史 谁才是奥运历史的王者?

主要探索分析奥运会的热门体育项目、得金牌数最多的国家,夏季冬季不同性别的参赛运动员的年龄,以及中国的在奥运会上的表现等问题。

项目链接,欢迎一键fork运行

目录

1. 导入包+基本的数据处理

2. 生成奥运会运动项目的词云(Word Cloud)

3. 查看参赛者的男女基本信息

3.1. 1来参赛者的男女比例

3.2. 查看参赛者的男性与女性的年龄分布

3.3. 查看1896-男女参赛者的平均年龄变化

3.4. 查看1来 夏季 奥运会获奖运动员不同性别的平均年龄变化

3.5. 查看1来❄️冬季❄️奥运会获奖运动员不同性别的平均年龄变化

4. 在1来Top 20 得金牌最多的国家

5. 最热门 的体育项目

6. 中国 奥运会Performance

6.1. 中国历届奥运会运动员获得奖牌人数

6.2. Top 10 中国 的强项运动项目

1. 导入包+基本的数据处理

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from plotly.offline import iplot

from plotly.graph_objs import *

import colorlover as cl

import seaborn as sns

color = sns.color_palette()

f_p = '/home/kesci/input/olympic/athlete_events.csv'

athlete_events = pd.read_csv(f_p)

#查看dataframe的前四行数数据

athlete_events.head(4)

athlete_events.index.size

#查看数据中各个字段的空值的个数

athlete_events.isnull().sum()

#查看列名及其数值类型

athlete_events.info()

athlete_events.describe()

信息中显示历届奥运会的运动员平均年龄在25-26岁,平均身高175cm,平均体重70.7kg

2. 生成奥运会运动项目的词云(Word Cloud)

kindsport = set()

for m in athlete_events.Sport:

kindsport.update(g for g in m.split('\n'))

print(kindsport)

from wordcloud import WordCloud

wc = WordCloud(

background_color='white',

width=1200,

height=700,

max_words=3000,

random_state=200,

min_font_size=35,

max_font_size=80

)

wc.generate(",".join(kindsport))

plt.imshow(wc, interpolation="bilinear")

plt.axis("off")

plt.show()

3. 查看参赛者的男女基本信息

3.1 1来参赛者的男女比例

fig = {

"data":[{

"values":athlete_events['Sex'].value_counts(),

"labels":['男性','女性',],

"marker":{'colors':cl.scales['4']['div']['PuOr']},

"name":"参赛者的男女比例",

"hoverinfo":"label+percent+name",

"hole":.4,

"type":"pie"

}],"layout":{"title":"参赛者的男女比例"}

}

iplot(fig,filename='donut')

3.2 查看参赛者的男性与女性的年龄分布

y_f = athlete_events[athlete_events['Sex'] == 'F'].Age

y_m = athlete_events[athlete_events['Sex'] == 'M'].Age

trace_0 = Box(y = y_m,name="男性年龄分布")

trace_1 = Box(y = y_f,name="女性年龄分布")

data = [trace_0,trace_1]

layout = Layout(title = '参赛者不同性别的年龄分布')

fig = Figure(data = data,layout = layout)

iplot(fig)

将光标置于图中的年龄分布,可以看到

男性年龄中数是25岁,最小年龄为10岁,最大年龄是97岁(厉害了我的哥),上限年龄是39岁,下限年龄是12岁

女性年龄中数是23岁,最小年龄为11岁,最大年龄为74岁,上限年龄是37岁,下限年龄是11岁

超出上限与下限的在箱线图中都视为异常值,男性与女性的年龄异常值都集中在较大值一侧,毕竟小于10岁就要出道那怕是要从妈妈肚子里开始练吧。

3.3. 查看1896-男女参赛者的平均年龄变化

year_mean_age_f = athlete_events[athlete_events['Sex'] == 'F'].groupby(by = ['Year']).Age.agg('mean').reset_index(name = "average_age")

year_mean_age_m = athlete_events[athlete_events['Sex'] == 'M'].groupby(by = ['Year']).Age.agg('mean').reset_index(name = "average_age")

y_age_f = year_mean_age_f.average_age

y_age_m = year_mean_age_m.average_age

time_f = year_mean_age_f.Year

time_m = year_mean_age_m.Year

trace1 = Scatter(x = time_f,y = y_age_f)

trace2 = Scatter(x = time_m,y = y_age_m)

data = [trace1, trace2]

layout = Layout(title = '历年男性女性参赛选手的平均年龄变化')

fig = Figure(data = data,layout = layout)

iplot(fig)

3.4. 查看1来 夏季 奥运会获奖运动员不同性别的平均年龄变化

year_medal_age_f = athlete_events[(athlete_events.Season == 'Summer')

& (athlete_events['Sex'] == 'F')

& (athlete_events['Medal'].notnull())

].groupby(by = ['Year']).Age.agg('mean').reset_index(name = "average_age")

year_meadl_age_m = athlete_events[(athlete_events.Season == 'Summer')

& (athlete_events['Sex'] == 'M')

& (athlete_events['Medal'].notnull())

].groupby(by = ['Year']).Age.agg('mean').reset_index(name = "average_age")

trace0 = Scatter(x = year_medal_age_f.Year,y = year_medal_age_f.average_age,name = "获奖女性")

trace1 = Scatter(x = year_meadl_age_m.Year,y = year_meadl_age_m.average_age,name = "获奖男性")

data = [trace0, trace1]

layout = Layout(title = '历年夏季 奥运会获得奖牌的男性女性参赛选手的平均年龄变化')

fig = Figure(data = data,layout = layout)

iplot(fig)

获奖男性运动员的平均年龄普遍比获奖女性运动员的平均年龄大,但在近年来,年龄差距在不断缩小。

同理冬季

4. 在1来Top 20 得金牌最多的国家

# 根据奖牌类型分组,分别计算每个国家的不同奖牌数并给予这列数值'Medal_Count'的列名。

country_medal = athlete_events.groupby(by = ['Medal']).Team.value_counts().reset_index(name = 'Medal_Count')

# 筛选出金牌类型的df,根据字段Medal_Count降序排列国家,选出前20个记录。

top20_country_medal = country_medal[country_medal.Medal == 'Gold'].sort_values(by = ['Medal_Count'],ascending=False).head(20)

trace = Bar(x = top20_country_medal.Team,y = top20_country_medal.Medal_Count,marker = dict(color = cl.scales['11']['div']['PuOr'],reversescale = True))

layout = Layout(title = 'Top 20 的金牌数 最多的国家')

data = [trace]

fig = Figure(data = data,layout = layout)

iplot(fig)

5. 最热门 的体育项目

sports = athlete_events.Sport.value_counts()

trace = Bar(x = sports.index,y = sports.values,marker = dict(color = cl.scales['11']['div']['RdYlBu'],reversescale = True))

layout = Layout(title = "最热门的体育项目")

fig = Figure(data = [trace], layout = layout)

iplot(fig)

由上图可知:田径、体操、游泳 是最热门的三项体育项目。

6. 中国奥运会Performance

china = athlete_events[athlete_events.Team == 'China']

all_medal = china[china.Medal.isin(['Gold','Silver','Bronze'])]

print('获奖运动员人数:{}。'.format(all_medal[all_medal.Year == ].shape[0]))

6.1. 中国历届奥运会运动员获得奖牌人数

一直到1992年,冬季奥运会与夏季奥运会都是在同一年举行的。冬季奥运会是从1994年开始4年举办一次,夏季奥运会是从1996开始4年举办一次。所以在下面的柱状图 中,1992年及之前的金牌人数数据都是在一个柱状图中。

在1996年的第一次夏季奥运会上,中国队有66人获得了银牌 ,也是这么多年以来银牌获得人数最多的一届。在近几届的夏季奥运会上,中国表现的都很不错。尤其在夏季北京奥运会,中国共有170名运动员获得了奖牌,其中有72人获得了金牌,49人获得了银牌、49人获得了铜牌。

china = athlete_events[athlete_events.Team == 'China']

china_medal = china.groupby(by = 'Year').Medal.value_counts().reset_index(name = "medal_count")

y0 = china_medal[china_medal.Medal == 'Gold'].medal_count

x0 = china_medal[china_medal.Medal == 'Gold'].Year

y1 = china_medal[china_medal.Medal == 'Silver'].medal_count

x1 = china_medal[china_medal.Medal == 'Silver'].Year

y2 = china_medal[china_medal.Medal == 'Bronze'].medal_count

x2 = china_medal[china_medal.Medal == 'Bronze'].Year

x = china_medal.Year

trace0 = Bar(

x = x0,

y = y0,

name = 'Gold',

text = y0,

textposition = 'auto',

marker=dict(

color='gold',

line=dict(

color='rgb(8,48,107)',

width=1.5),

),

opacity=0.6

)

trace1 = Bar(

x = x1,

y = y1,

name = 'Silver',

text = y1,

textposition = 'auto',

marker=dict(

color = 'silver',

line=dict(

color='rgb(8,48,107)',

width=1.5),

),

opacity=0.6

)

trace2 = Bar(

x = x2,

y = y2,

name = 'Bronze',

text = y2,

textposition = 'auto',

marker=dict(

color='olive',

line=dict(

color='rgb(8,48,107)',

width=1.5),

),

opacity=0.6

)

data = [trace0, trace1, trace2]

layout = Layout(

barmode='group',

width=800,

hovermode='closest',

title = '中国历届奥运会运动员获得 金牌 银牌 铜牌 的人数'

)

fig = Figure(data = data, layout = layout)

iplot(fig)

6.2. Top 10 中国的强项运动项目

# 选出中国金牌数据

china_gold = china[china.Medal == 'Gold']

# 将金牌字段值映射到1

china_gold.Medal = china_gold.Medal.map({'Gold' : 1})

#查看前四行数据

china_gold.head(4)

# 根据运动项目group,分别计算group内的值之合

china_sports = china_gold.groupby(by = 'Sport',as_index=False).Medal.agg('sum')

# 按从大到小的顺序排序

china_sports = china_sports.sort_values(['Medal'], ascending= False)

# 选出前10的运动项目

top10_china_sports = china_sports.head(10)

# 定义颜色盘

colors = ['#91BBF4', '#91F4F4', '#F79981', '#F7E781', '#C0F781','rgb(32,155,160)', 'rgb(253,93,124)', 'rgb(28,119,139)', 'rgb(182,231,235)', 'rgb(35,154,160)']

n_phase = top10_china_sports.Sport.shape[0]

plot_width = 200 # 绘制宽度

section_h = 100 # section的高度

section_d = 15 # sections之间的间隔

# 用来计算其他section的宽度的乘系数

unit_width = plot_width / max(top10_china_sports['Medal']) # 200 / 56 = 3.57

# 每个漏斗部分相对于绘图宽度的宽度

phase_w = [int(v * unit_width) for v in top10_china_sports['Medal']]

# 绘制图的总高度

height = section_h * n_phase + section_d * (n_phase - 1)

shapes = [] # 列表存储所有的绘制形状

label_y = [] # 列表存储每个section的name、value文本的Y轴地址

for i in range(n_phase):

if(i == n_phase - 1):

points = [phase_w[i] / 2, height, phase_w[i] / 2, height - section_h]

else:

points = [phase_w[i] / 2, height, phase_w[i+1] / 2, height - section_h]

path = 'M {0} {1} L {2} {3} L -{2} {3} L -{0} {1} Z'.format(*points)

shape = {'type': 'path','path': path,'fillcolor': colors[i],'line': {'width': 1,'color': colors[i]}}

shapes.append(shape)

# Y-axis location for this section's details (text)

label_y.append(height - (section_h / 2))

height = height - (section_h + section_d)

label_trace = Scatter(

x=[-200]*n_phase,

y=label_y,

mode='text',

text= top10_china_sports['Sport'],

textfont=dict(

color='rgb(200,200,200)',

size=15

)

)

# For phase values

value_trace = Scatter(

x=[-350]*n_phase,

y=label_y,

mode='text',

text=top10_china_sports['Medal'],

textfont=dict(

color='rgb(200,200,200)',

size=12

)

)

data = [label_trace, value_trace]

layout = Layout(

title="Top 10 中国 的强项运动项目",

titlefont=dict(

size=12,

color='rgb(203,203,203)'

),

shapes=shapes,

height=600,

width=800,

showlegend=False,

paper_bgcolor='rgba(44,58,71,1)',

plot_bgcolor='rgba(44,58,71,1)',

xaxis=dict(

showticklabels=False,

zeroline=False,

),

yaxis=dict(

showticklabels=False,

zeroline=False

)

)

fig = Figure(data=data, layout=layout)

iplot(fig)

根据中国的金牌数最多的排名前十的运动项目来看,中国的强项项目主要是跳水、体操、排球、举重、乒乓球、射击、游泳、短道速度滑冰、柔道、田径运动。

如果觉得《python北京奥运会_Python分析奥运会1历史 谁才是奥运历史的王者?》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。