1

pandas.DataFrame.rolling用来计算股票指数收盘价系列的滚动平均值。我可以在 Excel 中做到这一点。我怎样才能在 Pandas 中做同样的事情?谢谢!

下面是我计算移动平均值的 Excel 公式,窗口长度在列中ma window

date    close   ma window   ma
2018/3/21   4061.0502       
2018/3/22   4020.349        
2018/3/23   3904.9355   3   =AVERAGE(INDIRECT("B"&(ROW(B4)-C4+1)):B4)
2018/3/26   3879.893    2   =AVERAGE(INDIRECT("B"&(ROW(B5)-C5+1)):B5)
2018/3/27   3913.2689   4   =AVERAGE(INDIRECT("B"&(ROW(B6)-C6+1)):B6)
2018/3/28   3842.7155   7   =AVERAGE(INDIRECT("B"&(ROW(B7)-C7+1)):B7)
2018/3/29   3894.0498   1   =AVERAGE(INDIRECT("B"&(ROW(B8)-C8+1)):B8)
2018/3/30   3898.4977   6   =AVERAGE(INDIRECT("B"&(ROW(B9)-C9+1)):B9)
2018/4/2    3886.9189   2   =AVERAGE(INDIRECT("B"&(ROW(B10)-C10+1)):B10)
2018/4/3    3862.4796   8   =AVERAGE(INDIRECT("B"&(ROW(B11)-C11+1)):B11)
2018/4/4    3854.8625   1   =AVERAGE(INDIRECT("B"&(ROW(B12)-C12+1)):B12)
2018/4/9    3852.9292   9   =AVERAGE(INDIRECT("B"&(ROW(B13)-C13+1)):B13)
2018/4/10   3927.1729   3   =AVERAGE(INDIRECT("B"&(ROW(B14)-C14+1)):B14)
2018/4/11   3938.3434   1   =AVERAGE(INDIRECT("B"&(ROW(B15)-C15+1)):B15)
2018/4/12   3898.6354   3   =AVERAGE(INDIRECT("B"&(ROW(B16)-C16+1)):B16)
2018/4/13   3871.1443   8   =AVERAGE(INDIRECT("B"&(ROW(B17)-C17+1)):B17)
2018/4/16   3808.863    2   =AVERAGE(INDIRECT("B"&(ROW(B18)-C18+1)):B18)
2018/4/17   3748.6412   2   =AVERAGE(INDIRECT("B"&(ROW(B19)-C19+1)):B19)
2018/4/18   3766.282    4   =AVERAGE(INDIRECT("B"&(ROW(B20)-C20+1)):B20)
2018/4/19   3811.843    6   =AVERAGE(INDIRECT("B"&(ROW(B21)-C21+1)):B21)
2018/4/20   3760.8543   3   =AVERAGE(INDIRECT("B"&(ROW(B22)-C22+1)):B22)

这是 Excel 版本的快照

4

1 回答 1

0

我想到了。但我认为这不是最好的解决方案......

import pandas as pd

data = pd.read_excel('data.xlsx' ,index_col='date')

def get_price_mean(x):
    win = data.loc[:,'ma window'].iloc[x.shape[0]-1].astype('int')
    win = max(win,0)
    return pd.Series(x).rolling(window = win).mean().iloc[-1]


data.loc[:,'ma'] = data.loc[:,'close'].expanding().apply(get_price_mean)

print(data)

结果是:

               close  ma window           ma
date                                         
2018-03-21  4061.0502        NaN          NaN
2018-03-22  4020.3490        NaN          NaN
2018-03-23  3904.9355        3.0  3995.444900
2018-03-26  3879.8930        2.0  3892.414250
2018-03-27  3913.2689        4.0  3929.611600
2018-03-28  3842.7155        7.0          NaN
2018-03-29  3894.0498        1.0  3894.049800
2018-03-30  3898.4977        6.0  3888.893400
2018-04-02  3886.9189        2.0  3892.708300
2018-04-03  3862.4796        8.0  3885.344862
2018-04-04  3854.8625        1.0  3854.862500
2018-04-09  3852.9292        9.0  3876.179456
2018-04-10  3927.1729        3.0  3878.321533
2018-04-11  3938.3434        1.0  3938.343400
2018-04-12  3898.6354        3.0  3921.383900
2018-04-13  3871.1443        8.0  3886.560775
2018-04-16  3808.8630        2.0  3840.003650
2018-04-17  3748.6412        2.0  3778.752100
2018-04-18  3766.2820        4.0  3798.732625
2018-04-19  3811.8430        6.0  3817.568150
2018-04-20  3760.8543        3.0  3779.659767
于 2018-04-28T00:47:09.423 回答