当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Pandas DataFrame rolling方法用法及代码示例


Pandas DataFrame.rolling(~) 方法用于使用移动窗口计算统计数据。请注意,窗口只是用于计算平均值等统计数据的值序列。

参数

1.window | intoffsetBaseIndexer 子类

移动窗口的大小。

当处理时间序列时,即当源DataFrame的索引为 DatetimeIndex 时,offset表示每个窗口的时间间隔。

2. min_periods | int | optional

窗口中值的最小数量。如果窗口包含少于 min_periods 的观测值,则返回 NaN 作为该窗口的计算统计量。默认值取决于以下因子:

  • 如果窗口是基于偏移的,则 min_periods=1

  • 否则,min_periods=window

3. center | boolean | optional

  • 如果 True ,则观察值设置为窗口的中心。

  • 如果 False ,则观察值设置在窗口的右侧。

默认情况下,center=False 。请参阅下面的示例以进行说明。

4. win_type | string | optional

窗口的类型(例如boxvar,triang)。欲了解更多信息,请咨询官方文档open_in_new.

5. on | string | optional

使用 datetime-like 列的标签代替 DatetimeIndex ,这仅在处理时间序列时相关。

6. axis | intstring | optional

是否计算每列或每行的统计信息。默认情况下, axis=0 ,即为每一列计算统计量。

7. closed | string | optional

端点是包含的还是排除的:

说明

"left"

  • 包含左端点。

  • 右端点是独占的。

"right"

  • 左端点是独占的。

  • 右端点包含在内。

"both"

两个端点都包含在内。

"neither"

两个端点都是互斥的。

默认,

  • 对于基于偏移的窗口,closed="right"

  • 否则,closed="both"

返回值

将用于计算某些统计数据的 WindowRolling 对象。

例子

基本用法

考虑以下 DataFrame :

df = pd.DataFrame({"A":[2,4,8,10],"B":[4,5,6,7]}, index=["a","b","c","d"])
df



   A  B
a  2  4
b  4  5
c  8  6
d  10  7

要使用大小为 2 的移动窗口计算值的总和:

df.rolling(window=2).sum()



   A     B
a  NaN   NaN
b  6.0   9.0
c  12.0  11.0
d  18.0  13.0

在此,请注意以下事项:

  • 由于axis=0(默认),我们正在计算每列的统计数据(总和)。

  • window=2 表示使用两个连续观测值计算总和:

    • 我们在第一列中得到 6.0 因为 2+4=6

    • 我们得到 12.0 因为 4+8=12

    • 我们得到 18.0 因为 8+10=18

  • 我们在第一行得到 NaN,因为在窗口不是基于偏移的情况下,min_periods 等于我们为 window 指定的值。这意味着计算统计数据所需的最小观测数为 2 ,但对于第一行,窗口中只有一个数字,因此返回 NaN

指定中心

考虑以下 DataFrame :

df = pd.DataFrame({"A":[2,4,8,10]}, index=["a","b","c","d"])
df



   A
a  2
b  4
c  8
d  10

默认情况下, center=False ,这意味着窗口不会以观察为中心:

df.rolling(window=3, min_periods=0).sum()   # center=False



   A
a  2.0
b  6.0
c  14.0
d  22.0

这里,数字的计算方式如下:

A[a]: 2 = 2
A[b]: 2 + 4 = 6 # the observation is 4 (see how 4 is right-aligned)
A[c]: 2 + 4 + 8 = 14 # the observation is 8
A[d]: 4 + 8 + 10 = 22 # the observation is 10

将此与 center=True 的输出进行比较:

df.rolling(window=3, min_periods=0, center=True).sum()



   A
a  6.0
b  14.0
c  22.0
d  18.0

这里,数字的计算方式如下:

A[a]: 2 + 4 = 6
A[b]: 2 + 4 + 8 = 14 # the observation is 4 (see how 4 is centered here)
A[c]: 4 + 8 + 10 = 22 # the observation is 8
A[d]: 8 + 10 = 18

时间序列案例

考虑以下时间序列 DataFrame:

idx = [pd.Timestamp('20201220 15:00:00'),
       pd.Timestamp('20201220 15:00:01'),
       pd.Timestamp('20201220 15:00:02'),
       pd.Timestamp('20201220 15:00:04'),
       pd.Timestamp('20201220 15:00:05')]
df = pd.DataFrame({"A":[1,10,100,1000,10000]}, index=idx)
df



                     A
2020-12-20 15:00:00  1
2020-12-20 15:00:01  10
2020-12-20 15:00:02  100
2020-12-20 15:00:04  1000
2020-12-20 15:00:05  10000

对周期为 2 秒的窗口求和:

df.rolling(window="2S").sum()



                     A
2020-12-20 15:00:00  1.0
2020-12-20 15:00:01  11.0
2020-12-20 15:00:02  110.0
2020-12-20 15:00:04  1000.0
2020-12-20 15:00:05  11000.0

请注意,由于窗口是基于偏移量的,因此默认情况下为min_periods=1

您可以指定 closed 参数来指示端点是否应包含/排除:

df.rolling(window="2S", closed="both").sum()   # both endpoints are inclusive



                     A
2020-12-20 15:00:00  1.0
2020-12-20 15:00:01  11.0
2020-12-20 15:00:02  111.0
2020-12-20 15:00:04  1100.0
2020-12-20 15:00:05  11000.0

相关用法


注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 Pandas DataFrame | rolling method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。