Python 按列分组后的移动平均数

Python 按列分组后的移动平均数,python,pandas,moving-average,rolling-computation,Python,Pandas,Moving Average,Rolling Computation,上面是可用数据的快照 我希望有一个移动平均值列,该列根据日期而不是行给出MA,即我在同一日期有多个条目的天数应该只有一个值作为MA 我希望MA在第一组中按原点计算,然后按日期计算 下面是每个原始组中缺少日期的脚本- CargoTons DateOrigin DateDestination Origin Destination 0 72875.0 2020-01-01 2020-01-08 Snohvit Dragon 1 77126.0 2020-01-01 2020

上面是可用数据的快照

我希望有一个移动平均值列,该列根据日期而不是行给出MA,即我在同一日期有多个条目的天数应该只有一个值作为MA

我希望MA在第一组中按原点计算,然后按日期计算

下面是每个原始组中缺少日期的脚本-

   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  
模块:

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
您可以在Origin和DateOrigin上使用
groupby
,首先计算相同日期不同值的平均值

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")
然后使用
滚动
,例如,在2的窗口上使用平均值。将
Origin
作为groupby

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

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

如您所见,在
Origin
的每个类别中,它都以NAN开头,这是由于滚动窗口的缘故。例如,Snohvit 68944.0的输出是其输入(72875+65013)/2的平均值。

模块:

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
您可以在Origin和DateOrigin上使用
groupby
,首先计算相同日期不同值的平均值

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")
然后使用
滚动
,例如,在2的窗口上使用平均值。将
Origin
作为groupby

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

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


如您所见,在
Origin
的每个类别中,它都以NAN开头,这是由于滚动窗口的缘故。例如,Snohvit 68944.0的输出是其输入的平均值(72875+65013)/2.

您可能可以使用转换滚动。请粘贴一个示例解决方案-MA可以是2日期您可能可以使用转换滚动。请粘贴一个示例解决方案-MA可以是2日期这在我们包含起点/终点时不起作用columns@Ameya维克拉姆:你能跟我查一下吗代码行?@Ruthger:我想你指的是命令“mean()”而不是“sum()”@kenny_123:你是对的,因为OP使用了术语“移动平均值”而不是“移动窗口”;-)。不,当我想按起点/终点对其进行分组时,它没有给出滚动平均值-merge5=merge2.groupby(['DateOrigin','Origin']).aggregate('CargoTons').mean().rolling(3.mean()a1=pd.merge(merge2,merge5,on='DateOrigin',how='left'))这是为每个日期提供一个聚合值,而不是为每个单独的原点提供MA值。当我们包括原点/目的地时,不会这样做columns@Ameya维克拉姆:你能用添加的代码行检查一下吗?@Ruthger:我想你指的是命令“mean()”而不是“sum()”@kenny_123:你说得对,OP使用了术语“移动平均线”而不是“移动窗口”;-)。不,当我想按起点/终点对其进行分组时,它没有给出滚动平均值-merge5=merge2.groupby(['DateOrigin','Origin']).aggregate('CargoTons').mean().rolling(3.mean()a1=pd.merge(merge2,merge5,on='DateOrigin',how='left'))这是为每个日期提供聚合值,而不是为每个单独原点提供MA值