Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:使用分组数据创建滞后列_Python_Pandas_Time Series_Lag - Fatal编程技术网

Python 熊猫:使用分组数据创建滞后列

Python 熊猫:使用分组数据创建滞后列,python,pandas,time-series,lag,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

我正在使用以下
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
值逐年延迟。下面的代码显示了我是如何导出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

由于我的
日期\u 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
例如,如果您想按日期
使用
.shift()
,您可能不想在
.groupby()
中使用它-每个组将只包含一年。人们希望在
.groupby()
中看到唯一的组
id
变量,理想情况下是一个
DateTimeIndex
,或者一个排序的
DataFrame
。因此,
.sort\u values('date\u 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)

如果不了解足够的数据,无法理解您试图落后的群体的特征,则很难提供更具体的答案。

如果您想将年份调整一次,请准备一列新的年份:

crsp['next_year'] = crsp['date_crsp'] + 1
然后按
[“下一年”、“catcode”、“cid”]
分组,而不是按
[“日期”、“catcode”、“cid”]

crsp['amtsumlag.1'] = (crsp.groupby(['next_year', 'catcode', 'cid'])['amount']
                       .transform('sum'))

感谢您的评论和建议。我认识到没有唯一索引是一个问题。不幸的是,它不是一个非常“正常”的数据帧。我在胡思乱想一些不同的想法,例如,根据
日期crsp
创建一个
日期crsp\u滞后
,看看这样的方法是否可行。非常感谢你的回答,这是一个适合不同情况的聪明解决方案。