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

标签 python pandas dataframe time-series financial

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

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

该框架显示每年季度末的股权值(value):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.分别求滞后和差异。

pandas 有没有办法解决这个问题,或多或少像 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/

相关文章:

python - 如何解决 pandas 的内存分配问题?

r - 按列名向量和常量列名过滤数据框

R - 使用循环搜索一个变量与另一个变量并创建新的合并变量

python - 在 Python 中解析电子邮件的 "From:"字段

python - seaborn : plotting time on x-axis

Pandas to_sql 使索引唯一

r - 使用 R : drop rows efficiently based on different conditions

python - Python 排序代码语法

python - 命名将对象转换为另一种格式的方法的惯用 Python 方式

python - 在数据框列中获取 NaN 而不是正确的值