文章目录

  • 任务描述
  • 相关知识
    • 时间频率与偏移量
    • 重新取样、迁移和窗口
      • 重新取样
      • 时间迁移
    • 移动时间窗口
  • 编程要求
  • 测试说明

任务描述

根据相关知识完成下列任务:

  • 求上个季度(仅含工作日)的平均值;
  • 求每个月末(仅含工作日)的收盘价;
  • 迁移数据365天;
  • 求一年期移动标准差。

相关知识

学习本关卡知识之前,建议先了解matplotlib模块基础知识。
Pandas时间序列工具的基础是时间频率或偏移量代码。就像之前见过的D(day)H(hour)代码,我们可以用这些代码设置任意需要的时间间隔。
Pandas频率代码表如下:

代码 描述
D 天(calendar day,按日历算,含双休日)
W 周(weekly) M 月末(month end)
Q 季末(quarter end)
A 年末(year end)
H 小时(hours)
T 分钟(minutes)
S 秒(seconds)
L 毫秒(milliseonds)
U 微秒(microseconds)
N 纳秒(nanoseconds)
B 天(business day,仅含工作日)
BM 月末(business month end,仅含工作日)
BQ 季末(business quarter end,仅含工作日)
BA 年末(business year end,仅含工作日)
BH 小时(business hours,工作时间)
MS 月初(month start)
BMS 月初(business month start,仅含工作日)
QS 季初(quarter start)
BQS 季初(business quarter start,仅含工作日)
AS 年初(year start)
BAS 年初(business year start,仅含工作日)

时间频率与偏移量

我们可以在频率代码后面加三位月份缩写字母来改变季、年频率的开始时间,也可以再后面加三位星期缩写字母来改变一周的开始时间:

  • Q-JANBQ-FEBQS-MARBQS-APR 等;
  • W-SUNW-MONW-TUEW-WED 等。
    时间频率组合使用:
In[0]:pd.timedelta_range(0,periods=9,freq="2H30T")
Out[0]:TimedeltaIndex(['00:00:00', '02:30:00', '05:00:00', '07:30:00', '10:00:00', '12:30:00', '15:00:00', '17:30:00', '20:00:00'], dtype='timedelta64[ns]', freq='150T')

所有这些频率代码都对应Pandas时间序列的偏移量,具体内容可以在 pd.tseries.offsets模块中找到,比如直接创建一个工作日偏移序列:

In[1]:from pandas.tseries.offsets import BDaypd.date_range('2015-07-01', periods=5, freq=BDay())
Out[1]:DatetimeIndex(['2015-07-01', '2015-07-02', '2015-07-03', '2015-07-06', '2015-07-07'], dtype='datetime64[ns]', freq='B')

重新取样、迁移和窗口

重新取样

处理时间序列数据时,经常需要按照新的频率(更高频率、更低频率)对数据进行重新取样。举个例子,首先通过pandas—datareader程序包(需要手动安装)导入Google的历史股票价格,只获取它的收盘价:

In[2]: from pandas_datareader import datagoog = data.DataReader('GOOG',start="2014",end="2016",data_source="google")['Close']   # Close表示收盘价的列
In[3]: import matplotlib.pyplot as pltimport seaborn; seaborn.set()goog.plot();   #数据可视化

输出:
我们可以通过resample()方法和asfreq()方法解决这个问题,resample()方法是以数据累计为基础,而asfreq()方法是以数据选择为基础。

In[4]: goog.plot(alpha=0.5, style='-') goog.resample('BA').mean().plot(style=':') goog.asfreq('BA').plot(style='--'); plt.legend(['input', 'resample', 'asfreq'], loc='upper left');

输出:
请注意这两种取样方法的差异:在每个数据点上,resample反映的是上一年的均值,而asfreq反映的是上一年最后一个工作日的收盘价
数据集中经常会出现缺失值,从上面的例子来看,由于周末和节假日股市休市,周末和节假日就会产生缺失值,上面介绍的两种方法默认使用的是向前取样作为缺失值处理。与前面介绍过的pd.fillna()函数类似,asfreq()有一个method参数可以设置填充缺失值的方式。

