滚动平均值计算不应该计算的某些值?

时间:2020-04-25 14:09:54

标签: python pandas dataframe rolling-computation

从问题here开始,我被重定向到另一个线程,并且能够操纵该答案中提供的代码以到达我想要的位置。我现在遇到了一个问题,但对它的发展情况感到有些困惑。

我的数据框实质上如下所示:

Date   HomeTeam   AwayTeam   HGoals   AGoals   HGRollA   AGRollA
1/1    AAA        BBB        4        2        2.67      1.67

Link to a more detailed image of said dataframe with some extra columns.

基本上,每一行都有:
-比赛日期
-客队和客队
-当天主队和客队进球的进球
-和我添加的2列,计算出主队和客队在最近3场比赛中进球的滚动平均值,不包括当前行。因此,在上述示例中,AAA队在最近3场比赛(主场或客场)中平均得分为2.67球,比当天击败BBB队4-2更为重要。

我用来计算滚动平均值的代码如下:

dfrollavg = (df[['HGoals','AGoals']]
            .stack()
            .groupby(df[['HomeTeam','AwayTeam']].stack().values)
            .rolling(3, min_periods = 3).mean().shift(1)
            .reset_index(level=0, drop=True)
            .unstack()
            .add_prefix('Avg_')

这给了我一个只有滚动平均值而没有其他信息的数据框,所以我将这些列放回原始数据框中以得到我想要的结果。

df['HGRollA'] = dfrollavg['Avg_HGoals'].round(2)
df['AGoalRA'] = dfrollavg['Avg_AGoals'].round(2)

现在,这是这段代码引起我的两个问题。

  1. shift(1)在其中是因为我希望滚动平均值的代码是最后3个匹配项,而不是最后2个匹配项+当前行。但是,as you can see发生的一件奇怪的事情是,这种转变将值引入了数据帧的前10行,这是不应该发生的,而且我不确定为什么。此数据帧的前30行左右应该都计算了NaN,因为在大约那个点之前,每个团队没有3个唯一的观察值。但是由于某种原因,shift(1)会将值放入前10行(而不是接下来的20行)。如果我将其更改为shift(0),它就会消失...但是,当然,滚动平均值不会按我的需要计算前3场比赛,而是过去2场+当前行。

    < / li>
  2. 我在此数据帧中有多个季节。在一个新赛季开始之际,数据框中总会有3个新球队没有比赛。因此,如果在2011赛季的第一天,AAA球队打了CCC球队,而CCC球队不在上赛季(2010年,数据集的第一年)排名联盟,那么CCC球队就不应该为他们计算滚动平均值并且应为NaN,直到在数据集中播放了3场比赛为止。 AAA球队上赛季参加了联赛,所以对他们进行平均滚动计算是很好的。但是由于某种原因,我的代码立即为CCC小组分配了滚动平均值。

如果我不得不猜测是是我的计算滚动平均值的代码以某种方式弄乱了,还是当我将此代码作为原始数据帧中的列插入时?

0 个答案:

没有答案