Python 面板数据,根据特定条件的变化
我是一个stata用户,我试图切换到python,我对一些代码有问题。如果我有以下面板数据Python 面板数据,根据特定条件的变化,python,pandas,numpy,stata,Python,Pandas,Numpy,Stata,我是一个stata用户,我试图切换到python,我对一些代码有问题。如果我有以下面板数据 id year quarter fecha jobs 1 2007 1 220 10 1 2007 2 221 12 1 2007 3 222 12 1 2007
id year quarter fecha jobs
1 2007 1 220 10
1 2007 2 221 12
1 2007 3 222 12
1 2007 4 223 12
1 2008 1 224 12
1 2008 2 225 13
1 2008 3 226 14
1 2008 4 227 9
1 2009 1 228 12
1 2009 2 229 15
1 2009 3 230 18
1 2009 4 231 15
1 2010 1 232 15
1 2010 2 233 16
1 2010 3 234 17
1 2010 4 235 18
2 2007 1 220 10
2 2007 2 221 12
2 2007 3 222 12
2 2007 4 223 12
2 2008 1 224 12
2 2008 2 225 13
2 2008 3 226 14
2 2008 4 227 9
2 2009 1 228 12
2 2009 2 229 15
2 2009 3 230 18
2 2009 4 231 15
2 2010 1 232 15
2 2010 2 233 16
2 2010 4 235 18
(我的面板数据比示例大得多,只是为了说明我的问题)。我想计算同一季度和三年前工作岗位的变化
所以结果应该是这样的
id year quarter fecha jobs jobs_variation
1 2007 1 220 10 Nan
1 2007 2 221 12 Nan
1 2007 3 222 12 Nan
1 2007 4 223 12 Nan
1 2008 1 224 12 Nan
1 2008 2 225 13 Nan
1 2008 3 226 14 Nan
1 2008 4 227 9 Nan
1 2009 1 228 12 Nan
1 2009 2 229 15 Nan
1 2009 3 230 18 Nan
1 2009 4 231 15 Nan
1 2010 1 232 15 0.5
1 2010 2 233 16 0.33
1 2010 3 234 17 0.30769
1 2010 4 235 18 0.5
2 2007 1 220 10 Nan
2 2007 4 223 12 Nan
2 2008 1 224 12 Nan
2 2008 2 225 13 Nan
2 2008 3 226 14 Nan
2 2008 4 227 9 Nan
2 2009 1 228 12 Nan
2 2009 2 229 15 Nan
2 2009 3 230 18 Nan
2 2009 4 231 15 Nan
2 2010 1 232 15 0.5
2 2010 2 233 16 Nan
2 2010 3 234 20 Nan
2 2010 4 235 18 0.5
检查2010年第二季度和第三季度的id是否不能计算,因为2007年第二季度和2007年第三季度的id不存在
在stata,代码是
bys id:gen jobs\u variation=jobs/jobs[\u n-12]-1如果fecha[\u n-12]==fecha-12
IIUC,您需要在id
和quarter
上添加groupby
:
df['jobs_variation'] = df.groupby(['id', 'quarter']).jobs\
.apply(lambda x: x / x.shift(3) - 1)
df
id year quarter fecha jobs jobs_variation
0 1 2007 1 220 10 NaN
1 1 2007 2 221 12 NaN
2 1 2007 3 222 12 NaN
3 1 2007 4 223 12 NaN
4 1 2008 1 224 12 NaN
5 1 2008 2 225 13 NaN
6 1 2008 3 226 14 NaN
7 1 2008 4 227 9 NaN
8 1 2009 1 228 12 NaN
9 1 2009 2 229 15 NaN
10 1 2009 3 230 18 NaN
11 1 2009 4 231 15 NaN
12 1 2010 1 232 15 0.500000
13 1 2010 2 233 16 0.333333
14 1 2010 3 234 17 0.416667
15 1 2010 4 235 18 0.500000
16 2 2007 1 220 10 NaN
17 2 2007 4 223 12 NaN
18 2 2008 1 224 12 NaN
19 2 2008 2 225 13 NaN
20 2 2008 3 226 14 NaN
21 2 2008 4 227 9 NaN
22 2 2009 1 228 12 NaN
23 2 2009 2 229 15 NaN
24 2 2009 3 230 18 NaN
25 2 2009 4 231 15 NaN
26 2 2010 1 232 15 0.500000
27 2 2010 2 233 16 NaN
28 2 2010 3 234 20 NaN
29 2 2010 4 235 18 0.500000
x/x.shift(3)
将当前年度(该季度)的工作计数除以3年前的相应值 IIUC,您需要在id
和quarter
上设置groupby
,然后是apply
:
df['jobs_variation'] = df.groupby(['id', 'quarter']).jobs\
.apply(lambda x: x / x.shift(3) - 1)
df
id year quarter fecha jobs jobs_variation
0 1 2007 1 220 10 NaN
1 1 2007 2 221 12 NaN
2 1 2007 3 222 12 NaN
3 1 2007 4 223 12 NaN
4 1 2008 1 224 12 NaN
5 1 2008 2 225 13 NaN
6 1 2008 3 226 14 NaN
7 1 2008 4 227 9 NaN
8 1 2009 1 228 12 NaN
9 1 2009 2 229 15 NaN
10 1 2009 3 230 18 NaN
11 1 2009 4 231 15 NaN
12 1 2010 1 232 15 0.500000
13 1 2010 2 233 16 0.333333
14 1 2010 3 234 17 0.416667
15 1 2010 4 235 18 0.500000
16 2 2007 1 220 10 NaN
17 2 2007 4 223 12 NaN
18 2 2008 1 224 12 NaN
19 2 2008 2 225 13 NaN
20 2 2008 3 226 14 NaN
21 2 2008 4 227 9 NaN
22 2 2009 1 228 12 NaN
23 2 2009 2 229 15 NaN
24 2 2009 3 230 18 NaN
25 2 2009 4 231 15 NaN
26 2 2010 1 232 15 0.500000
27 2 2010 2 233 16 NaN
28 2 2010 3 234 20 NaN
29 2 2010 4 235 18 0.500000
x/x.shift(3)
将当前年度(该季度)的工作计数除以3年前的相应值 你能解释一下你是如何得到这些结果的吗?是的,对于id 1,工作的计算是((2010Q1/2007Q1)-1),((2010Q2/2007Q2)-1)等等。计算从今天到三年前(同一季度)的工作变化见我的答案,我相信这就是你想要的。你能解释一下你是如何得到这些结果的吗?是的,对于id 1,工作的计算是((2010Q1/2007Q1)-1),((2010Q2/2007Q2)-1)等等。计算一下从今天到三年前(同一季度)的工作变化见我的答案,我相信这就是你要找的。@LucasDresl不可能,你复制的正确吗?这是单行版本:df['jobs\u variation']=df.groupby(['id','quarter']).jobs.apply(lambda x:x/x.shift(3)-1)
@COLDSPEED有没有更快的代码?我有2200万条记录,使用按函数分组和apply也需要long@LucasDresl不是香草熊猫,但是你应该考虑看<代码> DASK < /代码>数据文件。这是单行版本:df['jobs\u variation']=df.groupby(['id','quarter']).jobs.apply(lambda x:x/x.shift(3)-1)
@COLDSPEED有没有更快的代码?我有2200万条记录,使用按函数分组和apply也需要long@LucasDresl不是香草熊猫,但是你应该考虑看<代码> DASK < /COD>数据框。