In[5]:fig, ax = plt.subplots(2, sharex=True) data = goog.iloc[:10] data.asfreq('D').plot(ax=ax[0], marker='o') data.asfreq('D', method='bfill').plot(ax=ax[1], style='-o') data.asfreq('D', method='ffill').plot(ax=ax[1], style='--o') ax[1].legend(["back-fill", "forward-fill"]);

输出:

时间迁移

另一种常用的时间序列操作是对数据按时间进行迁移,Pandas有两种解决这类问题的方法:shift()tshift()。简单来说,shift()就是迁移数据,而tshift()就是迁移索引。两种方法都是按照频率代码进行迁移。
下面我们将用shift()tshift()这两种方法让数据迁移900天:

In[6]:fig, ax = plt.subplots(3, sharey=True) # 对数据应用时间频率,用向后填充解决缺失值goog = goog.asfreq('D', method='pad') goog.plot(ax=ax[0]) goog.shift(900).plot(ax=ax[1]) goog.tshift(900).plot(ax=ax[2]) # 设置图例与标签local_max = pd.to_datetime('2007-11-05') offset = pd.Timedelta(900, 'D') ax[0].legend(['input'], loc=2) ax[0].get_xticklabels()[4].set(weight='heavy', color='red') ax[0].axvline(local_max, alpha=0.3, color='red') ax[1].legend(['shift(900)'], loc=2) ax[1].get_xticklabels()[4].set(weight='heavy', color='red') ax[1].axvline(local_max + offset, alpha=0.3, color='red') ax[2].legend(['tshift(900)'], loc=2)ax[2].get_xticklabels()[1].set(weight='heavy', color='red') ax[2].axvline(local_max + offset, alpha=0.3, color='red')

输出:

shift(900)将数据向前推进了900天,这样图形中的一段就消失了(最左侧就变成了缺失值),而tshift(900)方法是将时间索引值向前推进了900天。

移动时间窗口

Pandas处理时间序列数据的第3种操作是移动统计值。这些指标可以通过SeriesDataFrame的rolling()属性来实现,它会返回与groupby操作类似的结果,移动视图使得许多累计操作成为可能,rolling函数的具体参数可以查看其 官方文档 。

In[7]: rolling = goog.rolling(365, center=True) data = pd.DataFrame({'input': goog, 'one-year rolling_mean': rolling.mean(), 'one-year rolling_std': rolling.std()}) ax = data.plot(style=['-', '--', ':']) ax.lines[0].set_alpha(0.3)

输出:

编程要求

本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能:

  • 求上个季度(仅含工作日)的平均值;
  • 求每个月末(仅含工作日)的收盘价;
  • 迁移数据365天;
  • 求一年期移动标准差;
  • 具体要求请参见后续测试样例。

请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。
测试输入:
无测试输入
预期输出:

import matplotlib.pyplot as plt
import pandas as pddef demo():yahoo = pd.read_csv("./step3/yahoo_data.csv")yahoo.set_index(pd.to_datetime(yahoo["Date"]),inplace=True)# 取雅虎股票的收盘价yh = yahoo["Close"]fig, ax = plt.subplots(2, sharex=True)# 画出收盘价的图yh.plot(ax=ax[0], style="-")# 求上个季度(仅含工作日)的平均值# ********** Begin ********** #data1=yh.resample('BQ').mean()# ********** End ********** #data1.plot(ax=ax[0], style=":")# 求每个月末(仅含工作日)的收盘价# ********** Begin ********** #data2=yh.asfreq('BM')# ********** End ********** #data2.plot(ax=ax[0], style="--", color="red")ax[0].legend(['input', 'resample', 'asfreq'], loc='upper right')# 迁移数据365天# ********** Begin ********** #data3=yh.shift(365)# ********** End ********** #data3.plot(ax=ax[1])data3.resample("BQ").mean().plot(ax=ax[1], style=":")data3.asfreq("BM").plot(ax=ax[1], style="--", color="red")# 设置图例与标签local_max = pd.to_datetime('2007-11-05')offset = pd.Timedelta(365, 'D')ax[0].axvline(local_max, alpha=0.3, color='red')ax[1].axvline(local_max + offset, alpha=0.3, color='red')# 求一年期移动标准差# ********** Begin ********** #rolling=yh.rolling(365,center=True)data4=rolling.std()# ********** End ********** #data4.plot(ax=ax[1], style="y:")data4.plot(ax=ax[0], style="y:")plt.savefig("./step3/result/2.png")

