熊猫计算最大可能的滚动平均到窗口大小

2024-06-16 11:38:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Pandas的rolling_mean函数重新创建Google Ngram Viewer的平滑功能。除了最后N行(其中N等于所选的窗口大小)的结果是NaN之外,其他一切都很好。我理解为什么存在NaN,但是我想知道是否有一种方法可以迫使Pandas计算最后N行的最大窗口大小。在

起始数据帧:

      y    mc    vc     g            freq
0   1980  2110   891  acorn  0.0000006816639806737
1   1981  2493   925  acorn  0.0000007869870441530
2   1982  1970   969  acorn  0.0000006058489961744
3   1983  1974   942  acorn  0.0000005869087043278
4   1984  2265   962  acorn  0.0000006284175013608
5   1985  2331  1002  acorn  0.0000006287865167972
6   1986  2288  1036  acorn  0.0000005938515224444
7   1987  2975  1081  acorn  0.0000007639327989758
8   1988  2562  1164  acorn  0.0000006201948589259
9   1989  2773  1271  acorn  0.0000006308818219374
10  1990  3230  1449  acorn  0.0000006736596925364
11  1991  3984  1279  acorn  0.0000008445218584394
12  1992  2908  1349  acorn  0.0000005616418361769
13  1993  3511  1522  acorn  0.0000006673125583208
14  1994  3623  1709  acorn  0.0000006391704741358
15  1995  3836  1760  acorn  0.0000006497943728333
16  1996  4304  1910  acorn  0.0000006909335126709
17  1997  4107  1954  acorn  0.0000006390261435505
18  1998  4469  1993  acorn  0.0000006660007460970
19  1999  4494  2141  acorn  0.0000006233081676193
20  2000  4827  2304  acorn  0.0000006135668877077

当我这样做时:

df['freq_average'] = pd.rolling_mean(df['freq'],5,min_periods=0,center=True)

我得到的结果是:

      y    mc    vc     g            freq              freq_average
0   1980  2110   891  acorn  0.0000006816639806737  0.0000006531021239145
1   1981  2493   925  acorn  0.0000007869870441530  0.0000006446377522759
2   1982  1970   969  acorn  0.0000006058489961744  0.0000006595496331134
3   1983  1974   942  acorn  0.0000005869087043278  0.0000006551768804259
4   1984  2265   962  acorn  0.0000006284175013608  0.0000006527473745770
5   1985  2331  1002  acorn  0.0000006287865167972  0.0000006546484943915
6   1986  2288  1036  acorn  0.0000005938515224444  0.0000006694537560066
7   1987  2975  1081  acorn  0.0000007639327989758  0.0000006489678280088
8   1988  2562  1164  acorn  0.0000006201948589259  0.0000006545554245675
9   1989  2773  1271  acorn  0.0000006308818219374  0.0000006593064945501
10  1990  3230  1449  acorn  0.0000006736596925364  0.0000006612498465021
11  1991  3984  1279  acorn  0.0000008445218584394  0.0000006668995733997
12  1992  2908  1349  acorn  0.0000005616418361769  0.0000006710063571366
13  1993  3511  1522  acorn  0.0000006673125583208  0.0000006621034432386
14  1994  3623  1709  acorn  0.0000006391704741358  0.0000006623864713016
15  1995  3836  1760  acorn  0.0000006497943728333  0.0000006608123863716
16  1996  4304  1910  acorn  0.0000006909335126709                    NaN
17  1997  4107  1954  acorn  0.0000006390261435505                    NaN
18  1998  4469  1993  acorn  0.0000006660007460970                    NaN
19  1999  4494  2141  acorn  0.0000006233081676193                    NaN
20  2000  4827  2304  acorn  0.0000006135668877077                    NaN

所以我要找的是一种计算上述结果的方法,然后让索引16(在本例中)用窗口大小4(而不是原来的5)计算,索引17用窗口大小3计算,依此类推。在

如果您查看来自Google Ngram Viewer的结果,索引16-20应该得到以下结果:

      y    mc    vc     g            freq                 freq_average
16  1996  4304  1910  acorn  0.0000006909335126709        0.0000659528
17  1997  4107  1954  acorn  0.0000006390261435505        0.0000638973
18  1998  4469  1993  acorn  0.0000006660007460970        0.0000648639
19  1999  4494  2141  acorn  0.0000006233081676193        0.0000645971
20  2000  4827  2304  acorn  0.0000006135668877077        0.0000647105

我已经撞了一天左右了,一点运气都没有。任何方向都是非常感谢的!在


Tags: 方法函数pandasdfgooglenanmcmean
2条回答

根据“帮助”(pd.滚动平均值)'设置min_periods=0(如您所做的那样)应该能满足您的需要。然而,在pandas 0.14.1中,滚动函数的实现中有一个bug,当使用center=True时,会导致NaNs被置于末尾。错误报告位于https://github.com/pydata/pandas/issues/6795。在

我要说的是,我不得不同意andyhayden的观点,他说只有最后两行应该是NaN,因为您使用的是center=True(那么它将从前2行平均到下2行)。在

Python会在第一行自动执行您需要的操作(取可用数据的平均值),但不会在最后一行执行。逻辑是获取2个先前值和2个下一个值(如果可用)。在

所以,按照最上面几行的逻辑:

for i in xrange(2):
    index = i + 19
    df['freq_average'] = sum(df['freq'].iloc[index-2:21] / (20-index+3)

这将取前面两个值(索引-2)的平均值,直到结束(21)。这是针对你的具体问题。对于不同的窗口,您需要进行调整。在

相关问题 更多 >