Python 中的函数类似于 Stata 中 egenmore 的 xtile()
Function in Python similar to egenmore's xtile() in Stata
我是 Stata 用户并试图在 Python 中复制一些代码。
更具体地说,我想创建一个名为 port
的新列。
在 Stata 中,我实现所需输出的代码是:
egen port = xtile(marketcap), nquantiles(10) by(date)
xtile()
函数是 社区贡献的 包 egenmore
.
的一部分
上面的 egen
命令正在生成一个名为 port
的变量,其中 returns 一个从 1
到 10
的数字,用于每个依赖的观察在每个日期的 marketcap
变量上。
xtile
函数定义了我们正在使用的变量 (marketcap
),而 nquantiles
选项将数据拆分为三分位数。市值在最高三分位数内的代码被编码为 1
,第二高的三分位数被编码为 2
依此类推,直到市值在最低三分位数中的代码被编码为 10
.
结果是每个日期每个代码的 port
变量中的一个数字。这发生在公司市值在不同月份发生变化时,因此将位于不同月份的不同区域。
我使用月度时间序列数据(10 年以上),但包含了 2 个月内 10 个代码的数据:
df.head()
date ticker return marketcap
2004m1 A 0.02500 2.500117e+10
2004m1 B 0.04000 3.600111e+10
2004m1 C -0.01500 4.900222e+11
2004m1 D -0.02500 1.400134e+10
2004m1 E -0.04000 3.200288e+10
2004m1 F -0.01200 9.300110e+10
2004m1 G 0.03500 5.500512e+12
2004m1 H 0.04600 2.100177e+11
2004m1 I 0.00500 3.300155e+10
2004m1 J 0.00750 2.400999e+13
2004m1 K 0.02500 7.700155e+10
2004m2 A 0.03500 2.600118e+10
2004m2 B 0.02000 3.300333e+10
2004m2 C -0.00500 4.500477e+11
2004m2 D 0.01100 1.800155e+10
2004m2 E -0.02000 3.500288e+10
2004m2 F 0.01200 3.001109e+11
2004m2 G 0.04200 5.700442e+12
2004m2 H 0.01100 2.800888e+11
2004m2 I 0.01900 3.600115e+10
2004m2 J 0.00550 2.100333e+13
2004m2 K -0.01500 5.001550e+10
您需要使用pandas.qcut()
函数:
In [1]: df['port'] = df.groupby(['date'])['marketcap'].transform(
lambda x: pd.qcut(x, 10, labels = False))
In [2]: df
Out[2]:
date ticker return marketcap port
0 2004m1 A 0.0250 2.500117e+10 0.0
1 2004m1 B 0.0400 3.600111e+10 3.0
2 2004m1 C -0.0150 4.900222e+11 7.0
3 2004m1 D -0.0250 1.400134e+10 0.0
4 2004m1 E -0.0400 3.200288e+10 1.0
5 2004m1 F -0.0120 9.300110e+10 5.0
6 2004m1 G 0.0350 5.500512e+12 8.0
7 2004m1 H 0.0460 2.100177e+11 6.0
8 2004m1 I 0.0050 3.300155e+10 2.0
9 2004m1 J 0.0075 2.400999e+13 9.0
10 2004m1 K 0.0250 7.700155e+10 4.0
11 2004m2 A 0.0350 2.600118e+10 0.0
12 2004m2 B 0.0200 3.300333e+10 1.0
13 2004m2 C -0.0050 4.500477e+11 7.0
14 2004m2 D 0.0110 1.800155e+10 0.0
15 2004m2 E -0.0200 3.500288e+10 2.0
16 2004m2 F 0.0120 3.001109e+11 6.0
17 2004m2 G 0.0420 5.700442e+12 8.0
18 2004m2 H 0.0110 2.800888e+11 5.0
19 2004m2 I 0.0190 3.600115e+10 3.0
20 2004m2 J 0.0055 2.100333e+13 9.0
21 2004m2 K -0.0150 5.001550e+10 4.0
在 Stata 中使用您的玩具示例:
clear
input str7 date str1 ticker return marketcap
"01/2004" "A" 0.02500 2.500117e+10
"01/2004" "B" 0.04000 3.600111e+10
"01/2004" "C" -0.01500 4.900222e+11
"01/2004" "D" -0.02500 1.400134e+10
"01/2004" "E" -0.04000 3.200288e+10
"01/2004" "F" -0.01200 9.300110e+10
"01/2004" "G" 0.03500 5.500512e+12
"01/2004" "H" 0.04600 2.100177e+11
"01/2004" "I" 0.00500 3.300155e+10
"01/2004" "J" 0.00750 2.400999e+13
"01/2004" "K" 0.02500 7.700155e+10
"02/2004" "A" 0.03500 2.600118e+10
"02/2004" "B" 0.02000 3.300333e+10
"02/2004" "C" -0.00500 4.500477e+11
"02/2004" "D" 0.01100 1.800155e+10
"02/2004" "E" -0.02000 3.500288e+10
"02/2004" "F" 0.01200 3.001109e+11
"02/2004" "G" 0.04200 5.700442e+12
"02/2004" "H" 0.01100 2.800888e+11
"02/2004" "I" 0.01900 3.600115e+10
"02/2004" "J" 0.00550 2.100333e+13
"02/2004" "K" -0.01500 5.001550e+10
end
命令 egen
产生等效结果:
egen port = xtile(marketcap), nquantiles(10) by(date)
list, sepby(date)
+---------------------------------------------+
| date ticker return market~p port |
|---------------------------------------------|
1. | 01/2004 A .025 2.50e+10 1 |
2. | 01/2004 B .04 3.60e+10 4 |
3. | 01/2004 C -.015 4.90e+11 8 |
4. | 01/2004 D -.025 1.40e+10 1 |
5. | 01/2004 E -.04 3.20e+10 2 |
6. | 01/2004 F -.012 9.30e+10 6 |
7. | 01/2004 G .035 5.50e+12 9 |
8. | 01/2004 H .046 2.10e+11 7 |
9. | 01/2004 I .005 3.30e+10 3 |
10. | 01/2004 J .0075 2.40e+13 10 |
11. | 01/2004 K .025 7.70e+10 5 |
|---------------------------------------------|
12. | 02/2004 A .035 2.60e+10 1 |
13. | 02/2004 B .02 3.30e+10 2 |
14. | 02/2004 C -.005 4.50e+11 8 |
15. | 02/2004 D .011 1.80e+10 1 |
16. | 02/2004 E -.02 3.50e+10 3 |
17. | 02/2004 F .012 3.00e+11 7 |
18. | 02/2004 G .042 5.70e+12 9 |
19. | 02/2004 H .011 2.80e+11 6 |
20. | 02/2004 I .019 3.60e+10 4 |
21. | 02/2004 J .0055 2.10e+13 10 |
22. | 02/2004 K -.015 5.00e+10 5 |
+---------------------------------------------+
结果的差异是由于在 Stata 中索引以 1 开头。
我是 Stata 用户并试图在 Python 中复制一些代码。
更具体地说,我想创建一个名为 port
的新列。
在 Stata 中,我实现所需输出的代码是:
egen port = xtile(marketcap), nquantiles(10) by(date)
xtile()
函数是 社区贡献的 包 egenmore
.
上面的 egen
命令正在生成一个名为 port
的变量,其中 returns 一个从 1
到 10
的数字,用于每个依赖的观察在每个日期的 marketcap
变量上。
xtile
函数定义了我们正在使用的变量 (marketcap
),而 nquantiles
选项将数据拆分为三分位数。市值在最高三分位数内的代码被编码为 1
,第二高的三分位数被编码为 2
依此类推,直到市值在最低三分位数中的代码被编码为 10
.
结果是每个日期每个代码的 port
变量中的一个数字。这发生在公司市值在不同月份发生变化时,因此将位于不同月份的不同区域。
我使用月度时间序列数据(10 年以上),但包含了 2 个月内 10 个代码的数据:
df.head()
date ticker return marketcap
2004m1 A 0.02500 2.500117e+10
2004m1 B 0.04000 3.600111e+10
2004m1 C -0.01500 4.900222e+11
2004m1 D -0.02500 1.400134e+10
2004m1 E -0.04000 3.200288e+10
2004m1 F -0.01200 9.300110e+10
2004m1 G 0.03500 5.500512e+12
2004m1 H 0.04600 2.100177e+11
2004m1 I 0.00500 3.300155e+10
2004m1 J 0.00750 2.400999e+13
2004m1 K 0.02500 7.700155e+10
2004m2 A 0.03500 2.600118e+10
2004m2 B 0.02000 3.300333e+10
2004m2 C -0.00500 4.500477e+11
2004m2 D 0.01100 1.800155e+10
2004m2 E -0.02000 3.500288e+10
2004m2 F 0.01200 3.001109e+11
2004m2 G 0.04200 5.700442e+12
2004m2 H 0.01100 2.800888e+11
2004m2 I 0.01900 3.600115e+10
2004m2 J 0.00550 2.100333e+13
2004m2 K -0.01500 5.001550e+10
您需要使用pandas.qcut()
函数:
In [1]: df['port'] = df.groupby(['date'])['marketcap'].transform(
lambda x: pd.qcut(x, 10, labels = False))
In [2]: df
Out[2]:
date ticker return marketcap port
0 2004m1 A 0.0250 2.500117e+10 0.0
1 2004m1 B 0.0400 3.600111e+10 3.0
2 2004m1 C -0.0150 4.900222e+11 7.0
3 2004m1 D -0.0250 1.400134e+10 0.0
4 2004m1 E -0.0400 3.200288e+10 1.0
5 2004m1 F -0.0120 9.300110e+10 5.0
6 2004m1 G 0.0350 5.500512e+12 8.0
7 2004m1 H 0.0460 2.100177e+11 6.0
8 2004m1 I 0.0050 3.300155e+10 2.0
9 2004m1 J 0.0075 2.400999e+13 9.0
10 2004m1 K 0.0250 7.700155e+10 4.0
11 2004m2 A 0.0350 2.600118e+10 0.0
12 2004m2 B 0.0200 3.300333e+10 1.0
13 2004m2 C -0.0050 4.500477e+11 7.0
14 2004m2 D 0.0110 1.800155e+10 0.0
15 2004m2 E -0.0200 3.500288e+10 2.0
16 2004m2 F 0.0120 3.001109e+11 6.0
17 2004m2 G 0.0420 5.700442e+12 8.0
18 2004m2 H 0.0110 2.800888e+11 5.0
19 2004m2 I 0.0190 3.600115e+10 3.0
20 2004m2 J 0.0055 2.100333e+13 9.0
21 2004m2 K -0.0150 5.001550e+10 4.0
在 Stata 中使用您的玩具示例:
clear
input str7 date str1 ticker return marketcap
"01/2004" "A" 0.02500 2.500117e+10
"01/2004" "B" 0.04000 3.600111e+10
"01/2004" "C" -0.01500 4.900222e+11
"01/2004" "D" -0.02500 1.400134e+10
"01/2004" "E" -0.04000 3.200288e+10
"01/2004" "F" -0.01200 9.300110e+10
"01/2004" "G" 0.03500 5.500512e+12
"01/2004" "H" 0.04600 2.100177e+11
"01/2004" "I" 0.00500 3.300155e+10
"01/2004" "J" 0.00750 2.400999e+13
"01/2004" "K" 0.02500 7.700155e+10
"02/2004" "A" 0.03500 2.600118e+10
"02/2004" "B" 0.02000 3.300333e+10
"02/2004" "C" -0.00500 4.500477e+11
"02/2004" "D" 0.01100 1.800155e+10
"02/2004" "E" -0.02000 3.500288e+10
"02/2004" "F" 0.01200 3.001109e+11
"02/2004" "G" 0.04200 5.700442e+12
"02/2004" "H" 0.01100 2.800888e+11
"02/2004" "I" 0.01900 3.600115e+10
"02/2004" "J" 0.00550 2.100333e+13
"02/2004" "K" -0.01500 5.001550e+10
end
命令 egen
产生等效结果:
egen port = xtile(marketcap), nquantiles(10) by(date)
list, sepby(date)
+---------------------------------------------+
| date ticker return market~p port |
|---------------------------------------------|
1. | 01/2004 A .025 2.50e+10 1 |
2. | 01/2004 B .04 3.60e+10 4 |
3. | 01/2004 C -.015 4.90e+11 8 |
4. | 01/2004 D -.025 1.40e+10 1 |
5. | 01/2004 E -.04 3.20e+10 2 |
6. | 01/2004 F -.012 9.30e+10 6 |
7. | 01/2004 G .035 5.50e+12 9 |
8. | 01/2004 H .046 2.10e+11 7 |
9. | 01/2004 I .005 3.30e+10 3 |
10. | 01/2004 J .0075 2.40e+13 10 |
11. | 01/2004 K .025 7.70e+10 5 |
|---------------------------------------------|
12. | 02/2004 A .035 2.60e+10 1 |
13. | 02/2004 B .02 3.30e+10 2 |
14. | 02/2004 C -.005 4.50e+11 8 |
15. | 02/2004 D .011 1.80e+10 1 |
16. | 02/2004 E -.02 3.50e+10 3 |
17. | 02/2004 F .012 3.00e+11 7 |
18. | 02/2004 G .042 5.70e+12 9 |
19. | 02/2004 H .011 2.80e+11 6 |
20. | 02/2004 I .019 3.60e+10 4 |
21. | 02/2004 J .0055 2.10e+13 10 |
22. | 02/2004 K -.015 5.00e+10 5 |
+---------------------------------------------+
结果的差异是由于在 Stata 中索引以 1 开头。