2016-11-18 13 views
3

我有一個數據框,以美國季度GDP作爲列值。我想一次查看3個值,並找出GDP連續兩個季度下降的指數。這意味着我需要將df ['GDP']內的各個元素相互進行比較,分組爲3.如何訪問數據框上的滾動窗口中的單個元素

下面是一個示例數據框。

df = pd.DataFrame(data=np.random.randint(0,10,10), columns=['GDP']) 
df 

    GDP 
0 4 
1 4 
2 4 
3 1 
4 4 
5 4 
6 8 
7 2 
8 3 
9 9 

我使用df.rolling().apply(find_recession),但我不知道我怎麼可以在我的find_recession()函數內訪問滾動窗口的各個元素。

gdp['Recession_rolling'] = gdp['GDP'].rolling(window=3).apply(find_recession_start) 

如何才能獲得滾動窗口內的各個元素,所以我可以作出gdp_val_2 < gdp_val_1 < gdp_val這樣的比較? 。

的.rolling()申請()將經過整個數據幀,3個值的時間,讓我們來看看一個特定的窗口,它開始於索引位置6:

GDP 
6 8 # <- gdp_val 
7 2 # <- gdp_val_1 
8 3 # <- gdp_val_2 

我如何在當前窗口中訪問gdp_val,gdp_val_1和gdp_val_2?

+0

你的問題還不清楚。一小部分數據和預期結果將會有所幫助。請閱讀[MCVE](http://stackoverflow.com/help/mcve)。 – Kartik

+1

[The docs](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.window.Rolling.apply.html#pandas.core.window.Rolling.apply)表示該函數'''必須從ndarray輸入中產生一個值...''。所以你只需將*索引到*它。我想這是通過的第一個位置參數。編寫一個虛函數來打印它傳遞的內容。 – wwii

+0

嘗試'''numpy.all(a [1:] wwii

回答

0

簡短的回答是:你不能,但你可以使用你對數據框/系列結構的知識。

你知道該窗口的大小,你知道現在的指數 - 因此,您可以輸出相對於當前指數的變化:

讓我們假設,這裏是你的國內生產總值:

In [627]: gdp 
Out[627]: 
0 8 
1 0 
2 0 
3 4 
4 0 
5 3 
6 6 
7 2 
8 5 
9 5 
dtype: int64 

天真的辦法就是返回(argmin() - 2)並將其添加到當前指數:

In [630]: gdp.rolling(window=3).apply(lambda win: win.argmin() - 2) + gdp.index 
Out[630]: 
0 NaN 
1 NaN 
2 1.0 
3 1.0 
4 2.0 
5 4.0 
6 4.0 
7 7.0 
8 7.0 
9 7.0 
dtype: float64 

簡易方法不會返回正確的結果,因爲你ç不會預測當價值相等時以及中間上漲時它會返回哪個指數。但你明白這個主意。

+0

感謝您的輸入。這不是我正在尋找的。我需要知道如何訪問自定義函數中win數組的各個元素。所以如果我有gdp.rolling(window = 3)。(lambda win:find_recession_start(win)),如何在find_recession_start()中訪問win的元素? – Codedorf

+0

@Codedorf:win [0],win [1],win [2]? – newtover

+0

是的!這就是我一直在尋找的。謝謝! – Codedorf

0

在.apply()中使用lambda表達式將傳遞一個數組到自定義函數(find_recession_start),所以我可以像訪問任何列表/數組一樣訪問元素,例如arr[0], arr[1], arr[2]

df = pd.DataFrame(data=np.random.randint(0,10,10), columns=['GDP']) 

def my_func(arr): 
    if((arr[2] < arr[1]) & (arr[1] < arr[0])): 
     return 1 
    else: 
     return 0 

df['Result'] = df.rolling(window=3).apply(lambda x: my_func(x)) 
df 

    GDP Result 
0 8 NaN 
1 0 NaN 
2 8 0.0 
3 1 0.0 
4 9 0.0 
5 7 0.0 
6 9 0.0 
7 8 0.0 
8 3 1.0 
9 9 0.0 
相關問題