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

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在2006年第二季度发行了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.分别查找滞后和差异。

像Stata一样,大熊猫有什么办法可以解决这个问题?

最佳答案

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

关于python - 缺少季度时如何确定 Pandas 数据框的季度行值的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42884703/

10-12 21:20