对“数据框”列表中的每个项重复计算,并将其命名为

时间:2018-03-13 14:32:55

标签: python function pandas dataframe

我有以下代码给出信号(1或0)

问题是我有一份股票收盘价格[' SPY',' TLT'等等] 我现在正在做的是为每只股票手动更改stock = df []。

您能否建议如何为此创建功能? 另外df ['信号']对每个人来说应该是唯一的...例如df [' SPY']会产生df [' SPYsignal']

我对python太新了,并且尝试过错误,希望你能指导我,谢谢。

# I am doing this for all my tickers, this is inefficient 
# Only wanted to do it for selected columns so I should begin with List = [['SPY','TLT']] yes? 

stock = df['SPY']

df['avg'] = stock.shift(1).rolling(window=5).mean()
df['LongEntry'] = stock > df.avg
df['LongExit'] = stock < df.avg

df['PositionLong'] = np.nan
df.loc[df.LongEntry,'PositionLong'] = 1
df.loc[df.LongExit, 'PositionLong'] = 0

df['SPYSignal'] = df.PositionLong 
df['SPYSignal'].fillna(method='ffill')
df['SPYSignal'].fillna(0, inplace = True)

print (df['SPYSignal'])


stock = df['TLT']

df['avg'] = stock.shift(1).rolling(window=5).mean()
df['LongEntry'] = stock > df.avg
df['LongExit'] = stock < df.avg

df['PositionLong'] = np.nan
df.loc[df.LongEntry,'PositionLong'] = 1
df.loc[df.LongExit, 'PositionLong'] = 0

df['TLTSignal'] = df.PositionLong 
df['TLTSignal'].fillna(method='ffill')
df['TLTSignal'].fillna(0, inplace = True)

print (df['TLTSignal'])

Dataframe Sample

SPY TLT
100 200
102 202
105 208
106 205
108 210

期望输出

SPY TLT SPYSignal   TLTSignal
100 200      0          1
102 202      1          0
105 208      0          0
106 205      1          0
108 210      0          1

1 个答案:

答案 0 :(得分:1)

我会用这样的东西:

for stockClosePrice in ['SPY','TLT', 'OTHERVALUES']:
    stock = df[stockClosePrice]

    df['avg'] = stock.shift(1).rolling(window=5).mean()
    df['LongEntry'] = stock > df.avg
    df['LongExit'] = stock < df.avg

    df['PositionLong'] = np.nan
    df.loc[df.LongEntry,'PositionLong'] = 1
    df.loc[df.LongExit, 'PositionLong'] = 0

    stockSignal = stockClosePrice + 'Signal'

    df[stockSignal] = df.PositionLong 
    df[stockSignal].fillna(method='ffill')
    df[stockSignal].fillna(0, inplace = True)

    print (df[stockSignal])

此代码循环遍历每个'SPY', 'TLT', ...字符串,并按照您之前手动执行的方式处理它们。

我希望我的问题正确无误!