首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫根据窗口大小计算最大可能的rolling_mean

熊猫根据窗口大小计算最大可能的rolling_mean
EN

Stack Overflow用户
提问于 2014-09-02 16:58:00
回答 2查看 270关注 0票数 1

我正在尝试使用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

当我这么做时:

代码语言:javascript
复制
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

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

如果您查看来自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

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

EN

回答 2

Stack Overflow用户

发布于 2014-09-02 20:05:18

首先,我必须同意Andy的观点,他说只有最后两行应该是NaN,因为您使用的是center = True (然后从前面的2到下一个2的平均值)。

Python会在第一行自动完成所需的操作(取可用数据的平均值),但在底层不会这样做。逻辑是获得2个以前的值和2个下一个值(如果可用的话)。

因此,要遵循顶部行的逻辑:

代码语言:javascript
复制
for i in xrange(2):
    index = i + 19
    df['freq_average'] = sum(df['freq'].iloc[index-2:21] / (20-index+3)

这将把两个前两个值(索引-2)的平均值取到末尾(21)。这是针对你的具体问题。对于不同的窗口,您需要适应。

票数 0
EN

Stack Overflow用户

发布于 2014-09-02 21:44:01

根据“帮助(pd.rolling_mean)”设置,min_periods=0 (就像您所做的那样)应该做您想要的事情。然而,在熊猫的0.14.1中,rolling_*函数的实现中存在一个bug,它导致在使用center=True时将NaNs放在末尾。错误报告在https://github.com/pydata/pandas/issues/6795

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25628587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档