在没有变换的情况下在groupby中移动滚动平均值?

Posted

技术标签:

【中文标题】在没有变换的情况下在groupby中移动滚动平均值?【英文标题】:Shifting rolling average in groupby without transform? 【发布时间】:2021-11-23 03:03:39 【问题描述】:
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

【问题讨论】:

您的输入数据样本在这里会有所帮助 您的数据是否像您的示例中那样按照 raceID 进行排序? @Ben.T 我没有排序。我不确定这与这里有什么关系。 你可以mask每个raceID的第一个元素,如果它们是有序的,因为你的问题是在第二行,shift不是按组完成的,并且使用有序数据可以屏蔽每个组的第一个元素 @Ben.T 谢谢,这是一种解决方案。 【参考方案1】:

在第一个示例中,转移发生在返回之前。在第二次之后发生,因此在发生转变时不再对数据进行分组。

您可能希望在均值之后再次分组,以便按组执行移位。

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

【讨论】:

谢谢,很好的解决方案。速度也不会受到太大影响,仍然比变换快得多。

以上是关于在没有变换的情况下在groupby中移动滚动平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python + NumPy / SciPy 计算滚动/移动平均值?

pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值滚动中位数滚动最大最小值滚动加和等

pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动平均值(rolling mean)例如,计算某公司的多个店铺每N天(5天)的滚动销售额平均值

在不使用 opencv 的情况下在 python 中应用 Homography 变换

如何在不隐藏正文滚动条的情况下在固定 div 上滚动时禁用正文滚动?

pandas groupby 滚动均值/中值删除缺失值