Как создать столбец на основе значений двух существующих столбцов?

#python #pandas #dataframe #time-series

Вопрос:

Я работаю с фреймом данных Pandas, содержащим 20-летнюю выборку ежемесячных цен на акции и соответствующие доходы по сотням различных акций. После сортировки образец ‘дата’ и ‘книга-к-Маркет’ (‘в/М’, для краткости), я хочу создать столбец, который присваивает значение от -1 до доходностей акций компаний с низкой Б/М и стоимостью от 1 до доходностей акций компаний с самым высоким Б/М (половина выборки присваивается -1, а другая половина назначается 1) за каждый месяц в образце.

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

 df = df.sort_values (by = ['Date','B/M'], ascending = True)
df

# Example of desired outcome (Note: 'Date' - dtype='datetime64[ns] - has been set as the index).

    Date        Company Name       B/M      Monthly Return       Signal
|2000-01-31 |      ORACLE     |   0.29  |      0.048         |     -1     |
|2000-01-31 |    MICROSOFT    |   0.37  |      0.032         |      1     |
|...        |...              |...      |...                 |...         | 
|2000-02-29 |    MICROSOFT    |   0.08  |      0.016         |     -1     |
|2000-02-29 |     ORACLE      |   0.30  |      -0.07         |      1     |

 

Спасибо, что уделили мне время.

Комментарии:

1. Возможно, вы могли бы вычислить промежуточное значение среднего B/M значения за данный месяц. А затем создайте Signal столбец, содержащий это среднее значение.

Ответ №1:

Хорошо, пожалуйста, сначала рассчитайте медиану B/M

 bm_median=df["B/M"].median()
 

Затем создайте столбец, в котором вы проверяете, меньше ли B/M, чем медиана

 df["signal"]=df["B/M"]<bm_median
 

Затем, если false, замените на 1, а если true, замените на -1

 df["signal"].replace(False,1,inplace=True)
df["signal"].replace(True,-1,inplace=True)