Python 熊猫计算最大可能滚动平均值,直到窗口大小
我正在尝试使用Pandas的滚动平均函数重新创建平滑功能。除了最后N行(其中N等于所选的窗口大小)导致NaN之外,一切都很好。我理解为什么存在NaN,但我想知道是否有办法强制Pandas使用最大窗口大小计算最后N行 开始数据帧: 当我这样做时:Python 熊猫计算最大可能滚动平均值,直到窗口大小,python,pandas,Python,Pandas,我正在尝试使用Pandas的滚动平均函数重新创建平滑功能。除了最后N行(其中N等于所选的窗口大小)导致NaN之外,一切都很好。我理解为什么存在NaN,但我想知道是否有办法强制Pandas使用最大窗口大小计算最后N行 开始数据帧: 当我这样做时: df['freq_average'] = pd.rolling_mean(df['freq'],5,min_periods=0,center=True) 我得到这个结果: 因此,我要寻找的是一种计算上述结果的方法,但是,然后使用窗口大小4(而不是原来的
df['freq_average'] = pd.rolling_mean(df['freq'],5,min_periods=0,center=True)
我得到这个结果:
因此,我要寻找的是一种计算上述结果的方法,但是,然后使用窗口大小4(而不是原来的5)计算索引16(在本例中),使用窗口大小3计算索引17,依此类推
如果您查看来自的结果,索引16-20应产生以下结果:
我已经用头撞了这一天左右,运气不好。任何方向都非常感谢 我要说的是,我同意安迪·海登的观点,他说只有最后两行应该是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)。这是针对您的具体问题。对于不同的窗口,您需要进行调整。根据“帮助(pd.rolling_mean)”,设置min_periods=0(正如您所做的)应该满足您的要求。但是,在pandas 0.14.1中,滚动函数的实现中存在一个错误,当使用center=True时,会导致将nan放在末尾。错误报告位于。可能有更直接、更有效的解决方案,但您是否尝试过自己计算这些值?我的意思是,建立一个从I=16到I=20的迭代方法并不难,计算从I到20的平均值。更奇怪的是,当我做你的滚动平均值时,我得到了不同的数字,只有2条NaN线。你能再检查一遍吗?@Inox-有没有关于你的建议方向的指针?@AndyHayden-只要重新运行iPython笔记本中的所有内容,就会得到相同的结果。现在我明白了,事实上,只有最后2个应该是NaN,因为你使用的是center=True(那么它将从前2到下2取平均值)。Python会在第一行中自动执行您需要的操作(取可用的平均值),但在底部不会执行。如果我从df['freq\u average']=pd中删除minu periods=0。滚动平均值(df['freq'],5,minu periods=0,center=True),我得到的结果与您所指的结果类似。仅在5个窗口中,前5个结果和后5个结果显示为NaN。话虽如此,我将修改你的答案,看看我是否可以调整它来处理一个N大小的窗口。我会发回调查结果!
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
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
for i in xrange(2):
index = i + 19
df['freq_average'] = sum(df['freq'].iloc[index-2:21] / (20-index+3)