python pandas移动窗口函数rolling的用法

1. 简介

在数据分析和处理过程中,经常需要对时间序列数据或具有一定行列关系的数据进行滑动窗口处理,以得到数据的局部特征或统计量,这时就可以使用pandas中提供的rolling函数。

rolling函数的作用是返回一个滑动窗口对象,通过对该对象调用一定的函数和方法,可以实现数据滑动窗口处理。rolling函数广泛应用于数据清洗、数据处理和数据分析等领域。

2. rolling函数的参数

rolling函数的参数非常灵活,可根据具体的需求进行设置。下面列出rolling函数的主要参数:

2.1 window

指定计算滑动窗口的大小,可以直接输入整数表示窗口大小,也可以用字符串表示rolling函数的类型和窗口大小。rolling函数支持以下方式:

'2D':表示2天的窗口(对应2 * 24 * 60 * 60秒的时间窗口)

'3H':表示3小时的窗口(对应3 * 60 * 60秒的时间窗口)

'10T':表示10分钟的窗口(对应10 * 60秒的时间窗口)

2:表示2个元素的窗口

需要注意的是,窗口大小必须小于或等于数据的长度。

2.2 min_periods

指定最小的非NaN值的数量,当滑动窗口中非NaN值的数量少于min_periods时,rolling计算的结果为NaN。

2.3 center

指定滑动窗口是否位于时间序列数据的中心。当center=True时,滑动窗口的下标为中心点的值;当center=False时,滑动窗口的下标为起始点的值。

2.4 axis

指定滑动窗口的轴方向。默认为0,表示滑动窗口沿着列方向移动,计算每一列的值;如果为1,表示滑动窗口沿着行方向移动,计算每一行的值。

3. rolling函数的应用

3.1 统计数据的滑动平均值

rolling函数可以用来计算数据的滑动平均值,例如下面代码计算100个随机数的滑动平均值:

import pandas as pd

import numpy as np

np.random.seed(0)

data = pd.Series(np.random.randn(100))

rolling_mean = data.rolling(10).mean()

print(rolling_mean)

上述代码中,第一行和第二行的代码导入了pandas和numpy库,并设置了numpy的随机数生成器的种子,保证每次运行生成的随机数一致。第三行生成了一个长度为100的Series对象data,并用rolling函数计算窗口大小为10的滑动平均值,结果保存在rolling_mean变量中。第四行将结果打印输出。

运行结果:

0 NaN

1 NaN

2 NaN

3 NaN

4 NaN

...

95 -0.362160

96 -0.321521

97 -0.263383

98 -0.149606

99 0.054232

Length: 100, dtype: float64

由上述结果可以看出,前几个滑动窗口的平均值为NaN,因为这时窗口内的数据不足10个。当滑动窗口和数据长度相等时,所有滑动窗口的平均值都已计算完成。

3.2 滑动窗口的统计数据

rolling函数还支持其他的统计计算,例如:最小值、最大值、标准差等。以计算窗口大小为10的滑动窗口最大值为例:

import pandas as pd

import numpy as np

np.random.seed(0)

data = pd.Series(np.random.randn(100))

rolling_max = data.rolling(10).max()

print(rolling_max)

运行结果:

0 NaN

1 NaN

2 NaN

3 NaN

4 NaN

...

95 1.994696

96 1.994696

97 1.994696

98 1.652305

99 1.652305

Length: 100, dtype: float64

计算滑动窗口的最小值和标准差等的方法与上述示例相同。上述代码可以改为如下形式:

rolling_min = data.rolling(10).min() # 计算滑动窗口的最小值

rolling_std = data.rolling(10).std() # 计算滑动窗口的标准差

3.3 滑动窗口的扩建

rolling函数还可以通过扩大窗口大小,改变计算方式。例如,如果要计算数据的滑动窗口和,可以选择扩展窗口的大小。下面代码计算窗口大小为10、20、30、40、50、60的滑动窗口和,并将结果保存在一个字典rolling_sum中

rolling_sum = {}

for i in range(1, 7):

window_size = i * 10

rolling_sum[window_size] = data.rolling(window_size).sum()

print(rolling_sum[window_size])

可以看到,window_size变量的变化范围从10到60,每次迭代对应的窗口大小不同。rolling_sum字典的键名对应窗口大小,键值为滑动窗口和的结果。

3.4 滑动窗口的分组计算

如果需要对某些列的数据进行列与列之间的计算,则可以使用shift函数,该函数可实现按指定位移量对数据进行移动。假设有如下数据:

import pandas as pd

import numpy as np

data = pd.DataFrame({'A': [1, 2, 3, 4, 5] * 5, 'B': [6, 7, 8, 9, 10] * 5})

print(data)

运行结果如下:

A B

0 1 6

1 2 7

2 3 8

3 4 9

4 5 10

5 1 6

6 2 7

7 3 8

8 4 9

9 5 10

10 1 6

11 2 7

12 3 8

13 4 9

14 5 10

15 1 6

16 2 7

17 3 8

18 4 9

19 5 10

20 1 6

21 2 7

22 3 8

23 4 9

24 5 10

现在,我们需要计算A列和B列的滑动窗口和。

rolling_sum = data.rolling(3).sum()

rolling_sum_shift = rolling_sum.shift(1) # 平移相当于向后走一个单位

rolling_sum_shift.fillna(data, inplace=True) # 由于平移后第一行也为NaN,需要填充

result = data + rolling_sum_shift

print(result)

运行结果如下:

A B

0 NaN NaN

1 NaN 19.0

2 NaN 23.0

3 NaN 26.0

4 NaN 28.0

5 NaN 28.0

6 NaN 31.0

7 NaN 33.0

8 NaN 35.0

9 NaN 37.0

...

4. 结论

rolling函数可以非常便捷地实现数据的滑动窗口处理,是数据科学家以及分析人员常用的工具之一。此外,随着数据分析和处理的需求不断增加,rolling函数应用场景将变得越来越广泛。

后端开发标签