каков наилучший способ вычисления возврата в фрейме данных pandas?

#python #pandas #standard-deviation

#питон #панды #стандартное отклонение #python #pandas

Вопрос:

У меня есть фрейм данных, как показано ниже

Я хочу получить стандартное отклонение доходности акций st.dev (T1/T0-1,T2/T1-1..etc)

например, st.dev((9.5/36.5)-1,(6.125/9.5)-1...etc)

Результат будет добавлен к фрейму данных номер 2.

Можете ли вы, пожалуйста, предложить лучший способ сделать это? Очевидно, что мне нужно сделать это с каждой акцией. Не могли бы вы, пожалуйста, помочь?

Заранее спасибо!

P.S: вы можете проигнорировать часть со стандартным отклонением, если вы просто поможете мне с возвратами, я сделаю все остальное.

введите описание изображения здесь

введите описание изображения здесь

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

1. Чтобы было ясно, результат в идеале должен быть добавлен в столбец Return. Еще раз спасибо, ребята!

2. например, возврат TSL будет равен 44,75 — 44?

Ответ №1:

Вы можете получить T1/T0-1 значения с помощью df.pct_change. Оттуда вы можете использовать .agg для агрегирования с несколькими функциями.

 # sample df
# please always provide a sample that can be easily pasted and tested
# you could get it with `df.head(10).to_dict('split')`
df = pd.DataFrame({
    'AAPL': [36.5, 9.5, 6.125, 40.25, 43.875, 40, 42.25],
    'TSL': [44, 43.625, 47.875, 64.25, 17.375, 14.124, 44.75],
    'GDXJ': [43.875, 13.625, 22.5, 37.125, 5.5, 21.125, 21.25],
    'DAL': [11.625, 33.25, 4.625, 36, 36.25, 14.875, 31.75]
})

df2 = df.pct_change().agg(['mean', 'std']).T
  

Вывод

           mean       std
AAPL  0.755739  2.379347
TSL   0.280437  0.992349
GDXJ  0.434482  1.340593
DAL   1.389140  2.838230
  

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

1. Большое вам спасибо! Это работает лучше, чем я ожидал. Мне приходилось создавать циклы, но я чувствовал, что это неэффективно. Я рад, что задал вопрос здесь. В следующий раз я предоставлю лучший пример. Таким образом, в принципе, .pct_change получит возврат в правильном порядке (т. Е. T1 / T0, а не наоборот). Очень круто. Еще раз спасибо Ричиев

Ответ №2:

Я полагаю, это все, что требуется:

 df.std(axis = 0, skipna = True) 
  

Ответ №3:

попробуйте это:

 a=[(df.iloc[i 1]/df.iloc[i])-1 for i in range(df.shape[0]-1)]
df1=pd.DataFrame(pd.DataFrame(a).std(),columns=["Return"])
  

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

1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества и с большей вероятностью привлекут голоса.