首页 > 解决方案 > 累计和计算条件

问题描述

所以我有一个包含收盘价和开盘价的数据框,总长度为 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]})

我已经根据答案编辑了代码。

我的代码仍然忽略“信号”中的 1,它只是计算整个列的累积和,尽管 transaction_count 通过了。

这是我的代码:

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'])

标签: python

解决方案


[编辑]

在这个更新的案例中,您混合了两个答案。正如@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

[老的]

这部分似乎是问题所在:

if i in df['signal'] == 1[i]:

你已经在迭代 df['signal'] 所以你可以检查 i == 1:

if i == 1:

推荐阅读