groupby 列后的移动平均值

Moving average after groupby a column

   CargoTons   DateOrigin  DateDestination Origin  Destination
0   72875.0 2020-01-01  2020-01-08  Snohvit Dragon
1   77126.0 2020-01-01  2020-01-16  Cameron (Liqu.) Grain
2   0       2020-01-02          
3   67500.0 2020-01-03  2020-01-18  Sabine Pass South Hook
4   93843.0 2020-01-04  2020-01-23  Ras Laffan  South Hook
5   76239.0 2020-01-05  2020-01-14  Yamal       Grain
6   71749.0 2020-01-05  2020-01-23  Sabine Pass Dragon
7   75353.0 2020-01-06  2020-01-22  Sabine Pass South Hook
8   71749.0 2020-01-07  2020-01-21  Sabine Pass South Hook
9   0       2020-01-08          
10  96925.0 2020-01-09  2020-01-25  Ras Laffan  South Hook
11  65013.0 2020-01-10  2020-01-22  Snohvit     Grain
12  76505.0 2020-01-10  2020-01-19  Yamal       Dragon
13  0       2020-01-11          
14  0       2020-01-12          
15  0       2020-01-13          
16  0       2020-01-14          
17  0       2020-01-15  

以上是可用数据的快照。

我想要一个移动平均列,它根据日期而不是行给出 MA - 即我在同一日期有多个条目的日子应该只有一个值作为 MA。

我希望在第一个按来源分组然后按日期计算 MA。

以下是每个 Origin 组中缺失日期的脚本-

start = pd.datetime(2020,1,1)
end = pd.datetime(2020,1,31)  
index = pd.date_range(start, end)
mockdata = pd.DataFrame()
mockdata['DateOrigin'] = index

模块:

import io
import pandas as pd

数据示例:

df = pd.read_csv(io.StringIO("""
   CargoTons DateOrigin Origin
 0 72875.0 2020-01-01 Snohvit
 1 77126.0 2020-01-01 Cameron
 2 0 2020-01-02          
 3 67500.0 2020-01-03 SabinePass
 4 93843.0 2020-01-04 RasLaffan
 5 76239.0 2020-01-05 Yamal
 6 71749.0 2020-01-05 SabinePass
 7 75353.0 2020-01-06 SabinePass
 8 71749.0 2020-01-07 SabinePass
 9 0 2020-01-08          
 10 96925.0 2020-01-09 RasLaffan
 11 65013.0 2020-01-10 Snohvit
 12 76505.0 2020-01-10 Yamal
 13 0 2020-01-11          
 14 0 2020-01-12          
 15 0 2020-01-13          
 16 0 2020-01-14          
 17 0 2020-01-15
 """), sep="\s", engine="python")

您可以在 Origin 和 DateOrigin 上使用 groupby,首先计算相同日期不同值的平均值。

ndf = pd.DataFrame(df.groupby(['Origin', 'DateOrigin']).aggregate('CargoTons').mean()).reset_index()

然后使用rolling,例如对2的window进行平均。将Origin作为groupby。

ndf.groupby(['Origin']).rolling(2).mean()

给出:

               CargoTons
Origin                  
Cameron    0         NaN
RasLaffan  1         NaN
           2     95384.0
SabinePass 3         NaN
           4     69624.5
           5     73551.0
           6     73551.0
Snohvit    7         NaN
           8     68944.0
Yamal      9         NaN
           10    76372.0

验证

如您所见,在 Origin 的每个类别中,它都以 NAN 开头,这是预期的,因为滚动 window。 for ex的输出。 Snohvit 68944.0是其输入的平均值,(72875+65013)/2.