前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python时间序列处理神器:Rolling 对象,3分钟入门 | 原创

Python时间序列处理神器:Rolling 对象,3分钟入门 | 原创

作者头像
double
发布2019-09-18 15:51:16
7.2K0
发布2019-09-18 15:51:16
举报
文章被收录于专栏:算法channel算法channel

第三期:文末留言送书

Window

Rolling 对象在处理时间序列的数据时,应用广泛,在Python中Pandas包实现了对这类数据的处理。

Rolling 对象通过调用 pandas.DataFrame.rolling(), pandas.Series.rolling() 等生成。Expanding 对象通过调用 pandas.DataFrame.expanding()pandas.Series.expanding()等生成。EWM( Exponentially-weighted moving) 对象通过调用 pandas.DataFrame.ewm()pandas.Series.ewm()生成。

Rolling

原型为:

代码语言:javascript
复制
DataFrame.rolling(self, window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)

参数意义如下: window : 取值为 int, 或时间相关 offset类型

移动窗口的宽度,是指用于统计计算的观察值的个数。取值为int 时,每一个窗口宽度是固定的。

如果window 取值为offset,则表示每个窗口的时间周期,此时每个窗口的宽度随着窗口内的观测值变化。仅当index 为datetimelike 时,这个参数才起作用,并且是在0.19.0版本才有的参数。

min_periods : 最小周期数,类型 int,默认为 None. 窗内要求有值(非NaN)的观测值个数. 如果是取值为offset 的window,min_periods默认为1,否则min_periods 默认值为窗口的宽度。

center : bool 类型, 默认为 False 设置标签是否在窗口中心

win_type : str 类型 , 默认为 None 设置窗口的类型,如果为None, 所有点的权重一致,详细可参考接下来的信息。

on : str 类型, 可选项 对于DataFrame来说,设置时间类型的列来计算rolling 窗口, 而不是基于DataFrame 的index. 此时,整数列将不会出现在结果中,因为此时整数列未被作为rolling 窗口来计算。

axis : int 或 str 类型, 默认为 0

closed : str 类型, 默认为 None 控制窗口区间端点的闭合情况,取值为right(仅包括右端点), left(仅包括左端点), both(都不包括) 或者都包括端点。对于基于offset的窗口,默认只包括右端点。对于固定窗口,取值为both,其他情况暂未实现。

此属性第一次出现在 0.20.0 版本

返回值 返回一个用于特定操作的窗口或Rolling子类对象

例子

构造一个DataFrame,

代码语言:javascript
复制
In [19]: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})

In [20]: df
Out[20]:
     B
0  0.0
1  1.0
2  2.0
3  NaN
4  4.0

窗口宽口为2,第一个窗口的右端点与第一个元素对齐,然后对每个窗口内的元素求和。

代码语言:javascript
复制
In [21]: df.rolling(2).sum()
Out[21]:
     B
0  NaN
1  1.0
2  3.0
3  NaN
4  NaN

因为索引基于int,所以closed参数取值为both,即两个端点都包括,所以得到如上分析结果。

设置窗内最小非NaN元素个数:min_periods,如果设置为1就意味着窗内如果至少1个为非NaN值,则取值不会为NaN.

代码语言:javascript
复制
df.rolling(2, min_periods=1).sum()
     B
0  0.0
1  1.0
2  3.0
3  2.0
4  4.0

设置索引为时间类型,观察它与整数索引在closed参数上的不同。

代码语言:javascript
复制
In [23]: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]},
    ...: ...                   index = [pd.Timestamp('20130101 09:00:00'),
    ...: ...                            pd.Timestamp('20130101 09:00:02'),
    ...: ...                            pd.Timestamp('20130101 09:00:03'),
    ...: ...                            pd.Timestamp('20130101 09:00:05'),
    ...: ...                            pd.Timestamp('20130101 09:00:06')])

In [24]: df
Out[24]:
                       B
2013-01-01 09:00:00  0.0
2013-01-01 09:00:02  1.0
2013-01-01 09:00:03  2.0
2013-01-01 09:00:05  NaN
2013-01-01 09:00:06  4.0

每隔4秒截取一个时间窗,然后窗内元素的和,值得注意的是

代码语言:javascript
复制
In [27]: df.rolling('4s').sum()
Out[27]:
                       B
2013-01-01 09:00:00  0.0
2013-01-01 09:00:02  1.0
2013-01-01 09:00:03  3.0
2013-01-01 09:00:05  3.0
2013-01-01 09:00:06  6.0

对于基于offset的窗口,默认只包括右端点,比如09:00:05秒时,时间窗的取值:(01, 05],求和为3.

以上就是rolling 函数的一个基本介绍,rolling函数在处理时间序列,尤其是预测领域有广泛的应用价值,它能帮助我们把曲线调整的更加平滑等。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Window
    • Rolling
      • 例子
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档