最近在准备 pandas 专栏的工程化内容,其中用到一份奥运数据的探索分析。这里会截取一些技巧内容让大家参考学习,包括:
完整的分析过程,包括如何组织代码,把一些固定参数和逻辑外置在 Excel上等高级技巧,请关注专栏相关章节。
导入这些库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.figsize'] = [16,10]
plt.rcParams['figure.dpi'] = 140
plt.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
首先创建一些常用函数:
# 对列比例
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)
但是,奥运是世界规模最大的综合性运动会,那么必然不会忽视男女平等问题。
看看历届奥运的男女比例:
(
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)
)
关于项目时间相关探索就不在本文展开
我们自然关注中国队的情况:
(
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 年中国队的参与项目,以及项目的男女比例:
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)
)
奥运东道主有一些"福利",受关注的项目可以直接晋级正赛,比如足球
但是,再看看最近的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年奥运数据一出来,马上就能知道