2016-11-05 1 views
1

필자는주기 (1 년 및 4 분기)의 1 열과 해당 기간의 생산성 번호의 또 다른 열로 구성된 데이터 프레임을 보유하고 있습니다. 내 임무는 예를 들어 2 분기 동안 생산성 하락이 있었던 기간을 확인하는 것입니다. 또는 이와 유사하게 2 분기 연속 성장합니다. 나는 브 루트 포스 (brute force)를 사용할 수 있고 한 번에 여러 행을보고있는 행을 반복 할 수 있다고 상상합니다. 그러나 이것은 "교대"기능과 관련이있을 수 있음을 읽고있었습니다. 그러나 어떻게 작동하는지 이해하지 못합니다. 당신의 도움이특정 방향으로 변경되는 열 값을 결정하는 방법은 무엇입니까?

 
    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

샘플 (게시 된) 데이터 세트의 기간을 말할 수 있습니까? 추신 : 가치는 지속적으로 성장하고 있습니다 ... – 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 
관련 문제