我将它作为csv在熊猫中工作-前十行:
简化的df如下: permno price mv yearmonth
1752 10057 18.1250 7.898875e+04 198301
4732 10137 23.7500 1.130191e+06 198301
6144 10153 9.7500 1.226550e+05 198302
7869 10225 45.8750 2.530740e+06 198302
8267 10233 57.6250 1.670894e+06 198303
8692 10241 30.8750 5.742132e+06 198303
想按年月分组,并根据mv分为5组,方法是将每年每个月分成5个分位数以获得预期结果:
yearmonth:198301, quantile:quantile(0.2)
permno price mv yearmonth
1752 10057 18.1250 7.898875e+04 198301
yearmonth:198301, quantile:quantile(0.4)
4732 10137 23.7500 1.130191e+06 198301
yearmonth:198302, quantile:quantile(0.2)
permno price mv yearmonth
6144 10057 9.7500 1.226550e+05 198302
yearmonth:198302, quantile:quantile(0.4)
permno price mv yearmonth
7869 10137 45.8750 2.530740e+06 198302
yearmonth:198303, quantile:quantile(0.2)
permno price mv yearmonth
8267 10057 57.6250 1.670894e+06 198303
yearmonth:198303, quantile:quantile(0.4)
permno price mv yearmonth
8692 10137 30.8750 5.742132e+06 198303
我尝试过的一些代码:
q20=data.groupby("yearmonth")["mv"].quantile(0.2)
q40=data.groupby("yearmonth")["mv"].quantile(0.4)
q60=data.groupby("yearmonth")["mv"].quantile(0.6)
q80=data.groupby("yearmonth")["mv"].quantile(0.8)
for yearmonth,y in data.groupby(["yearmonth"]):
data_q20=y[y["mv"]<=q20[yearmonth]]
data_q40=y[y["mv"]<=q40[yearmonth]]
data_q40=data_q40[data_q40["mv"]>q20[yearmonth]]
data_q60=y[y["mv"]<=q60[yearmonth]]
data_q60=data_q60[data_q60["mv"]>q40[yearmonth]]
data_q80=y[y["mv"]>q60[yearmonth]]
data_q80=data_q80[data_q80["mv"]<=q80[yearmonth]]
data_q100=y[y["mv"]>q80[yearmonth]]
我不确定如何使用apply将“ mv”的年月相对于分位数映射。有任何提示吗?
这种排序的最终目标是计算每年每月的平均回报。
答案 0 :(得分:0)
我认为您可能想使用cut或qcut获得所需的结果。 Cut将创建均匀间隔的范围,而qcut将在每个bin中创建偶数个项目。 Qcut与分位数更加一致。
这是我的代码:
#Recreate your dataset
df = pd.DataFrame(
{
'permno':[10057, 10137,10153, 10225, 10233, 10241],
'price':[18.125, 23.75,9.75, 45.875,57.625, 30.875],
'mv':[7.898875e+04, 1.130191e+06, 1.226550e+05,2.530740e+06,1.670894e+06, 5.742132e+06 ],
'yearmonth':[198301, 198301,198302,198302, 198303,198303]
},
index=[1752, 4732, 6144, 7869, 8267, 8692]
)
#Create a column for the classification.
df['Quantiles']= df.groupby(['yearmonth'])['mv'].transform(
lambda x: pd.qcut(x, 5, labels=(0.2, 0.4,.6,.8,1.0))
)
从这里,您可以过滤交易。我认为您提供的数据集太小,但在较大的数据集上,此代码应该可以正常工作。