EduCoder Pandas高效化运算与时间序列处理 第3关:Pandas时间序列的高级应用相关推荐

  1. python pandas教程百家号_python--学习笔记6 pandas

    from pandas import Series,DataFrame #注意大小写 import pandas as pd Series的字符串表现形式为:索引在左边,值在右边. 可以通过Serie ...

  2. python中的pandas的两种基本使用_python数据分析:pandas基本操作

    pandas:数据分析 pandas是一个强大的Python数据分析的工具包. pandas是基于NumPy构建的. pandas的主要功能 具备对其功能的数据结构DataFrame.Series 集 ...

  3. 深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测大气压( air pressure)+代码实战

    深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测大气压( air pressure)+代码实战 长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主 ...

  4. 深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测空气质量(PM2.5)+代码实战

    深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测空气质量(PM2.5)+代码实战 # 导入需要的包和函数: from __future__ import print_function im ...

  5. pandas 合并所有列_图解Python表格操作包Pandas

    Pandas 是 Python 的核心数据分析支持库,提供了快速.灵活.明确的数据结构,旨在简单.直观地处理关系型.标记型数据.Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工 ...

  6. pandas 对某一行标准化_Python中的神器Pandas,但是有人说Pandas慢...

    如果你从事大数据工作,用Python的Pandas库时会发现很多惊喜.Pandas在数据科学和分析领域扮演越来越重要的角色,尤其是对于从Excel和VBA转向Python的用户. 所以,对于数据科学家 ...

  7. 手把手教你学Python之Pandas(一文掌握数据分析与处理库-Pandas)

    目录 基本结构之Series Series对象的创建 Index对象介绍 Series中数据的访问 Series中常用方法 基本结构之DataFrame DataFrame的创建 ​DataFrame ...

  8. pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)

    pandas创建内容全是0的dataframe.pandas基于随机整数.随机浮点数创建dataframe(random numbers) 目录 pandas创建内容全是0的dataframe.pan ...

  9. 深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM(Long Short Term Memory Network)长短时记忆网络,是一种改进之后的循环神经网 ...

最新文章

  1. LruDiskCache要点--不可不用的磁盘缓存工具类
  2. ElasticSearch Java Api(一) -创建索引
  3. python类的应用_如何剖析python应用程序的类方法?
  4. 如何查看 Windows10 版本号
  5. 【礼仪大赛策划方案手段】 问穿正装的礼节是什么?到底何为正装?休闲正装?
  6. Bootstrap图片中加播放按钮
  7. jmeter录制脚本_jmeter(二)Badboy录制脚本
  8. java转换成kotlin语言教程_#7 Kotlin教程 | 把Java转换为Kotlin
  9. LM2596数控电路原理分析
  10. 旧手机物联网_为了能让你的智能手机用十年,他们给旧手机做了一个操作系统...
  11. 在Deepin v20系统中安装RTL8821CE无线网卡驱动的步骤
  12. 一、恒生电子面试 (校招)
  13. python求三个整数最大值_Python 输入三个整数,输出最大值
  14. 来电转接点击选择联系人按钮-没有出现联系人
  15. 2017_SIGIR_Item Silk Road: Recommending Items from Information Domains to Social Users
  16. Java语法快速学习-黑马程序员(个人整理版本)
  17. Deepin常用环境配置
  18. Mechanize使用手册
  19. WebRTC音视频之噪音消除功能
  20. 智能财务报表OCR识别系统

热门文章

  1. 百度地图根据经纬度获取该地点所在城市信息
  2. mysql将数据库表内容(表内字段/属性)导出为excel表格
  3. jenkins发送邮件添加附件
  4. 孙俪邓超港籍身份曝光揭明星卯足劲加入港籍
  5. Java基础 常见数据结构与算法 项目总结
  6. 杭州 小学计算机比赛,【2019年第二十届全国中小学电脑制作活动】,乐博乐博学员强势晋级杭州市赛!...
  7. Revit中添加水平仰视平面图及水平剖面
  8. Educational Codeforces Round 100 A—D题题解
  9. EasyUi 手机号码,邮箱,remote验证
  10. 大整数的加减乘除运算