【问题标题】:Python calculation for moving averagePython计算移动平均线
【发布时间】:2021-05-30 16:58:23
【问题描述】:

我有一个数据集如下:

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 的平均计数。

Category Date Count Average
A 1 1 3
A 2 2 4
A 3 3 3.333333333
A 4 4 2.666666666
A 5 5 0
A 6 1 0
B 1 2 4
B 2 3 5
B 3 4 0
B 4 5 0
B 5 6 0
C 1 1 3
C 2 2 4.333333333
C 3 3 0
C 4 4 0
C 5 6 0

我尝试在下面使用,但没有得到预期的结果

df['average'] = df.groupby(['Category'])['count'].transform(lambda x: x.rolling(3, 1).mean())

【问题讨论】:

  • 第 4 行(A 类中的2.666666667)的平均值应该为 0,对吗?否则它看起来与 B 和 C 不一致。
  • @Shaido 应该是 2.66667,如果要计算的行数少于 3,则返回 0。
  • 那么,请解释一下如何得到 2.666。如果您只使用 2 行,您将拥有 (5+1)/2=3。还有为什么 B 和 C 类别有 3 个零?

标签: python pandas group-by pandas-groupby rolling-computation


【解决方案1】:

您可以将rolling 与shift 和sort_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

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2021-04-09
    • 2014-11-18
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多