kaggle实战之海冰面积序列的数据分析:时间序列分析(三)

本文主要为笔者学习kaggle实战项目“Daily sea ice exten data”时心得笔记,项目主要利用NSIDC提供的每日海冰面积(sea ice extent)数据进行数据分析,学习源代码为Mathew Savage:visualisation of sea-ice data,仅供交流参考。

3 时间序列分析

3.1 海冰的逐日变化

因为数据直接为每日数据,因此无需进行数据处理。通过想x-y折线图表现出逐日变化。

海冰的逐日变化.png
  • 主体figure plt.figure plt.plot
    通过plt.figure(figsize=(9,3))指定纸张大小,将两副图叠加绘制
plt.figure(figsize=(9,3))
plt.plot(north.index,north['Extent'],label="North Hemisphere")
plt.plot(south.index,south['Extent'],label="South Hemisphere")
  • 图例legend plt.legend
#add plot legend and titles
plt.legend(bbox_to_anchor=(0.,-.363,1.,.102),loc=3,ncol=2,mode="expand",borderaxespad=0)

bbox_to_anchor=(0.,-.363,1.,.102)指定锚点 (x,y,width,height)一般只用x,y
loc=3表示图标位于左下,也可以使用·loc=“lower left·”这里可以省略
ncol=2表示图标有几列,这里是两列
mode=expand {"expand", None}水平填充满坐标区域摆放
borderaxespad=0 边界与坐标轴之间的距离

  • 标题和x/y轴标签 title&label plt.title plt.xlabel plt.ylabel
plt.ylabel("Sea ice exten(10^6 sq km)")
plt.xlabel('Data')
plt.title('Daily sea ice exten')

3.2 海冰的逐年变化

海冰的逐年变化.png

3.2.1 时间序列的resample

重采样指将时间序列从一个频率转换到另外一个频率,包括downsampling(高频到低频)和upsampling(低频到高频)

resample的相关参数:
  • freq='12m','5min','Second(15)' 采样频率
  • how='mean','sum','max',‘min’,'fist','last','median' 采样方式(‘ohlc’金融计算开盘收盘最高最低的采样方式)
  • axis=0 采样的轴
  • closed=‘right’,'left' 即时间哪一段是包含的
  • label=‘right’,‘left’ 时间哪一段是标记的9:30-9:35 默认right即为9:35标记
  • loffset=None/‘-1s’ 用于聚合标签调早1秒
  • kind=None 聚合到时期‘period’或‘timestamp’,默认聚集到时间序列的索引类型
  • fill_method ffile或者bfill
  • limit=none 填充期数
    需要对数据求月平均,这里使用了north.resample即panda对象的resample方法来进行重采样
例子

各区间哪边是闭合的?如何标记哪个?
降采样 -聚合 close、label
ts.resample('5min',how='sum')

图片.png

groupby采样:ts.groupby(lambda x:x.month).mean()
ts.groupby(lambda x:x.weekday).mean()
升采样:插值!fill_method limit
df_daily=frame.resample('D',fill_method='ffill')

图片.png

3.2.2 对海冰序列进行降频处理

由‘D’转为‘12M’采样,采样方式为求平均

#resample raw data into annual averages
northyear=north.resample('12M',how='mean')
southyear=south.resample('12M',how='mean')

默认右边封闭,标记右边。因为最初和最末的数据可能会不全,因此将其删去。

#remove the initial and final itmes as they are averageed incoorrectly
northyear=northyear[1:-1]
southyear=southyear[1:-1]

3.2.2 绘图

#plot
plt.figure(figsize=(9,3))
plt.plot(northyear.Year,northyear['Extent'],marker='.',label='North hemisphere')
plt.plot(southyear.Year,southyear['Extent'],marker='.',label='South Hemisphere')
#add plot legend and title
plt.xlabel('Year')
plt.ylabel('Sea ice exten(10^6 sq km)')
plt.title('Annual average sea ice')
plt.xlim(1977,2016)
  • 通过plt.xlim 对坐标进行限制

3.3 海冰的逐月变化

海冰的逐月变化.png
#difine date range to plot between
start=1978
end=dt.datetime.now().year+1

画两幅子图使用plt.subplots,通过设置sharex共享x轴,返回f-画布控制对象,axarr图形控制对象。

#defien plot
f,axarr=plt.subplots(2,sharex=True,figsize=(9,6))

