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



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

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.分别查找滞后和差异。

熊猫有什么办法可以解决这个问题,或多或少像斯塔塔一样?

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

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

请参阅此链接: 滞后值和差异以及缺少的季度数据

最新更新