我尝试使用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
我已经用了一天左右的时间撞击这个并且没有运气。任何方向都非常感谢!
答案 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。