首页 > 解决方案 > 如何在 Python 中将多条件循环转换为函数

问题描述

我的问题

我编写了一些代码,将 4 个独立的技术信号(买入、卖出、空头和回补)分别在各自的列中合并为一列。信号只能以特定顺序连接,例如,如果您在一个时间段内买入一只股票,那么在下一个时间段内,唯一可能的行动是卖出或卖空它,而您无法覆盖它。

代码完全按照它应该的方式工作,但我遇到的问题是循环使代码非常慢,我想让它更快更高效。

当前工作慢代码

import numpy as np
import pandas as pd

csv1 = pd.read_csv('signals.csv', delimiter = ',')
df = pd.DataFrame(csv1)

df.loc[df.index[0], 'Signal'] = "Buy"

for x in range(1,len(df.index)):
        if df["Signal"].iloc[x-1] == "Buy" and (df["Sell"].iloc[x] == "Sell" or df["Short"].iloc[x] == "Short"):
            df["Signal"].iloc[x] = df["Sell"].iloc[x] + df["Short"].iloc[x]
        elif df["Signal"].iloc[x-1] == "Short" and (df["Buy"].iloc[x] == "Buy" or df["Cover"].iloc[x] == "Cover"):
            df["Signal"].iloc[x] = df["Buy"].iloc[x] + str(df["Cover"].iloc[x])
        elif df["Signal"].iloc[x-1] == "Cover" and (df["Buy"].iloc[x] == "Buy" or df["Short"].iloc[x] == "Short"):
            df["Signal"].iloc[x] = df["Buy"].iloc[x] + df["Short"].iloc[x]
        elif df["Signal"].iloc[x-1] == "Sell" and (df["Buy"].iloc[x] == "Buy" or df["Short"].iloc[x] == "Short"):
            df["Signal"].iloc[x] = df["Buy"].iloc[x] + df["Short"].iloc[x]
        else:
            df["Signal"].iloc[x] = df["Signal"].iloc[x-1]

df

预期输入

Short,Cover,Buy,Sell
,,,
Short,,,
,,,
,Cover,,
,,,
,,,
,,Buy,
,,,
,,,
,,,Sell
,,,
,,,
,,Buy,
,,,
,,,Sell
,,,

预期产出

Short,Cover,Buy,Sell,Signal
,,,,Buy
Short,,,,Short
,,,,Short
,Cover,,,Cover
,,,,Cover
,,,,Cover
,,Buy,,Buy
,,,,Buy
,,,,Buy
,,,Sell,Sell
,,,,Sell
,,,,Sell
,,Buy,,Buy
,,,,Buy
,,,Sell,Sell
,,,,Sell

知道我该怎么做吗?

干杯!

标签: pythonpandasloopsdataframe

解决方案


IIUC,你只需要做

df['Signal'] = df.ffill(axis=1).iloc[:,-1].ffill().fillna('Buy')

输出:

    Short  Cover  Buy  Sell Signal
0     NaN    NaN  NaN   NaN    Buy
1   Short    NaN  NaN   NaN  Short
2     NaN    NaN  NaN   NaN  Short
3     NaN  Cover  NaN   NaN  Cover
4     NaN    NaN  NaN   NaN  Cover
5     NaN    NaN  NaN   NaN  Cover
6     NaN    NaN  Buy   NaN    Buy
7     NaN    NaN  NaN   NaN    Buy
8     NaN    NaN  NaN   NaN    Buy
9     NaN    NaN  NaN  Sell   Sell
10    NaN    NaN  NaN   NaN   Sell
11    NaN    NaN  NaN   NaN   Sell
12    NaN    NaN  Buy   NaN    Buy
13    NaN    NaN  NaN   NaN    Buy
14    NaN    NaN  NaN  Sell   Sell
15    NaN    NaN  NaN   NaN   Sell

推荐阅读