2016-11-18 15 views
3

私は四半期米国GDPのデータフレームを列の値として持っています。私は一度に3つの価値観を見て、GDPが次の2四半期連続で下落した指数を見つけたいと思います。これは、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から始まる1つの特定のウィンドウ、見てみましょうします:

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

短い答えは:できませんが、データフレーム/シリーズの構造についての知識を使用することができます。

あなたは、ウィンドウのサイズを知って、あなたは現在のインデックスを知っている - ので、あなたは、出力電流のインデックスへのシフトの相対的なことができます。

はさんはふりましょう、ここにあなたのGDPは次のとおりです。

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)を返し、現在のインデックスに追加することです:もしC以来

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(ウィンドウ= 3)している場合。apply(lambda:find_recession_start(win))、find_recession_start()内でwinの要素にアクセスするにはどうすればよいですか? – Codedorf

+0

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

+0

はい!それが私が探していたものです。ありがとうございました! – Codedorf

0

.apply()内のラムダ式を使用すると、カスタム関数(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 
関連する問題