马拉松数据的探索(matplotlib)
#马拉松数据随堂练习
import json import pandas as pd import numpy as np !curl -O https://raw.githubusercontent.com/jakevdp/marathon-data/master/marathon-data.csv # 下载数据的简便方法 data=pd.read_csv("marathon-data.csv") data.head()#查看前五行
Out[4]:
In [15]:
data.shape#查看有多少行多少列
Out[15]:
In [18]:
data.dtypes#查看数据类型
Out[18]:
In [24]:
data.tail()#查看后5行
Out[24]:
In [25]:
data.index#查看索引
Out[25]:
In [26]:
data.values#查看内容
Out[26]:
In [30]:
data.columns#查看列名称
Out[30]:
In [32]:
data.info()
In [33]:
data.describe()
Out[33]:
In [76]:
data.dtypes
Out[76]:
In [2]:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings %matplotlib inline warnings.filterwarnings('ignore')
In [5]:
def convert_time(s):#批量把字符串转换成时间格式 h,m,s=map(int,s.split(":")) return pd.datetools.timedelta(hours=h,minutes=m,seconds=s)
In [6]:
data=pd.read_csv('marathon-data.csv', converters={'split':convert_time,'final':convert_time}) data.head()#在执行中多次报错,显示int无法转换,经过查看原来数据集最后一行,后三个变量为空,导致无法转换,删除之后运行正常
Out[6]:
In [6]:
data.dtypes
Out[6]:
In [7]:
def transfor_time(tt):#增加两行 把时间转换成秒,方便seaborn 画图 return tt.total_seconds() data['split_sec'] = data['split'].apply(transfor_time) data['final_sec'] = data['final'].apply(transfor_time) data.head()
Out[7]:
In [41]:
sns.jointplot("split_sec","final_sec",data=data,kind="kde")
Out[41]:
In [8]:
sns.jointplot("split_sec","final_sec",data=data,kind="hex")
Out[8]:
In [11]:
with sns.axes_style("white"):#主题风格与调色板设定 g=sns.jointplot("split_sec","final_sec",data,kind="hex") g.ax_joint.plot(np.linspace(4000,16000), np.linspace(8000,32000),":k")
In [23]:
data["split_feac"]=1-2*data["split_sec"]/data["final_sec"] data.head()#添加一列表示选手前后赛程的差异,如果差异系数小于零表示这个人是后半程加速选手
Out[23]:
In [23]:
sns.distplot(data["split_feac"],kde=False)#频次直方图 plt.axvline(0,color="r",linestyle="--")#设置分割线
Out[23]:
In [24]:
sum(data.split_feac<0)#该图表明能够做到后半程加速的选手相当的少,只有231个人
Out[24]:
In [12]:
g=sns.PairGrid(data,vars=["age","split_sec","final_sec","split_feac"],hue="gender",palette="RdBu_r") g.map(plt.scatter,alpha=0.8) g.add_legend()
Out[12]:
In [29]:
sns.kdeplot(data.split_feac[data.gender=="M"],label="men",shade=True) sns.kdeplot(data.split_feac[data.gender=="W"],label="women",shade=True) plt.xlabel("splot_frac") plt.legend()#查看男女选手后半程差异系数的分布情况,男性要多很多
Out[29]:
In [46]:
Out[46]:
In [32]:
#创建新的一列表示选手的年龄段 data["age_dec"]=data.age.map(lambda age:10*(age//10))#每10岁为一个档次 data.head()
Out[32]:
In [42]:
men=(data.gender=="M")#设置图列 women=(data.gender=="W") sns.axes_style(style=None) sns.violinplot("age_dec","split_feac",hue="gender",data=data,aplit=True,inner="quartile",palette=["lightblue","lightpink"])
Out[42]:
In [45]:
g=sns.lmplot("final_sec","split_feac",col="gender",data=data,markers=".",scatter_kws=dict(color="c")) g.map(plt.axhline,y=0.1,color="k",ls=":") plt.xlim(8000,40000) plt.ylim(-0.2,0.5)
Out[45]:
In [ ]:
import seaborn as sns #一种更画面更简洁,操作更简单的画图包 sns.kdeplot(x)#画KDE图,用于查看变量是否平滑 sns.distplot(x)#画频次直方图与KDE结合的图像 sns.jointplot(x,y,data)#画联合分布图,用于查看两两数据的相关信息 sns.pairplot(data)#画联合矩阵图,观察数据集两两间的相关性 sns.boxplot()#画箱线图,观察某个变量之间的影响情况,使用中注意 KIND 参数的使用 #详细参数参考帮助文档 sns.violinplot()#画小提琴图