【问题标题】:Enumerate returns index -1 resulting in ValueError: Length of values does not match length of index枚举返回索引 -1 导致 ValueError:值的长度与索引的长度不匹配
【发布时间】: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


    【解决方案1】:

    请考虑以下内容,而不是您的 for 循环:

    import numpy as np
    
    df['signal']=np.where(df['Crossover'], np.where(df[f'EMA {emaShort}'].lt(df[f'EMA {emaLong}']), 'Sell', 'Buy'), 'None')
    

    您将以这种方式利用矢量化处理,这将使您的代码执行得更好...

    【讨论】:

    • 这叫什么,所以我可以谷歌? / 你能给我一篇好文章的链接吗?
    • 它是做什么的?
    • lt - 相当于&lt;。对于矢量化执行 - 这看起来很有趣:medium.com/hackernoon/…(查找 numpy,因为这就是 pandas 的底层内容)
    • 干杯我在我的代码中进行了编辑,你有机会看看吗?我有点碰壁了,因为我是矢量化处理的新手,所以我有点卡住了。
    【解决方案2】:

    首先,您的代码中可能没有正确的缩进,正确的是

    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)
    

    第二,内部if-elif是没有else的;如果

    df['EMA ' + str(emaShort)].iloc[x] == df['EMA ' + str(emaLong)].iloc[x]:
    

    我想你的df 中有一行满足这个条件

    【讨论】:

    • 缩进是一个复制和粘贴错误我猜至少我在 atom 中的代码是正确缩进的。你对问题的假设非常正确,所以谢谢你!
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2018-12-19
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多