【问题标题】:How to determine the difference in quarterly row values of a pandas dataframe when quarters are missing缺少季度时如何确定熊猫数据框的季度行值的差异
【发布时间】:2017-08-10 14:46:33
【问题描述】:

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

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?

【问题讨论】:

  • 如果您提供所需的数据集,我们会更容易为您提供帮助...
  • 我提供的数据确实说明了我的观点。我的意思是,原始数据包含大约 400,000 行。
  • 添加了包含正确数据'NewEqRight'的列

标签: python pandas dataframe time-series financial


【解决方案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

【讨论】:

  • 不幸的是,这行不通,因为它将所有 Q1 观察结果都转换为 NaN
  • @martienlubberink,这就是为什么我要求您提供所需的数据集(基于您的样本数据集)...
  • Q1 季末值是 NewEquity 值,Q2、Q3、Q4 值是 Q2 和 Q1、Q3 和 Q2 以及 Q4 和 Q3 值之间的差异。
  • @martienlubberink,显示您想要实现的目标的最简单方法是to post your desired data set in your question...
【解决方案2】:

基本上,我意识到我想合并数据。然后它可以按需要工作:

查看此链接:lag values and differences and missing quarterly data

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 2022-10-07
    • 2022-01-12
    • 1970-01-01
    • 2018-04-26
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多