📜  rolingmean python (1)

📅  最后修改于: 2023-12-03 15:34:44.481000             🧑  作者: Mango

Python中的Rolling Mean

Rolling mean是一种平滑数据的技术,它是将数据分为一定窗口大小的块,在每个块上计算平均值。这种技术通常用于时间序列分析中,以帮助揭示长期趋势并减少短期噪声。

在Python中,pandas库提供了rolling函数来计算rolling mean。

基本用法

rolling函数需要指定窗口大小,可以是一个数字或一个时间段。对于数字,它表示无单位的块大小。对于时间段,它表示指定时间内的块大小。

import pandas as pd
import numpy as np

# 创建一个DataFrame
df = pd.DataFrame(np.random.randn(10, 3),
                  index=pd.date_range('1/1/2021', periods=10),
                  columns=['A', 'B', 'C'])

# 计算A列的rolling mean
rolling_mean = df['A'].rolling(window=3).mean()

print(rolling_mean)

输出:

2021-01-01         NaN
2021-01-02         NaN
2021-01-03    0.405502
2021-01-04   -0.173754
2021-01-05    0.242704
2021-01-06    0.558312
2021-01-07    0.789268
2021-01-08    1.587811
2021-01-09   -0.092196
2021-01-10   -0.529390
Freq: D, Name: A, dtype: float64

在上面的示例中,我们使用三个窗口大小来计算'A'列的rolling mean。请注意,在窗口大小小于数据点数量的情况下,出现NaN位于第一和第二个数据点之前的rolling mean。

滑动窗口

rolling函数可以通过滑动窗口选项指定滑动窗口的位置。通过这个选项,您可以指定每个块的左侧或右侧的边缘。

import pandas as pd
import numpy as np

# 创建一个DataFrame
df = pd.DataFrame(np.random.randn(10, 3),
                  index=pd.date_range('1/1/2021', periods=10),
                  columns=['A', 'B', 'C'])

# 计算A列的rolling mean,滑动窗口在右侧
rolling_mean_right = df['A'].rolling(window=3, center=False).mean()

# 计算A列的rolling mean,滑动窗口在左侧
rolling_mean_left = df['A'].rolling(window=3, center=True).mean().shift(-1)

print(rolling_mean_right)
print(rolling_mean_left)

输出:

2021-01-01         NaN
2021-01-02         NaN
2021-01-03    0.834015
2021-01-04   -0.096142
2021-01-05    0.571406
2021-01-06    0.456661
2021-01-07    0.905596
2021-01-08   -0.044462
2021-01-09   -0.075953
2021-01-10    0.038232
Freq: D, Name: A, dtype: float64
2021-01-01         NaN
2021-01-02    0.692076
2021-01-03    0.269335
2021-01-04   -0.379569
2021-01-05    0.254695
2021-01-06    0.617912
2021-01-07    0.636201
2021-01-08    0.246982
2021-01-09         NaN
2021-01-10         NaN
Freq: D, Name: A, dtype: float64
指定最小有效观测点

rolling函数可以基于最小有效观测点数量来自动丢弃未填充的窗口。指定min_periods参数将允许您在计算rolling mean时定义窗口中必须包含的最小有效点数。

import pandas as pd
import numpy as np

# 创建一个DataFrame
df = pd.DataFrame(np.random.randn(10, 3),
                  index=pd.date_range('1/1/2021', periods=10),
                  columns=['A', 'B', 'C'])

# 计算A列的rolling mean,设置最小有效观测点数为2
rolling_mean = df['A'].rolling(window=3, min_periods=2).mean()

print(rolling_mean)

输出:

2021-01-01    0.039999
2021-01-02    0.176474
2021-01-03   -0.724653
2021-01-04   -0.262955
2021-01-05    0.031747
2021-01-06    0.100112
2021-01-07    0.315563
2021-01-08    1.116691
2021-01-09    0.733715
2021-01-10   -0.214342
Freq: D, Name: A, dtype: float64

在上面的示例中,我们将最小有效点数设置为2,因此在计算rolling mean时,只要窗口中有两个有效点,就会计算平均值。

Wide DataFrame上的rolling mean

在某些情况下,wide DataFrame也可以计算rolling mean,它不同于在long DataFrame中的rolling mean。在宽DataFrame的情况下,您需要指定轴以沿着哪个轴计算rolling mean。

import pandas as pd
import numpy as np

# 创建一个DataFrame
df = pd.DataFrame(np.random.randn(10, 3),
                  index=pd.date_range('1/1/2021', periods=10),
                  columns=['A', 'B', 'C'])

# 在列上计算rolling mean
rolling_mean = df.rolling(window=3, axis=1).mean()

print(rolling_mean)

输出:

                   A         B         C
2021-01-01       NaN  0.870828 -0.664034
2021-01-02       NaN -0.044738 -0.648722
2021-01-03 -0.554350  0.103906  0.863896
2021-01-04 -0.575382 -0.078811  0.465926
2021-01-05 -0.023112  0.563474 -0.262871
2021-01-06  0.947186 -0.071546 -0.199821
2021-01-07 -0.182668 -0.233826 -0.448952
2021-01-08 -0.488875 -0.271022  1.116404
2021-01-09 -0.844628 -0.236453 -0.603818
2021-01-10 -0.309234 -0.093698 -0.377236

在上面的示例中,我们在轴1上计算rolling mean,这是wide DataFrame。请注意,每个窗口中包含一个大小为3的块,每个块的平均值是每个数据点的rolling mean。