不同时间窗的移动平均

2024-10-03 19:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我在熊猫数据框里有一些数据。我想根据这些数据计算移动平均值,包括最多N个尾随行和最多Q个前导行:

import pandas

my_data = pandas.DataFrame({
    'values': [5.0, 4.0, 3.0, 5.0, 5.0, 6.0, 4.0, 6.0, 7.0, 4.0, 5.0, 5.0]
})

my_data
    values
0      5.0
1      4.0
2      3.0
3      5.0
4      5.0
5      6.0
6      4.0
7      6.0
8      7.0
9      4.0
10     5.0
11     5.0

N=2
Q=3

get_moving_average(my_data, lagging=N, leading=Q)
    values      mavg
0        5  4.250000
1        4  4.400000
2        3  4.666667
3        5  4.500000
4        5  4.833333
5        6  5.500000
6        4  5.333333
7        6  5.333333
8        7  5.166667
9        4  5.400000
10       5  5.250000
11       5  4.666667

这里,第0行的移动平均值是4.25—单元格0的值加上0个粗体滞后行(因为没有)和3个斜体前导行(单元格1:3—so(5.0+4.0+3.0+5.0)/4.0=17.0/4.0=4.25

第1行的移动平均线包括上述所有数据,但也包括粗体尾随行0(因为我们接受2个滞后行,但只有一个存在),收益率(5.0+4.0+3.0+5.0+5.0)/5.0=22.0/5.0=4.4。你知道吗

等等。但是,pandas的rolling方法只对window使用一个参数,而不允许选择每边的大小,并且在数据不足的情况下似乎存在问题。你知道吗

有没有一个替代滚动涵盖这一点,或我需要滚动我自己的?你知道吗


Tags: 数据importdataframepandasdatagetmy平均值
1条回答
网友
1楼 · 发布于 2024-10-03 19:25:19

我不确定这将适用于所有情况下没有进一步的测试。你知道吗

让我们发挥创意。在“滚动窗口”中向后使用rollingshift,以获得适当的尾随行和前导行计数。为了在滚动平均值处处理NaN,让我们向后滚动fillna。你知道吗

N=2
Q=3
T = N+Q+1
my_data.rolling(T, min_periods=1).mean().shift(-Q)\
       .fillna(my_data[::-1].rolling(T, min_periods=Q).mean().shift(-N)[::-1])

输出:

      values
0   4.250000
1   4.400000
2   4.666667
3   4.500000
4   4.833333
5   5.500000
6   5.333333
7   5.333333
8   5.166667
9   5.400000
10  5.250000
11  4.666667

步骤:

在你的例子中,用N(滞后)+Q(超前)和总电流(T)在整个时间间隔内进行滚动计算。你知道吗

my_data.rolling(T, min_periods=1).mean()

现在,让我们使用shift向后移动计算,使窗口如预期的那样,N滞后,Q超前,所以shift-Q

my_data.rolling(T, min_periods=1).mean().shift(-Q)

输出:

      values
0   4.250000
1   4.400000
2   4.666667
3   4.500000
4   4.833333
5   5.500000
6   5.333333
7   5.333333
8   5.166667
9        NaN
10       NaN
11       NaN

现在要处理数据帧末尾的那些NaN值,我们反向进行滚动计算,并使用fillna填充原始值。[::-1]是一个反转元素,从末尾开始滚动到开头,然后使用[::-1]再次翻转以与原始结果对齐。你知道吗

my_data[::-1].rolling(T, min_periods=Q).mean().shift(-N)[::-1]

输出:

      values
0        NaN
1        NaN
2   4.666667
3   4.500000
4   4.833333
5   5.500000
6   5.333333
7   5.333333
8   5.166667
9   5.400000
10  5.250000
11  4.666667

使用fillna在第一个序列上搜索第二个序列以获得:

N=2
Q=3
T = N+Q+1
my_data.rolling(T, min_periods=1).mean().shift(-Q)\
       .fillna(my_data[::-1].rolling(T, min_periods=Q).mean().shift(-N)[::-1])

输出:

      values
0   4.250000
1   4.400000
2   4.666667
3   4.500000
4   4.833333
5   5.500000
6   5.333333
7   5.333333
8   5.166667
9   5.400000
10  5.250000
11  4.666667

相关问题 更多 >