Pandas必备技能之“时间序列数据处理”

发布于: 雪球转发:0回复:0喜欢:3

TUSHARE 金融与技术学习兴趣小组

翻译整理 | Little monster

本期编辑 | Little monster

译者简介:北京第二外国语学院国际商务专业研一在读,目前在学习Python编程和量化投资相关知识。

作者:DataCamp

时间序列数据Time Series Data是在不同时间上收集到的数据,这类数据是按时间顺序收集到的,用于所描述现象随时间变化的情况。

时间序列分析广泛应用于计量经济学模型中,通过寻找历史数据中某一现象的发展规律,对未来进行预测。

时间序列数据作为时间序列分析的基础,学会如何对它进行巧妙地处理是非常必要的,Python中的Pandas库为我们提供了强大的时间序列数据处理的方法,本文会介绍其中常用的几个。

【工具】

Python 3

Tushare

01

时间格式转换

有时候,我们获得的原始数据并不是按照时间类型索引进行排列的,需要先进行时间格式的转换,为后续的操作和分析做准备。

这里介绍两种方法。第一种方法是用pandas.read_csv导入文件的时候,通过设置参数parse_dates和index_col,直接对日期列进行转换,并将其设置为索引。关于参数的详细解释,请查看文档【1】。

如下示例中,在没有设置参数之前,可以观察到数据集中的索引是数字0-208,'date'列的数据类型也不是日期。

设置参数parse_dates = ['date'] ,将数据类型转换成日期,再设置 index_col = 'date',将这一列用作索引,结果如下。

这时,索引变成了日期'20000101'-'2017-05-01',数据类型是datetime。

第二种方法是在已经导入数据的情况下,用pd.to_datetime()【2】将列转换成日期类型,再用 df.set_index()【3】将其设置为索引,完成转换。

以tushare.pro上面的日线行情数据为例,我们把'trade_date'列转换成日期类型,并设置成索引。

打印出前5行,效果如下。

02

时间周期转换

在完成时间格式转换之后,我们就可以进行后续的日期操作了。下面介绍一下如何对时间序列数据进行重采样resampling。

重采样指的是将时间序列从⼀个频率转换到另⼀个频率的处理过程。将⾼频率数据聚合到低频率称为降采样downsampling,如将股票的日线数据转换成周线数据,⽽将低频率数据转换到⾼频率则称为升采样upsampling,如将股票的周线数据转换成日线数据。

降采样:以日线数据转换周线数据为例。继续使用上面的tushare.pro日线行情数据,选出特定的几列。

为了方便大家观察,把这段时间的日历附在下面,'2018-07-02'正好是星期一。

转换的思路是这样的,以日历中的周进行聚合,如'20180702'-'20180708',取该周期内,日线开盘价的第一个值作为周开盘价,日线最高价的最大值作为周最高价,日线最低价的最小值作为周最低价,日线收盘价的最后一个值作为周最收盘价,日线最高价的最大值作为周最高价,日线成交量的求和作为周成交量(手),如下图黄色方框所示。

我们可以通过.resample()【4】方法实现上述操作,对DataFrame和Series都适用。其中,参数rule设置需要转换成的频率,'1W'是一周。

具体转换的代码如下,日期默认为本周的星期日,如果周期内数据不全,如'20180722'这周只有3行数据,也会按照上述方法进行转换。

升采样:以周线数据转换日线数据为例。继续使用上面刚刚转换好的周线数据,我们再试着把它转换成日线数据。先通过.resample('D').asfreq()【5】方法,将周线数据的频率转换成日线,效果如下。

结果中出现了很多空值,需要我们按照一定的方法进行填充,可以通过添加.ffill()或者.bfill()实现。

其中,.ffill()代表用前值进行填充,也就是用前面的非空值对后面的NaN值进行填充,如'20180709'-20180714' 的NaN值都等于'20180708'这一行的非空值,效果如下。

同理,.bfill()代表用后值对空值进行填充,效果如下。

03

时间窗口函数

当我们想要比较数据在相同时间窗口的不同特征和变化时,可以借助窗口函数rolling【6】进行计算。

看一个实例:计算股票收盘价的移动平均值。

调用rolling函数,通过设置参数window的值规定窗口大小,这里设置为3,并且调用.mean()方法计算窗口期为3天的均值,结果如下。

其中,'20180704'当天的平均值等于'20180702'-'20180704'三天的收盘价取平均的结果,'20180705'当天的平均值等于'20180703'-'20180705'三天的收盘价取平均的结果,以此类推。

还有一个常用的窗口函数是expanding,每增加一行数据,窗口会相应的增大。比如,我们想计算某只股票每天的累计涨跌幅,就可以调用此函数。

对列'pct_chg'调用窗口函数expanding,再调用.sum()方法求累计值。

04

总结

本文介绍了Pandas库中处理时间序列数据的几种常用方法。

在时间格式转换部分,介绍了两种将时间转化成日期类型的方法,分别是通过设置参数parse_dates和调用方法pd.to_datetime()。

接着,介绍了时间周期的转换,通过调用.resample()方法实现,包括降采样和升采样。

最后,介绍两个常用的窗口函数rolling和expanding。

希望大家能灵活掌握本文中提到的方法,并应用到实际工作和学习中去!

END

更多内容请关注“挖地兔”公众号。

网页链接【1】

网页链接【2】

网页链接【3】

网页链接【4】

网页链接【5】

网页链接【6】

网页链接【7】

网页链接【Datacamp】

基于Neo4j和Tushare数据构建小型金融知识图谱

Python+SQL无敌组合,值得你Pick!

利用Python创建不同资产组合的基本框架

如何正确使用Pandas库提升项目的运行速度?

这些方法解决了数据清洗80%的工作量

利用Python玩转PDF,简单实用