2017-11-10 106 views
0

我是一個stata用戶,我試圖切換到python和我有一些代碼的問題。如果我有以下面板數據面板數據熊貓,根據一定條件變化

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年第三季度沒有身份證件,所以我做了。

在Stata的代碼會是這樣,

bys id: gen jobs_variation=jobs/jobs[_n-12]-1 if fecha[_n-12]==fecha-12

+0

你能解釋一下你如何得到這些結果嗎? –

+0

是的,對於id 1,作業的計算是((2010Q1/2007Q1)-1),((2010Q2/2007Q2)-1)等等。計算從今天到三年前(在同一季度)的工作變化 –

+0

看到我的答案,我相信這就是你要找的。 –

回答

2

IIUC,你需要id一個groupbyquarter其次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年前的相應價值。

+0

@LucasDresl沒辦法,你是否正確地複製它?這裏是單行版本:'df ['jobs_variation'] = df.groupby(['id','quarter'])。jobs.apply(lambda x:x/x.shift(3) - 1)' –

+0

it作品,非常感謝你:) –

+0

@COLDSPEED有任何代碼可以走得更快?,我有22百萬記錄,並使用功能分組和應用需要太長時間 –