Python-Pandas Groupby和过滤器

时间:2019-04-01 03:07:55

标签: python pandas dataframe group-by

我将它作为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”的年月相对于分位数映射。有任何提示吗?

这种排序的最终目标是计算每年每月的平均回报。

1 个答案:

答案 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))
)

从这里,您可以过滤交易。我认为您提供的数据集太小,但在较大的数据集上,此代码应该可以正常工作。