Python Pandas Groupby和fi

2024-09-30 18:13:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我把这个作为一个csv在pandas工作-前十行:

简化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个分位数,得到预期结果:

^{pr2}$

我尝试过的一些代码:

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。有什么线索吗?在

这种分类的最终目标是计算出每年每个月的平均回报率。在


Tags: csvpandasdfdatapricegroupby位数quantile
1条回答
网友
1楼 · 发布于 2024-09-30 18:13:14

我想你可以用cut或qcut来得到你想要的结果。剪切将创建均匀间隔的范围,而qcut将为每个箱子创建偶数个项目。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))
)

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

相关问题 更多 >