所以我有一个带有收盘价和开盘价的数据框,总长度为1066行。我想遍历“信号”列(从第700行开始提供值,我想一直跳过),检查是否为1,然后使用相应列中的值执行计算,然后计算一个新列。我希望代码仅在选中1时执行计算。
假设我有这个数据框:
(我不知道如何发布数据框)
df = pd.DataFrame({'open':[2,4,5,7,5,11],
'close':[0,2,4,3,10,5],
'signal':[np.nan, 0, 1, -1, 1, -1]})
所需的结果就像数据帧的构造如下:
df = pd.DataFrame({'open':[2,4,5,7,5,11],
'close':[0,2,4,3,10,5],
'signal':[np.nan, 0, 1, -1, 1, -1],
'profits':['','',-1,-1,4, 4]})
我已经按照答案编辑了代码。
尽管transaction_count通过了,但我的代码仍然忽略“信号”中的1,它只是计算整个列的累计和。
这是我的代码:
transaction_count = 0
for i in df['signal']:
if i == 1:
df['profits'] = (df['close'] - df['open']).cumsum()
transaction_count +=1
print('transaction count:', transaction_count)
print(df['profits_rf'])
答案 0 :(得分:2)
[编辑]
在此更新的情况下,您正在混合两个答案。正如@quest所说,您不需要循环。但是,无论如何,您可以创建一个数组并将该数组附加到数据框:
transaction_count = 0
profits = []
cum_sum = 0
for i in range(len(df)):
if df['signal'][i] == 1:
cum_sum += df['close'][i] - df['open'][i]
profits.append(cum_sum)
else:
profits.append(cum_sum)
df['profits'] = profits
[OLD]
这似乎是问题所在:
if i in df['signal'] == 1[i]:
您已经在df ['signal']上进行迭代,因此您可以检查i == 1:
if i == 1: