Python - Pandas Groupby и фильтр - PullRequest
       13

Python - Pandas Groupby и фильтр

0 голосов
/ 01 апреля 2019

У меня это как 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]]

Я не уверен, как сопоставить год-месяц "mv" суважение к квантильной, используя применить.Любой намек на это?

Конечная цель этой сортировки - подсчитать среднюю доходность за каждый год.

1 Ответ

0 голосов
/ 01 апреля 2019

Я думаю, что вы можете использовать cut или qcut для получения желаемых результатов. Cut будет создавать равномерно распределенные диапазоны, в то время как 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))
)

Отсюда вы можете фильтровать транзакции. Я думаю, что предоставленный вами набор данных слишком мал, но для большого набора данных этот код должен работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...