从python熊猫中给定的总范围中计算平均总范围?

时间:2020-06-16 09:02:19

标签: python pandas pandas-groupby data-analysis

enter image description here

在此工作表中,我需要添加一列Av。 TR和我想计算平均TR。对于平均TR计算:-

前10天为参考。

所以连续10天TR为:-

平均TR =前10天TR和随后几天的平均值AV。 TR为

FORMULA:平均TR = [(前一天的ATR * 9)+(当天的TR)] / 10。

我必须按Av。分组TR按“符号”也。这该怎么做?我尝试在熊猫滚动功能,但无法达到目的。

 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。用于计算平均TR我在上面提到了公式,我希望将它按SYMBOL分组。

因此,新列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 个答案:

答案 0 :(得分:1)

您应该能够在每个组上应用滚动变换。这样的事情应该可以实现。

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)

也许有更好的方法!