📅  最后修改于: 2023-12-03 15:34:44.481000             🧑  作者: Mango
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,它不同于在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。