在没有转换的情况下移动 groupby 中的滚动平均值?
Shifting rolling average in groupby without transform?
a = df.groupby("RaceID")["wS"].transform(lambda x: x.expanding().mean().shift())
b = df.groupby("RaceID")["wS"].expanding().mean().shift().sort_index(level=1).droplevel(0)
如果我 运行 第一行,我会得到正确的结果。另一方面,第二种方法更快。它也能正常工作,如果我不使用 shift,这会将每组滚动平均值中的所有值向前移动一步。
RaceID transform notransform noshift
7140 1021458 0.215909 0.215909 0.191919
7141 1021459 NaN 0.191919 2.375000
7142 1021459 2.375000 2.375000 1.187500
7143 1021459 1.187500 1.187500 0.791667
7144 1021459 0.791667 0.791667 0.593750
7145 1021459 0.593750 0.593750 0.475000
7146 1021459 0.475000 0.475000 0.395833
7147 1021459 0.395833 0.395833 0.339286
7148 1021459 0.339286 0.339286 0.296875
7149 1021460 NaN 0.296875 10.000000
列变换是第一行的结果,没有变换是第二行的结果。
如您所见,与索引 7141 一致,转换在移动组时将第一个值正确设置为 NaN。没有转换的操作实际上正确地移动了元素,但是它将第一个值设置为前一组的最后一个值。此行为与索引 1021460 一致可见。
数据示例:
RaceID wS
7130 1017734 0.000000
7131 1017734 0.000000
7132 1021458 1.727273
7133 1021458 0.000000
7134 1021458 0.000000
7135 1021458 0.000000
7136 1021458 0.000000
7137 1021458 0.000000
7138 1021458 0.000000
7139 1021458 0.000000
7140 1021458 0.000000
7141 1021459 2.375000
7142 1021459 0.000000
7143 1021459 0.000000
7144 1021459 0.000000
7145 1021459 0.000000
7146 1021459 0.000000
7147 1021459 0.000000
7148 1021459 0.000000
7149 1021460 10.000000
7150 1021460 0.000000
7151 1021460 0.000000
7152 1021460 0.000000
7153 1021460 0.000000
7154 1021460 0.000000
7155 1021460 0.000000
7156 1021460 0.000000
7157 1021460 0.000000
7158 1021460 0.000000
7159 1021460 0.000000
7160 1021460 0.000000
7161 1021460 0.000000
7162 1021460 0.000000
7163 1021460 0.000000
7164 1021460 0.000000
7165 1021460 0.000000
7166 1021460 0.000000
7167 1021461 201.000000
在第一个示例中,移位发生在 return 之前。第二个发生在之后,所以当发生转变时数据不再分组。
您可能希望在均值之后再次分组,以便按分组执行移位。
import pandas as pd
df = pd.DataFrame({'group':[1,1,1,2,2,2], 'values':[1,2,3,10,20,30]})
df.groupby("group", as_index=False)["values"].expanding().mean().groupby(level=0).shift().sort_index(level=1).droplevel(0)
输出
0 NaN
1 1.0
2 1.5
3 NaN
4 10.0
5 15.0
a = df.groupby("RaceID")["wS"].transform(lambda x: x.expanding().mean().shift())
b = df.groupby("RaceID")["wS"].expanding().mean().shift().sort_index(level=1).droplevel(0)
如果我 运行 第一行,我会得到正确的结果。另一方面,第二种方法更快。它也能正常工作,如果我不使用 shift,这会将每组滚动平均值中的所有值向前移动一步。
RaceID transform notransform noshift
7140 1021458 0.215909 0.215909 0.191919
7141 1021459 NaN 0.191919 2.375000
7142 1021459 2.375000 2.375000 1.187500
7143 1021459 1.187500 1.187500 0.791667
7144 1021459 0.791667 0.791667 0.593750
7145 1021459 0.593750 0.593750 0.475000
7146 1021459 0.475000 0.475000 0.395833
7147 1021459 0.395833 0.395833 0.339286
7148 1021459 0.339286 0.339286 0.296875
7149 1021460 NaN 0.296875 10.000000
列变换是第一行的结果,没有变换是第二行的结果。
如您所见,与索引 7141 一致,转换在移动组时将第一个值正确设置为 NaN。没有转换的操作实际上正确地移动了元素,但是它将第一个值设置为前一组的最后一个值。此行为与索引 1021460 一致可见。
数据示例:
RaceID wS
7130 1017734 0.000000
7131 1017734 0.000000
7132 1021458 1.727273
7133 1021458 0.000000
7134 1021458 0.000000
7135 1021458 0.000000
7136 1021458 0.000000
7137 1021458 0.000000
7138 1021458 0.000000
7139 1021458 0.000000
7140 1021458 0.000000
7141 1021459 2.375000
7142 1021459 0.000000
7143 1021459 0.000000
7144 1021459 0.000000
7145 1021459 0.000000
7146 1021459 0.000000
7147 1021459 0.000000
7148 1021459 0.000000
7149 1021460 10.000000
7150 1021460 0.000000
7151 1021460 0.000000
7152 1021460 0.000000
7153 1021460 0.000000
7154 1021460 0.000000
7155 1021460 0.000000
7156 1021460 0.000000
7157 1021460 0.000000
7158 1021460 0.000000
7159 1021460 0.000000
7160 1021460 0.000000
7161 1021460 0.000000
7162 1021460 0.000000
7163 1021460 0.000000
7164 1021460 0.000000
7165 1021460 0.000000
7166 1021460 0.000000
7167 1021461 201.000000
在第一个示例中,移位发生在 return 之前。第二个发生在之后,所以当发生转变时数据不再分组。
您可能希望在均值之后再次分组,以便按分组执行移位。
import pandas as pd
df = pd.DataFrame({'group':[1,1,1,2,2,2], 'values':[1,2,3,10,20,30]})
df.groupby("group", as_index=False)["values"].expanding().mean().groupby(level=0).shift().sort_index(level=1).droplevel(0)
输出
0 NaN
1 1.0
2 1.5
3 NaN
4 10.0
5 15.0