Как сохранить результаты для l oop в фрейм данных с учетом указанного c столбца / строки? - PullRequest
0 голосов
/ 21 июня 2020

У меня есть фрейм данных с разными сигналами и возвратами. Я хочу сделать следующее:

  1. Подмножество a specifici c signal
  2. Рассчитать годовой доход
  3. Сохранить результат в фрейм данных

Мой фрейм данных выглядит так: введите здесь описание изображения

Мой код выглядит так:

years = range(1990,2019,1)
returns = pd.DataFrame(columns=signals)

for i in signals:
    signal_i = portbase[portbase['signalname'] == i] #Select single signal from dataframe
    
    for j in years:
        signal_i_j = signal_i[signal_i['year'] == j] #Subset single year from signal
        
        return_j = (((signal_i_j['return']/100)+1).prod() -1) * 100 #Calculate annualized return for signal i in year j
        
        returns.loc[j,i] #Add result to dataframe in column i and year j

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

Сигналы в виде столбцов и годы в виде строк

Изменить: Используя следующий код работает:

df = portbase.groupby(['signalname','year'])['return'].apply(lambda x: (np.prod(1+x/100)-1) * 100).reset_index().T

Но мой вывод все еще неверен: введите описание изображения здесь

Я попытался преобразовать свой вывод в фрейм данных, сбросить индекс и теперь как-то транспонировать мой столбец сигнала как строку / заголовок.

Ответы [ 3 ]

0 голосов
/ 21 июня 2020

для этого можно использовать pivot_table.

signal_cols = ['signalname1', 'signalname2']##..
agg_func = lambda x: np.prod(1+x/100)-1)
result = my_df.pivot_table(index='year', columns=signal_cols, values='return', aggfunc=agg_func)
0 голосов
/ 21 июня 2020

Во-первых, кажется, что вы не используете свои вычисления для их сохранения. j и i - это сигналы и годы.

Сверху моей головы функция .lo c () предназначена для доступа / чтения строк и столбцов по их имени. Таким образом, вы, по сути, пытаетесь получить доступ к данным за годы и сигналам доходности.

Возможно, вам придется поместить свои результаты в списки , а затем сделать из них фрейм данных.

Надеюсь, мой ответ несколько помог.

0 голосов
/ 21 июня 2020

Попробуйте этот код:

df = portbase.groupby(['signalname','year'])['return'].apply(lambda x: (np.prod(1+x/100)-1) * 100).unstack().T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...