此系列文章收录在公众号中:数据大宇宙 > pandas专辑
转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的)
前言最近在准备 pandas 专栏的工程化内容,其中用到一份奥运数据的探索分析。这里会截取一些技巧内容让大家参考学习,包括:
怎么找出每个项目首次出现在奥运的时间哪些项目被取消?在哪一届被取消有没有项目被取消之后,又重新纳入奥运项目………………完整的分析过程,包括如何组织代码,把一些固定参数和逻辑外置在 Excel上等高级技巧,请关注专栏相关章节。
导入这些库:
import pandas as pdimport numpy as npimport matplotlib.pyplot as plt%matplotlib inlineplt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.rcParams['figure.figsize'] = [16,10]plt.rcParams['figure.dpi'] = 140plt.rcParams['font.size'] = 20数据是从 kaggle 上下载的 csv 文件,此外为了方便阅读,数据中的项目与国家已自动化翻译成中文(google翻译):
df = pd.read_csv('athlete_events.csv')df_trans = pd.read_excel('中英文.xlsx',sheet_name=None)sport_trans = df_trans['Sport'].set_index('en')['cn']noc_trans = df_trans['Noc'].set_index('en')['cn']df['Sport_cn'] = df['Sport'].map(sport_trans)df['NOC_region'] = df['NOC'].map(noc_trans)df每一行表示一个运动员的记录,包括姓名、性别,国家、参与年份,项目(Sport),拿到的奖项(Medal)数据记录年份截止到2016年奥运(包含2016年数据)首先创建一些常用函数:
# 对列比例def cal_percent(col:pd.Series): return col/col.sum()# 对表格每一行求比例def cal_percent_byrow(data:pd.DataFrame): return data.div(data.sum(axis=1),axis=0)# 柱状图def plot_bar(data,**kws): data.plot.bar(**kws) # 条形图def plot_barh(data,**kws): data.plot.barh(**kws)整体性别比例看看整体情况:
df['Sex'].value_counts().pipe(cal_percent).pipe(plot_bar)意料之中,男性比例高达70%但是,奥运是世界规模最大的综合性运动会,那么必然不会忽视男女平等问题。
看看历届奥运的男女比例:
( df.pivot_table(index='Year', columns='Sex', aggfunc='size', fill_value=0) .pipe(cal_percent_byrow) .sort_values('Year',ascending=False) .pipe(plot_barh,stacked=True))可以看到整体走势趋于男女比例均等其实,奥运项目的增减都会影响男女比例,不妨看看各个项目的男女比例:
kws = {'figsize':[16,25]}( df.pivot_table(index='Sport_cn', columns='Sex', aggfunc='size', fill_value=0) .pipe(cal_percent_byrow) .sort_values('M',ascending=True) .pipe(plot_barh,stacked=True,**kws))行1:因为项目较多,如果图表高度不够,会使得图中内容压缩,导致y轴内容重叠注意,有些项目只是短暂出现在很久以前的奥运会上关于项目时间相关探索就不在本文展开
中国队的情况我们自然关注中国队的情况:
( df.query("NOC_region=='中国' and Year>=2000 and Season=='Summer'") .pivot_table(index='Year', columns='Sex', aggfunc='size', fill_value=0) .pipe(cal_percent_byrow) .sort_values('Year',ascending=False) .pipe(plot_barh,stacked=True))除开 2008 年北京奥运会是男子占比略高于女子,其他年份都是女子比例更高为什么呢?
不妨看看 2008 年中国队的参与项目,以及项目的男女比例:
kws = {'figsize':[16,40]}( df.query("NOC_region=='中国' and Season=='Summer' and Year==2008") .pivot_table(index='Sport_cn', columns='Sex', aggfunc='size', fill_value=0) .pipe(cal_percent_byrow) .sort_values('M',ascending=False) .pipe(plot_barh,stacked=True,**kws))注意3大球类项目(足球、篮球、排球)都有男子项目奥运东道主有一些"福利",受关注的项目可以直接晋级正赛,比如足球
但是,再看看最近的2016年的情况:
kws = {'figsize':[16,40]}( df.query("NOC_region=='中国' and Season=='Summer' and Year==2008") .pivot_table(index='Sport_cn', columns='Sex', aggfunc='size', fill_value=0) .pipe(cal_percent_byrow) .sort_values('M',ascending=False) .pipe(plot_barh,stacked=True,**kws))可以看到,足球和排球项目,中国队的男子队都无法参与奥运此外,水球、网球这些小球项目中,中国队的男子队也退步了此时2020年东京奥运如火如荼进行中,你觉得中国队经过4年的时间,这些项目能有所进步吗?
等2020年奥运数据一出来,马上就能知道
下次再分享基于每个项目的探索,如果对你有帮助,请点赞转发支持!!
如果需要相关数据,请私信"数据"