Рассчитать средний общий диапазон из данного общего диапазона в python pandas? - PullRequest
0 голосов
/ 16 июня 2020

enter image description here

На этом листе мне нужно добавить столбец Av. TR и я хочу вычислить Av. TR. Для Av. Расчет TR: -

Первые 10 дней являются справочными.

Итак, для 10-го дня Av. TR будет: -

Av. TR = среднее значение TR за первые 10 дней и среднее за последующие дни. TR будет

ФОРМУЛА: Av. TR = [(ATR предыдущего дня * 9) + (TR этого дня)] / 10.

Мне нужно сгруппировать по Av. ТР также согласно "СИМВОЛУ". Как это сделать? Я попробовал функцию прокрутки в pandas, но не смог добиться результата.

INSTRUMENTS  SYMBOL           TIMESTAMP   TR 
 FUTIDX       BANKNIFTY        6/1/2020    729.8
 FUTIDX       BANKNIFTY        6/2/2020    834
 FUTIDX       BANKNIFTY        6/3/2020    1145.2
 FUTIDX       BANKNIFTY        6/4/2020    846.7 
 FUTIDX       BANKNIFTY        6/5/2020    812.5
 FUTIDX       BANKNIFTY        6/8/2020    904.6
 FUTIDX       BANKNIFTY        6/9/2020    1014
 FUTIDX       BANKNIFTY        6/10/2020   660
 FUTIDX       BANKNIFTY        6/11/2020   796
 FUTIDX       BANKNIFTY        6/12/2020   1173
 FUTIDX       BANKNIFTY        6/15/2020   969
 FUTIDX       BANKNIFTY        6/16/2020   271
 FUTIDX       NIFTY            6/1/2020    207
 FUTIDX       NIFTY            6/2/2020    230
 FUTIDX       NIFTY            6/3/2020    177.7
:             :                :            :
:             :                :            :
:             :                :            :

Я хочу добавить столбец Av. TR. Для расчета Av. TR Я упомянул формулу выше и хочу, чтобы она была сгруппирована по СИМВОЛУ.

Таким образом, новый столбец ATR будет иметь следующий вид: -

ATR   
row1       NAN
row2       NAN
row3       NAN
row4       NAN
row5       NAN
row6       NAN
row7       NAN
row8       NAN
row9       NAN
row10      (Average of first 10 rows of TR)
row11      (Refer FORMULA above)
row12      (Refer FORMULA above) 
(so on)    (so on)

Он должен быть сгруппирован по СИМВОЛУ

1 Ответ

1 голос
/ 16 июня 2020

Вы должны иметь возможность применять скользящее преобразование к каждой группе. Что-то вроде этого должно быть в состоянии добиться этого.

df['Av.TR'] = df.groupby('SYMBOL')['TR'].transform(lambda x: x.rolling(10, 1).mean())

Если вы хотите, чтобы первые 10 строк были пустыми, то

df['Av.TR'] = df.groupby('SYMBOL')['TR'].transform(lambda x: x.rolling(10).mean())

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

df['Av.TR'] = df.groupby('SYMBOL')['TR'].transform(lambda x: x.rolling(10).mean())
df['Av.TR'] = np.where(df.shift(1)['Av.TR'].isna(), np.NaN,
                     (df.shift(1)['Av.TR'] * 9 + df['TR']) / 10)

Может быть, есть лучший способ сделать это !!

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