Pandas DataFrame.rolling(~)
方法用于使用移动窗口计算统计数据。请注意,窗口只是用于计算平均值等统计数据的值序列。
参数
1.window
| int
或 offset
或 BaseIndexer
子类
移动窗口的大小。
当处理时间序列时,即当源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
| int
或 string
| optional
是否计算每列或每行的统计信息。默认情况下, axis=0
,即为每一列计算统计量。
7. closed
| string
| optional
端点是包含的还是排除的:
值 |
说明 |
---|---|
|
|
|
|
|
两个端点都包含在内。 |
|
两个端点都是互斥的。 |
默认,
-
对于基于偏移的窗口,
closed="right"
。 -
否则,
closed="both"
。
返回值
将用于计算某些统计数据的 Window
或 Rolling
对象。
例子
基本用法
考虑以下 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
相关用法
- Python Pandas DataFrame round方法用法及代码示例
- Python Pandas DataFrame rank方法用法及代码示例
- Python Pandas DataFrame rdiv方法用法及代码示例
- Python Pandas DataFrame radd方法用法及代码示例
- Python PySpark DataFrame repartition方法用法及代码示例
- Python PySpark DataFrame replace方法用法及代码示例
- Python PySpark DataFrame rdd属性用法及代码示例
- Python Pandas DataFrame reset_index方法用法及代码示例
- Python Pandas DataFrame reorder_levels方法用法及代码示例
- Python Pandas DataFrame rsub方法用法及代码示例
- Python Pandas DataFrame resample方法用法及代码示例
- Python Pandas DataFrame reindex方法用法及代码示例
- Python PySpark DataFrame randomSplit方法用法及代码示例
- Python Pandas DataFrame replace方法用法及代码示例
- Python Pandas DataFrame rpow方法用法及代码示例
- Python Pandas DataFrame rfloordiv方法用法及代码示例
- Python Pandas DataFrame rtruediv方法用法及代码示例
- Python Pandas DataFrame rename_axis方法用法及代码示例
- Python Pandas DataFrame rmod方法用法及代码示例
- Python Pandas DataFrame rmul方法用法及代码示例
- Python Pandas DataFrame rename方法用法及代码示例
- Python Pandas DataFrame empty属性用法及代码示例
- Python Pandas DataFrame pop方法用法及代码示例
- Python Pandas DataFrame nsmallest方法用法及代码示例
- Python Pandas DataFrame sample方法用法及代码示例
注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 Pandas DataFrame | rolling method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。