Pandas计算最大可能的rolling_mean到窗口大小

时间:2014-09-02 16:58:01

标签: python pandas

我尝试使用Pandas'重新创建Google Ngram Viewer的平滑功能。 rolling_mean函数。一切都很好,除了最后N行(其中N等于所选的窗口大小)导致NaN。我理解NaN存在的原因,但我想知道是否有办法迫使Pandas计算最后N行,并且可能有最大窗口大小。

启动DataFrame:

      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用a计算窗口大小为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

我已经用了一天左右的时间撞击这个并且没有运气。任何方向都非常感谢!

2 个答案:

答案 0 :(得分:0)

提一下,我不得不同意Andy Hayden,他说只有最后两行应该是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)。这是针对您的具体问题。对于不同的窗口,您需要适应。

答案 1 :(得分:0)

根据'help(pd.rolling_mean)'设置min_periods = 0(如你所做)应该做你想要的。但是,在pandas 0.14.1中,scroll_ *函数的实现存在一个错误,当使用center = True时会导致NaNs被放在最后。错误报告位于https://github.com/pydata/pandas/issues/6795