设置主坐标格标注格式axarr.xaxis.set_major_formatter(mdates.DateFormatter("%b"))
绘图时的颜色循环绘图,因此需要渐变色
axarr.set_pro_cycle(plt.cycler('color',plt.cm.winter(np.linspace(0,1,len(range(sater,end)))))

#orgnise plot axxes
month_fmt=mdates.DateFormatter("%b")
axarr[0].xaxis.set_major_formatter(month_fmt)
axarr[0].set_prop_cycle(plt.cycler('color',plt.cm.winter(np.linspace(0,1,len(range(start,end))))))
axarr[1].set_prop_cycle(plt.cycler('color',plt.cm.winter(np.linspace(0,1,len(range(start, end))))))

设置子图的图例和坐标,使用axarr.set_xlabel,axarr.set_ylabel,axarr.set_title设置坐标名和标题名
axarr.add_artist(AnchoredText())添加文本框,loc指文本框位置

#add legend and title
axarr[0].set_ylabel('Sea ice extent (10^6 sq km)')
axarr[1].set_ylabel('Sea ice extent (10^6 sq km)')
axarr[1].set_xlabel('Month')
axarr[0].set_title('Annual change in sea-ice extent');
axarr[0].add_artist(AnchoredText('Northern Hemisphere', loc=3))
axarr[1].add_artist(AnchoredText('Southern Hemisphere', loc=2))

作者绘图并不是通过计算海冰月平均来展现每月的变化。而是通过循环绘制每年的海冰变化。因此这里需要在一张图上循环绘图。为了使得绘图都在同一个坐标上,认为设定将‘Year’值都定位了1972年。不需要采样,直接绘图即可。

# loop for every year between the start year and current
for year in range(start, end):
    # create new dataframe for each year, 
    # and set the year to 1972 so all are plotted on the same axis
    nyeardf = north[['Extent', 'Day', 'Month']][north['Year'] == year]
    nyeardf['Year'] = 1972
    nyeardf['Date'] = pd.to_datetime(nyeardf[['Year','Month','Day']])
    nyeardf.index = nyeardf['Date'].values
    
    syeardf = south[['Extent', 'Day', 'Month']][south['Year'] == year]
    syeardf['Year'] = 1972
    syeardf['Date'] = pd.to_datetime(syeardf[['Year','Month','Day']])
    syeardf.index = syeardf['Date'].values
   # plot each year individually
    axarr[0].plot(nyeardf.index,nyeardf['Extent'], label = year)
    axarr[1].plot(syeardf.index,syeardf['Extent'])

3.4 小结

本章学习重点:时间序列数据的重采样,x-y轴图的绘制。

3.5 完整代码

plt.figure(figsize=(9,3))
plt.plot(north.index,north['Extent'],label="North Hemisphere")
plt.plot(south.index,south['Extent'],label="South Hemisphere")

#add plot legend and titles
#plt.legend(bbox_to_anchor=(0.,-.363,1.,.102),loc=3,ncol=2,mode="expand",borderaxespad=0)
plt.legend(bbox_to_anchor=(0.1,-0.1,0.8,0),ncol=2,mode="expand",borderaxespad=0)

plt.ylabel("Sea ice exten(10^6 sq km)")
plt.xlabel('Data')
plt.title('Daily sea ice exten')

plt.figure(figsize=(9,3))
plt.plot(north.index,north['Extent'],label="North Hemisphere")
plt.plot(south.index,south['Extent'],label="South Hemisphere")

#add plot legend and titles
#plt.legend(bbox_to_anchor=(0.,-.363,1.,.102),loc=3,ncol=2,mode="expand",borderaxespad=0)
plt.legend(bbox_to_anchor=(0.1,-0.1,0.8,0),ncol=2,mode="expand",borderaxespad=0)

plt.ylabel("Sea ice exten(10^6 sq km)")
plt.xlabel('Data')
plt.title('Daily sea ice exten')

#difine date range to plot between
start=1978
end=dt.datetime.now().year+1

#defien plot
f,axarr=plt.subplots(2,sharex=True,figsize=(9,6))

#orgnise plot axxes
month_fmt=mdates.DateFormatter("%b")
axarr[0].xaxis.set_major_formatter(month_fmt)
axarr[0].set_prop_cycle(plt.cycler('color',plt.cm.winter(np.linspace(0,1,len(range(start,end))))))
axarr[1].set_prop_cycle(plt.cycler('color',plt.cm.winter(np.linspace(0,1,len(range(start, end))))))

#add legend and title
axarr[0].set_ylabel('Sea ice extent (10^6 sq km)')
axarr[1].set_ylabel('Sea ice extent (10^6 sq km)')
axarr[1].set_xlabel('Month')
axarr[0].set_title('Annual change in sea-ice extent');
axarr[0].add_artist(AnchoredText('Northern Hemisphere', loc=3))
axarr[1].add_artist(AnchoredText('Southern Hemisphere', loc=2))

# loop for every year between the start year and current
for year in range(start, end):
  # create new dataframe for each year, 
  # and set the year to 1972 so all are plotted on the same axis
  nyeardf = north[['Extent', 'Day', 'Month']][north['Year'] == year]
  nyeardf['Year'] = 1972
  nyeardf['Date'] = pd.to_datetime(nyeardf[['Year','Month','Day']])
  nyeardf.index = nyeardf['Date'].values
  
  syeardf = south[['Extent', 'Day', 'Month']][south['Year'] == year]
  syeardf['Year'] = 1972
  syeardf['Date'] = pd.to_datetime(syeardf[['Year','Month','Day']])
  syeardf.index = syeardf['Date'].values
  
  # plot each year individually
  axarr[0].plot(nyeardf.index,nyeardf['Extent'], label = year)
  axarr[1].plot(syeardf.index,syeardf['Extent'])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容