【发布时间】:2020-09-25 18:14:20
【问题描述】:
我正在尝试在我的 df 中创建一个新列,类似于:
df["Signal"] = signalList
但是,我收到此错误“枚举返回索引 -1 导致 ValueError:值的长度与索引的长度不匹配”。所以我检查了我的专栏的 len:
print(len(df["Crossover"]))
这会返回 8192。所以我调整了代码以打印 *x,这样我就可以看到它上升到哪里,得到 *8191。我怎样才能解决这个问题?干杯。
signalList = []
for x,i in enumerate(df["Crossover"]):
print("*"+str(x))
if i == True:
if df['EMA ' + str(emaShort)].iloc[x] > df['EMA ' + str(emaLong)].iloc[x]:
signal = "Buy"
signalList.append(signal)
elif df['EMA ' + str(emaShort)].iloc[x] < df['EMA ' + str(emaLong)].iloc[x]:
signal = "Sell"
signalList.append(signal)
elif i != True:
signal = "None"
signalList.append(signal)
编辑 ************************************************ ****************************** 我想知道您是否可以告诉我是否可以调整下面的代码以利用矢量化处理。因为它要快得多。第一段代码是我的尝试,它有点工作,下面的循环是我希望它准确工作的方式。我遇到的问题本质上是我需要在“仓位列”中第一个买入/卖出信号之前的线为 None 但是,我无法让矢量化表来做到这一点。虽然它会准确地识别何时切换到多头/空头,但在信号为“空头”之前的任何东西,因为条件返回 False。我没有任何运气来解决这个问题。
df["Position"] = np.where(df['Signal'].ne("None"),np.where(df[f'Signal'].eq("Buy"), "Long", "Short"), np.where(df["Position"].shift(1).eq(True), "Long", np.where(df["Position"].shift(1).eq(False), "Short", "None")))
for x,i in enumerate(df['Signal']):
if i == "Buy":
df.iloc[x, df.columns.get_loc('Position')] = "Long"
elif i == "Sell":
df.iloc[x, df.columns.get_loc('Position')] = "Short"
else:
if df["Position"].iloc[x-1] == "Long":
df.iloc[x, df.columns.get_loc('Position')] = "Long"
elif df["Position"].iloc[x-1] == "Short":
df.iloc[x, df.columns.get_loc('Position')] = "Short"
else:
df.iloc[x, df.columns.get_loc('Position')] = "None"
【问题讨论】:
标签: python-3.x pandas enumerate