按组分类的滞后或移动平均值

4

我想在groupby的同时计算尾随或移动平均值。在下面的示例中,我已经演示了一个5天的移动平均线。

我的数据看起来像这样:

ID  Date         KG      Volume
1   8/10/2018    1,000   10 
1   8/11/2018    500     6 
1   8/12/2018    750     2 
1   8/13/2018    500     6 
1   8/13/2018    500     6 
1   8/14/2018    1,000   4 
2   8/1/2018     1304    8
2   8/2/2018     626     1
2   8/3/2018     955     3
2   8/8/2018     445     4
2   8/10/2018    1356    11
2   8/13/2018    524     7
2   8/14/2018    331     5

我希望能按照ID和日期列进行分组,然后计算KG/Volume列的最近5天平均值(从今天的日期开始计算,即8/10-8/14)。我需要在ID和日期上进行分组的原因是像ID 1这样的情况,其中日期8/13/18出现了两次。在这个例子中,我希望ID 1在8/13/18只有一个1,000 KG的条目用于平均计算(而不是两个500的条目)。
预期输出应该类似于:
ID  Avg_KG  Avg_Vol
1   850     7 
2   442.2   4.6

请注意ID 2缺少5天中的2天,这对于平均值计算非常重要。在ID 2中缺失的两天,应该作为平均值计算的0因素考虑进去。这就是为什么ID 2的平均值为442.2而不是737。

我已经尝试使用"rolling(5).mean()",但是将其与"groupby"语句结合使用时结果不正确。

1个回答

1
首先,进行一些设置:
df.Date = pd.to_datetime(df.Date)
df.KG = df.KG.str.replace(',', '').astype(int)

现在按照 DateID 进行分组,并对重复的日期求和:
s = df.groupby(['Date', 'ID']).agg({'KG': 'sum', 'Volume': 'sum'}).reset_index(1)

            ID    KG  Volume
Date
2018-08-01   2  1304       8
2018-08-02   2   626       1
2018-08-03   2   955       3
2018-08-08   2   445       4
2018-08-10   1  1000      10
2018-08-10   2  1356      11
2018-08-11   1   500       6
2018-08-12   1   750       2
2018-08-13   1  1000      12
2018-08-13   2   524       7
2018-08-14   1  1000       4
2018-08-14   2   331       5

接下来,为了重新采样以解决“缺失”的天数问题:
out = s.groupby('ID').resample('1D').asfreq().drop('ID', 1).reset_index(0).fillna(0)

最后,对过去5天的DataFrame进行索引,并使用mean
out.groupby('ID').tail(5).groupby('ID').mean()

        KG  Volume
ID
1.0  850.0     6.8
2.0  442.2     4.6

感谢您的输入。这几乎就是答案,但没有考虑到我在示例末尾提到的隐含零。即ID 2缺少8/11和8/12,这意味着我们可以假设为0(对于KG和体积,在两天内都是如此)。然后,ID 2上的KG计算将如下所示:(1356 + 0 + 0 + 524 + 331)/ 5 = 442.2 - Brian
@Brian 啊,谢谢你澄清,看看我的更新答案! - user3483203
我想添加另一列并应用这种方法,但这样做会导致日期重复。这会导致以下错误:“ValueError:无法从重复的轴重新索引”。所以我想知道是否可以使用重复索引进行重新采样? - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接