Ранжирование по строкам - PullRequest
0 голосов
/ 27 июня 2018

Мой фрейм данных выглядит так:

      Date       AAPL      NFLX       INTC    AAPL_Ret   NFLX_Ret   INTC_Ret
0 2008-01-31  27.834286  3.764286  25.350000       
1 2008-02-29  27.847143  3.724286  24.670000   -0.07     0.25       -0.05     
2 2008-03-31  25.721428  3.515714  22.670000    0.15     0.10       0.06  
3 2008-04-30  25.377142  3.554286  22.879999    etc
4 2008-05-31  24.464285  3.328571  22.260000

Я хочу рассчитать квантили для доходности акций, проходящей через строки в моей df. Так, например, квантили (скажем, мы используем 3 группы) ранжируют первую строку возвратов как AAPL и INTC в квантиле 3, и NFLX в квантиле 1 (поскольку это самая высокая доходность). Ожидаемый результат будет (ниже, прокрутите вправо):

      Date       AAPL       NFLX       INTC    AAPL_Ret   NFLX_Ret   INTC_Ret   AAPL_Ret Q   NFLX_Ret Q   INTC Ret Q
0 2008-01-31  27.834286  3.764286  25.350000       
1 2008-02-29  27.847143  3.724286  24.670000   -0.07     0.25       -0.05        3              1            3
2 2008-03-31  25.721428  3.515714  22.670000    0.15     0.10       0.06         1              2            2
3 2008-04-30  25.377142  3.554286  22.879999    etc
4 2008-05-31  24.464285  3.328571  22.260000

То, что я пробовал: я изначально хотел использовать pd.qcut с чем-то вроде axis = 1 в формуле, но метод не принимает такой аргумент. Поэтому я подумал, что мог бы сделать что-то вроде цикла for (поскольку в конечном итоге я расширю файл до множества акций)

for col in df.columns:
    if '_Ret' in col:
        df[col+'_Rank'] = df.apply(pd.qcut(df[col], 5, labels=np.arange(5, 0, -1), axis=1)

Но я застрял здесь.

Буду очень признателен за вашу помощь, я начинающий питон. Спасибо!

1 Ответ

0 голосов
/ 27 июня 2018

Одним из способов может быть использование filter для выбора только столбцов с _Ret и stack, чтобы сделать его серией, чтобы можно было использовать qcut после.

# I only copy the two rows with values in _Ret columns
print (df.filter(like = '_Ret').stack())

1  AAPL_Ret   -0.07
   NFLX_Ret    0.25
   INTC_Ret   -0.05
2  AAPL_Ret    0.15
   NFLX_Ret    0.10
   INTC_Ret    0.06

Теперь вы можете использовать qcut в этой серии, а затем unstack и add_suffix для переименования:

df_Q = (pd.qcut(df.filter(like = '_Ret').stack(), 3, labels=np.arange(3, 0, -1))
           .unstack().add_suffix(' Q'))

print (df_Q)
  AAPL_Ret Q NFLX_Ret Q INTC_Ret Q
1          3          1          3
2          1          2          2

Просто нужно join с исходным кадром данных, так как номера строк такие же, как и в исходном.

df = df.join(df_Q)

дает ожидаемый результат

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