2017-03-19 13 views
1

내가 다음 데이터 프레임에서 분기 대차 대조표의 자본 값의 차이를 찾기 위해 노력하고 누락 때 팬더 dataframe의 분기 별 행 값의 차이를 확인하는 방법 :

import pandas as pd 
import numpy as np 

df2= pd.DataFrame({'FirmID' : pd.Series(['ID001', 'ID001', 'ID001', 'ID001', 'ID001', 'ID001', 'ID001', 'ID001', 'ID001', 'ID001' ]), 
        'RSSD9999' : pd.Series([20060331, 20060630, 20060930, 20061231, 20070331,20070630, 20070930, 20080630, 20080930, 20081231]), 
        'year'  : pd.Series([2006,  2006,  2006,  2006,  2007, 2007,  2007,  2008,  2008,  2008 ]), 
        'Q'   : pd.Series([1,  2,  3,  4,  1,  2,  3,   2,  3,  4  ]), 
        'EquityEoQ' : pd.Series([112,  223,  333,  445,  126,  251,  376,  291,  291,  503  ]), 
        'NewEqRight': pd.Series([112,  111,  110,  112,  126,  125,  125,  np.nan,  0 ,  212, ])}) 
df2=df2[['FirmID','RSSD9999', 'year', 'Q', 'EquityEoQ','NewEqRight']] 

프레임은 주식을 보여줍니다 연말 분기의 가치 : EquityEoQ. 참고로 NewEqRight은 2007Q4 및 2008Q2 값이 누락 된 상태로 값을 표시합니다.

행 값의 차이를 사용하여 분기 별 자본 변화를 확인할 수 있습니다. 예를 들어, 회사 ID001은 2006Q2에 111 개의 새로운 지분을 발행했습니다 (111 = 223 - 112).

데이터의 모든 분기 별 행이있는 경우 을 사용하여 지난 분기의 자본 (EquityEoLastQ)이있는 새 열과 EquityEoQ와 EquityEoLastQ의 차이가 기록 된 새 열을 만들어 자본의 변화를 얻을 수 있습니다.

df2['EquityEoLastQ'] = df2.groupby(['FirmID'])['EquityEoQ'].shift(1) 
df2['NewEqWrong']  = df2['EquityEoQ']-df2['EquityEoLastQ'] 
df2.loc[df2['Q']==1, 'NewEqWrong'] = df2.loc[df2['Q']==1, 'EquityEoQ'] 

마지막 행은 Q1의 값을 수정합니다.

분기 별 행이 누락 된 경우 shift가 엉망입니다. 예를 들어 데이터 프레임에서 2007Q4 및 2008Q1의 행이 누락되었습니다. shift은 잘못된 분기를 나타 내기 때문에 잘못된 정보가 표시됩니다. 이 프레임에서이 접근법은 2008Q2의 음수가 NewEqWrong인데 잘못된 값인 -85.0입니다.

원하는 데이터 세트 :

In [9]: df2 
Out[9]: 
    FirmID RSSD9999 year Q EquityEoQ NewEqRight EquityEoLastQ NewEqWrong 
0 ID001 20060331 2006 1  112  112.0   NaN  112.0 
1 ID001 20060630 2006 2  223  111.0   112.0  111.0 
2 ID001 20060930 2006 3  333  110.0   223.0  110.0 
3 ID001 20061231 2006 4  445  112.0   333.0  112.0 
4 ID001 20070331 2007 1  126  126.0   445.0  126.0 
5 ID001 20070630 2007 2  251  125.0   126.0  125.0 
6 ID001 20070930 2007 3  376  125.0   251.0  125.0 
7 ID001 20080630 2008 2  291   NaN   376.0  -85.0 
8 ID001 20080930 2008 3  291   0.0   291.0   0.0 
9 ID001 20081231 2008 4  503  212.0   291.0  212.0 

STATA 한 각각 시차과 차이점을 발견 L. D. 또는 다음 분기를 사용하여 시계열 주파수를 설정하고있다.

팬더가이 문제를 해결할 수있는 방법이 있습니까? Stata와 다소 비슷합니까? 당신이이 방법을 수행 할 수 있습니다

+0

당신이 원하는 데이터 세트를 제공 할 경우, 우리가 당신을 도울 훨씬 쉬울 것 ... 내가 제공 – MaxU

+0

데이터는 나의 점을 설명하지 :

이 링크를 참조하십시오. 원래 데이터에는 약 400,000 개의 행이 들어 있습니다. –

+0

올바른 데이터 'NewEqRight'가있는 열을 추가했습니다. –

답변

1

IIUC는 :

In [48]: df2 
Out[48]: 
    EquityEoQ FirmID Q RSSD9999 year 
0  112 ID001 1 20060331 2006 
1  223 ID001 2 20060630 2006 
2  333 ID001 3 20060930 2006 
3  445 ID001 4 20061231 2006 
4  126 ID001 1 20070331 2007 
5  251 ID001 2 20070630 2007 
6  376 ID001 3 20070930 2007 
7  291 ID001 2 20080630 2008 
8  291 ID001 3 20080930 2008 
9  503 ID001 4 20081231 2008 

In [49]: df2['NewEquity'] = \ 
      df2.sort_values(['year','Q']).groupby(['FirmID','year'])['EquityEoQ'].diff() 

In [50]: df2 
Out[50]: 
    EquityEoQ FirmID Q RSSD9999 year NewEquity 
0  112 ID001 1 20060331 2006  NaN 
1  223 ID001 2 20060630 2006  111.0 
2  333 ID001 3 20060930 2006  110.0 
3  445 ID001 4 20061231 2006  112.0 
4  126 ID001 1 20070331 2007  NaN 
5  251 ID001 2 20070630 2007  125.0 
6  376 ID001 3 20070930 2007  125.0 
7  291 ID001 2 20080630 2008  NaN 
8  291 ID001 3 20080930 2008  0.0 
9  503 ID001 4 20081231 2008  212.0 
+0

모든 Q1 관측치를 NaN –

+0

@martienlubberink로 바꾸기 때문에 불행히도 작동하지 않습니다. 그래서 샘플 데이터 세트를 기반으로 원하는 데이터 세트를 제공해야합니다. – MaxU

+0

Q1 분기 끝 값은 NewEquity 값이고 Q2, Q3, Q4 값은 Q2와 Q1, Q3과 Q2 및 Q4와 Q3 값의 차이입니다. –