如何在缺少季度时确定pandas数据帧的季度行值的差异

时间:2017-03-19 08:57:08

标签: python pandas dataframe time-series financial

我试图从以下数据框中找出季度资产负债表权益值的差异:

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)。

如果数据中的所有季度行都存在,那么我可以使用shift创建一个包含上一季度权益(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.分别找出滞后和差异。

pandas有没有办法解决这个问题,或多或少像Stata?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

基本上,我意识到我想合并数据。然后按预期工作:

请参阅此链接:lag values and differences and missing quarterly data