2014-09-02 2 views
1

팬더의 rolling_mean 함수를 사용하여 Google Ngram Viewer의 스무딩 기능을 다시 만들려고합니다. 마지막 N 행 (N은 선택된 창 크기와 동일한 경우)을 제외하고는 모두 NaN의 결과가 큽니다. 나는 NaN이 존재하는 이유를 이해하지만 팬더가 가능한 최대 윈도우 크기를 가진 마지막 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 

가 :

 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 
,536,913,632 :

df['freq_average'] = pd.rolling_mean(df['freq'],5,min_periods=0,center=True) 

나는이 결과를 얻을 10

그래서 내가 찾고있는 위의 결과를 계산하는 방법이지만 인덱스 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 

내가 하루 정도이에 내 머리를 두드리는 있었어요 운이 없었습니다. 어떤 방향으로 대단히 감사합니다!

+0

보다 직선적이며 효율적인 솔루션이있을 수 있지만 직접 계산 한 적이 있습니까? 즉, i = 16에서 i = 20, 평균값을 20에서 20으로 계산하는 반복적 인 방법을 만드는 것은 어렵지 않습니다. – Inox

+1

낯선 사람이라도 rolling_mean을 할 때 다른 숫자를 얻습니다. 단 2 개의 NaN 라인 . 이것을 다시 확인할 수 있습니까? –

+0

@Inox - 귀하의 제안과 함께 나아갈 방향에 대한 조언이 있습니까? – dumbbyte

답변

0

Cent2 = True를 사용할 때 마지막 두 줄만 NaN이라고 말하면 Andy Hayden와 동의해야합니다. (이전 2에서 다음 2로 평균화됩니다).

그리고 파이썬은 첫 번째 행에서 필요한 것을 자동으로 수행합니다 (사용할 수있는 평균을 취함).하지만 맨 아래에서 수행하지는 않습니다. 논리는 사용 가능한 경우 이전 값 2 개와 다음 값 2 개를 얻는 것입니다. 그래서

는 상단 행의 논리를 다음과 같이하십시오

for i in xrange(2): 
    index = i + 19 
    df['freq_average'] = sum(df['freq'].iloc[index-2:21]/(20-index+3) 

이 말 (21)까지이 개 이전 값 (인덱스 -2) 세트의 평균 소요됩니다. 이것은 귀하의 특정 문제를 지향합니다. 다른 창을 위해 당신은 적응할 필요가 있습니다.

+0

df [ 'freq_average'] = pd.rolling_mean (df [ 'freq'], 5, min_periods = 0, center = True)에서 min_periods = 0을 제거하면 참조하는 것과 비슷한 결과를 얻습니다. 5의 창에 대해서만, 처음 5 개의 결과와 마지막 5 개의 결과가 NaN으로 나타납니다. 그 말로는, 당신의 답을 고치고 N 개의 크기의 창을 다루기 위해 그것을 적용 할 수 있는지 알아볼 것입니다. 나는 결과와 함께 다시 게시 할 것이다! – dumbbyte

+0

의미가 있습니다. – Inox

0

'help (pd.rolling_mean)'에 따르면 min_periods = 0으로 설정하면 (찾고있는 것처럼) 찾고있는 것을해야합니다. 그러나 pandas 0.14.1에서는 rolling_ * 함수를 구현할 때 center = True를 사용할 때 NaN이 끝에 놓이게하는 버그가 있습니다. 버그보고는 https://github.com/pydata/pandas/issues/6795입니다.

관련 문제