2017-03-19 5 views
1

j'essaie de trouver la différence dans la valeur des actions du bilan trimestriel de la trame de données suivantes:Comment déterminer la différence entre les valeurs trimestrielles de ligne d'une trame de données de pandas géants en quartiers manquent

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']] 

Le cadre montre l'équité valeurs à la fin des trimestres par an: EquityEoQ. Remarque, NewEqRight affiche les valeurs comme il se doit, avec des valeurs manquantes pour 2007Q4 et 2008Q2.

Je peux trouver la variation des fonds propres par trimestre en prenant la différence entre les valeurs des lignes. Par exemple, la société ID001 a émis 111 nouveaux capitaux propres en 2006 T2 (111 = 223 - 112). Si toutes les lignes trimestrielles des données sont présentes, je peux utiliser shift pour créer une nouvelle colonne avec les fonds propres du dernier trimestre (EquityEoLastQ) et une autre colonne qui enregistre la différence entre EquityEoQ et EquityEoLastQ pour obtenir la variation des capitaux propres:

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'] 

La dernière ligne corrige les valeurs de Q1.

Mais s'il manque des rangées trimestrielles, alors shift est endommagé. Par exemple, dans la trame de données, les lignes pour 2007Q4 et 2008Q1 sont manquantes. Cela conduit à des informations incorrectes, car shift fait référence au mauvais trimestre. Dans ce cadre, cette approche donne une valeur négative de NewEqWrong pour 2008Q2 est -85,0, ce qui est la valeur erronée.

désiré ensemble de données:

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 

Dans un Stata peut régler la fréquence des séries chronologiques à tous les trois mois, et ensuite utiliser L. ou D. pour trouver respectivement les retards et les différences.

Est-il possible pandas géants peuvent traiter ce problème, plus ou moins comme Stata?

+0

Il serait beaucoup plus facile pour nous de vous aider si vous fournir un ensemble de données souhaitées ... – MaxU

+0

Les données que je fournis illustre bien mon point. Je veux dire, les données d'origine contient environ 400 000 lignes. –

+0

Ajout d'une colonne avec des données correctes « NewEqRight » –

Répondre

1

IIUC vous pouvez le faire de cette façon:

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

Malheureusement, cela ne fonctionnera pas, car il se les observations de Q1 à NaN –

+0

@martienlubberink, c'est pourquoi je vous ai demandé de fournir un ensemble de données souhaité (en fonction de votre ensemble d'échantillons de données) .. – MaxU

+0

La valeur de fin de trimestre Q1 est la valeur NewEquity, les valeurs Q2, Q3, Q4 sont la différence entre les valeurs Q2 et Q1, Q3 et Q2 et Q4 et Q3. –