python - Pandas :使用分组数据创建滞后列

标签 python pandas time-series lag

我正在使用以下 DataFrame:

url='https://raw.githubusercontent.com/108michael/ms_thesis/master/crsp.csv'

df=pd.read_csv(url)

df.head()

    feccandid   fec.dyn feccf   cid     date_crsp   catcode     amtsum
0   S8VT00018   NaN     NaN     N00000534   2005    J2100        2.1
1   S8VT00018   NaN     NaN     N00000534   2005    L1200        5.0
2   S8VT00018   NaN     NaN     N00000534   2005    J7300        0.0
4   S8NM00127   0.561   0.382   N00015616   2006    G2900        2.5
5   S8NJ00350   -0.329  NaN     N00000854   2005    LG000        7.5

我想按年滞后 amtsum 值。以下代码展示了我如何推导出 amtsum 并深入了解我想要的结果的性质:

crsp['amtsum']=crsp[['date_crsp', 'cid', 'catcode', 'amount']].\
groupby(['date_crsp', 'catcode','cid']).amount.transform('sum')
crsp['amtsum'] = crsp['amtsum'] / 1000
crsp.drop(['amount'], axis=1, inplace=True)
crsp.drop_duplicates(inplace=True, keep='first')

我尝试使用以下代码获取滞后值:

crsp['amtsumlag.1']=crsp.groupby(['date_crsp','catcode', 'cid'])['amtsum'].shift(1)

返回

    feccandid   fec.dyn     feccf   cid     date_crsp   catcode     amtsum  amtsumlag.1
0   S8VT00018   NaN     NaN     N00000534   2005       J2100    2.1     NaN
1   S8VT00018   NaN     NaN     N00000534   2005       L1200    5.0     NaN
2   S8VT00018   NaN     NaN     N00000534   2005       J7300    0.0     NaN
4   S8NM00127   0.561   0.382   N00015616   2006       G2900    2.5     NaN
5   S8NJ00350   -0.329  NaN     N00000854   2005       LG000    7.5     NaN

由于我的 date_crsp 范围是从 2005 年到 2014 年,我希望 2005 年有 NaN 但 2006 年没有。我也只选择了 2005 年之后的日期并得到相同的结果。有没有人知道如何解决这个问题?

最佳答案

您需要查看您的 .groupby() 逻辑。

crsp.groupby(['date_crsp','catcode', 'cid']).size().value_counts()

结果

1    444508
2      5281
3       619
4         3

大多数组只有一个值,因此没有太多可移动的值。不出所料,

crsp['amtsumlag.1'] = crsp.groupby(['catcode', 'cid', 'date_crsp'])['amtsum'].shift(1)

结果:

Data columns (total 8 columns):
feccandid             456939 non-null object
feccandcfscore.dyn    445710 non-null float64
feccandcfscore        355887 non-null float64
cid                   456939 non-null object
date_crsp             456939 non-null int64
catcode               456939 non-null object
amtsum                456939 non-null float64
amtsumlag.1           6528 non-null float64

例如,如果您想在date_crsp 之前.shift(),您可能不想在.groupby() 中使用它> - 每个组将只包含一年。人们希望在 .groupby() 中看到唯一的组 id 变量,理想情况下是 DateTimeIndex,或者排序的 DataFrame。所以 .sort_values('date_crsp') 可能是个好主意。

crsp['amtsumlag.1'] = crsp.sort_values('date_crsp').groupby(['catcode', 'cid'])['amtsum'].shift(1)

而是产生:

feccandid             456939 non-null object
feccandcfscore.dyn    445710 non-null float64
feccandcfscore        355887 non-null float64
cid                   456939 non-null object
date_crsp             456939 non-null int64
catcode               456939 non-null object
amtsum                456939 non-null float64
amtsumlag.1           301280 non-null float64
dtypes: float64(4), int64(1), object(3)

如果没有足够的数据来理解是什么识别了您试图落后的群体,则很难提供更具体的答案。

关于python - Pandas :使用分组数据创建滞后列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37231844/

相关文章:

python - socket.getfqdn() 和 socket.gethostname() 在使用 socket.gethostname 时给出不同的 IP 地址

python - 如何在 Heroku 上启动你已经制作好的 Django 应用程序

python - 通过 MultiOutputRegressor 进行网格搜索?

python-3.x - 如何重命名列表中列中的值?

python - Pandas,如何引用时间序列项目?

python - "numpy.logical_or"对应的多元素运算符版本是什么?

python - 将压缩的 CSV 文件转换为 Dataframe

python - 使用 matplotlib 绘图时如何排序分类月份变量?

r - 基于时间窗口的不规则时间序列的优化滚动函数

R将具有开始和结束年份的数据帧转换为时间序列