移动平均线的Python计算



我有一个数据集如下:

import pandas as pd
data = {'Category': ['A','A','A','A','A','A','B','B','B','B','B','C','C','C','C','C'],
'Date' : [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5],
'Count': [1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,6]}
df = pd.DataFrame(data)

我试图计算每3行的平均计数,不包括按类别分组的当前行,日期从新的到旧的,如果没有足够的3行计算,它将返回0。

预期结果如下所示。例如:对于日期1的A类,平均值计算为A类日期2、3和4的平均值。

<表类>类别日期数平均tbody><<tr>113224333.333333333442.666666666550610B124B235B340B450B560C113C224.333333333C330C440C560

您可以将rollingshiftsort_values组合使用,如下所示:

def reverse_roll(df):
df['Count'] = df.sort_values('Date', ascending=False)['Count'].rolling(3, 3).mean().shift()
df['Count'] = df['Count'].fillna(0.0)
df = df.sort_values('Date', ascending=True)
return df

df.groupby('Category').apply(reverse_roll)

上面,rolling(3, 3)用于强制滚动窗口总是考虑3行而不是更少。因此,前2行结果将是NaN,它通过fillna设置为0。若要在窗口中不包括当前行,则使用shift

结果:

Category  Date     Count
0         A     1  3.000000
1         A     2  4.000000
2         A     3  3.333333
3         A     4  0.000000
4         A     5  0.000000
5         A     6  0.000000
6         B     1  4.000000
7         B     2  5.000000
8         B     3  0.000000
9         B     4  0.000000
10        B     5  0.000000
11        C     1  3.000000
12        C     2  4.333333
13        C     3  0.000000
14        C     4  0.000000
15        C     5  0.000000

最新更新