我有一个庞大的财务数据数据框。当股票价格高于上滚动平均值至少X天并且低于滚动平均值至少X天时,我想创建一个“买入”信号。我做了一个天真的实施,检查股票是否在至少2天之前和之后2天。我想知道是否: (1)有一种方法可以使它更通用,这样我就可以实现X天而无需放入一堆if语句 (2)编写下面的代码是一种更有效/更有效的方法。
data2只是数据帧 data2.AboveUpper是股票高于上滚动均值时的一列Trues,当股票低于上滚动均值时为False。
upperlist = data2[data2.AboveUpper == True].AboveUpper.index
for i, val in enumerate(upperlist):
if data2.iloc[val+1]['AboveUpper'] == True:
continue
if data2.iloc[val+1]['AboveUpper'] == False:
if data2.iloc[val+2]['AboveUpper'] == False:
data2.ix[val+2, 'buy'] = True
if data2.iloc[val+2]['AboveUpper'] == False:
continue
答案 0 :(得分:1)
当data2.AboveUpper
为True
时,如果股票高于上滚动平均值,那么
pd.rolling_sum( data2.AboveUpper, window=X ) >= X
是True
,只要库存高于上滚动平均值至少连续X
天;所以你需要的只是:
data2['buy'] = pd.rolling_sum( data2.AboveUpper, window=X ) >= X
作为一个例子:
>>> ts = pd.Series( [True, True, False, False, True, True, True, False, True ] )
>>> pd.rolling_sum( ts, window=2 ) >= 2
0 False
1 True
2 False
3 False
4 False
5 True
6 True
7 False
8 False
dtype: bool