2016-11-05 4 views
1

私は、1つの期間(年と四半期)の列と、その期間のいくつかの生産性番号の別の列からなるデータフレームを持っています。私の仕事は、例えば、私は2つの連続した生産性の低下がある期間を特定することです。または同様に、成長の2つの連続した四半期。私はブルートフォースを使用して、一度にいくつかの行を見て行をループすることができますが、これは "シフト"機能と何かがあるかもしれないことを読んでいた - しかし、あなたの助け特定の方向に変化する列の値を決定する方法は?

 
    1971q1 1,137.8 
    1971q2 1,159.4 
    1971q3 1,180.3 
    1971q4 1,173.6 
    1972q1 1,163.8 
    1972q2 1,140.1 
    1972q3 1,145.8 
    1972q4 1,150.0 
+0

できますが、[ポスト](http://stackoverflow.com/posts/40444498/edit)希望(予定)のデータセットを:ここで

は識別するのに役立ちます方法が成長し低下しているのですか? – MaxU

+0

希望の出力はデータセットではなく、カレンダー期間です。問題は、いつ景気後退が始まったのか?あるいは、景気後退の時期はいつですか? – alernerdev

+0

サンプル(投稿)データセットの期間はどのくらいですか? PSは値が常に成長しています... – MaxU

答えて

1

いただきありがとうございますが、ご希望のデータセットがどのように見えるべきか私にはそれはまだ非常にはっきりしていないこのバディ

#define a growth rate 
df['growth_rate'] = np.log(df.production) - np.log(df.production).shift(1) 
#a recession is when there have been two quarters of negative growth. 
df['recession'] = (df['growth_rate'] < 0) & (df['growth_rate'].shift(1) < 0) 
0

を試してみてください。

In [450]: df 
Out[450]: 
    period  val 
0 1971q1 1137.8 
1 1971q2 1159.4 
2 1971q3 1180.3 
3 1971q4 1173.6 
4 1972q1 1163.8 
5 1972q2 1140.1 
6 1972q3 1145.8 
7 1972q4 1150.0 

In [451]: np.sign(df.val.diff().fillna(0)) 
Out[451]: 
0 0.0 
1 1.0 
2 1.0 
3 -1.0 
4 -1.0 
5 -1.0 
6 1.0 
7 1.0 
Name: val, dtype: float64 

In [452]: df.loc[np.sign(df.val.diff().fillna(0)) < 0] 
Out[452]: 
    period  val 
3 1971q4 1173.6 
4 1972q1 1163.8 
5 1972q2 1140.1