我正在尝试使用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
我已经撞了一天左右了,一点运气都没有。任何方向都是非常感谢的!在
根据“帮助”(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个下一个值(如果可用)。在
所以,按照最上面几行的逻辑:
这将取前面两个值(索引-2)的平均值,直到结束(21)。这是针对你的具体问题。对于不同的窗口,您需要进行调整。在
相关问题 更多 >
编程相关推荐