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.
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.