Python 按列分组后的移动平均数
上面是可用数据的快照 我希望有一个移动平均值列,该列根据日期而不是行给出MA,即我在同一日期有多个条目的天数应该只有一个值作为MA 我希望MA在第一组中按原点计算,然后按日期计算 下面是每个原始组中缺少日期的脚本-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
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值