Python:KeyError:0-函数,用于从通过循环访问的数据帧子集创建列表

Python:KeyError:0-函数,用于从通过循环访问的数据帧子集创建列表,python,list,loops,dynamic,tuples,Python,List,Loops,Dynamic,Tuples,我有一个循环,它创建了一个更大数据帧的子集,然后将这些子集作为函数的输入进行分析。此函数返回一个列表。我用指纹看它停在哪里。因此,对于循环中的第一次运行,我可以看到子集,函数的列表输出,但是当它再次启动时,第二次运行,我看到第二个子集,但是在函数中,我得到以下错误: <ipython-input-11-8f6203e297e3> in ssd(x, y) 8 9 for i in range(x.shape[0]): ---> 10

我有一个循环,它创建了一个更大数据帧的子集,然后将这些子集作为函数的输入进行分析。此函数返回一个列表。我用指纹看它停在哪里。因此,对于循环中的第一次运行,我可以看到子集,函数的列表输出,但是当它再次启动时,第二次运行,我看到第二个子集,但是在函数中,我得到以下错误:

<ipython-input-11-8f6203e297e3> in ssd(x, y)
      8 
      9     for i in range(x.shape[0]):
---> 10         spread_cumdiff += (x[i] - y[i]) **2
     11 
     12     return spread_cumdiff
我有这样的想法:

df_test = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
                    columns=['a', 'b', 'c', 'd', 'e'], 
                    index = ['20100101', '20100102', '20100103', '20100104', '20100105']

dfs = []
N = 3
for x in np.arange(len(df_test)+1)[N:]:
    df1 = df_test.iloc[np.arange(x - N, x)]

    test_list = myfunc(df1) # it takes in df1, makes some computation and returns a
                            # list of 2-element tuples, i.e. [('a', 'b'), ('d', 'e')]
编辑:请参见下面的功能:

def ssd(x, y):

    spread_cumdiff = 0

    for i in range(x.shape[0]):
        #print("x_i", x[i])
        #print("y_i", y[i])
        spread_cumdiff += (x[i] - y[i]) **2

    return spread_cumdiff
我试着使用print函数,但在第二次运行循环时,它甚至都没有实现

def pairs_match(df, p):

    df_norm = df.assign(**df.drop('datetime', 1).pipe(lambda d: d.div(d.shift().bfill()).cumprod()))
    df_norm = df_norm.replace([np.inf, -np.inf], np.nan)

    df_norm.fillna(method = 'ffill', inplace = True)
    df_norm.fillna(method = 'bfill', inplace = True)

    ticker = df_norm.columns.values.tolist()
    ticker.pop(0)
    ticker_list = pd.DataFrame({'ticker': ticker})

    # to be implemented: if length of list list <2, then skip the entire run! 

    all_pairs = list(itertools.permutations(ticker_list.ticker, 2))
    squared = []
    presel_pairs = []

    for i in all_pairs:
        squared.append(ssd(df_norm[i[0]].head(n = train_win), df_norm[i[1]].head(n = train_win)))   # ssd(x,y) function from above

    tbl_dist = pd.DataFrame({'Pair' : all_pairs, 'SSD' : squared})

    ssd_perctl = p
    ssd_thresh = stats.scoreatpercentile(tbl_dist['SSD'], ssd_perctl)

    presel_pairs = tbl_dist[tbl_dist['SSD'] <= ssd_thresh]
    presel_pairs_list = presel_pairs['Pair']
    presel_pairs_list = presel_pairs_list.reset_index(drop = True)

    return presel_pairs_list      
def对匹配(df,p):
df_norm=df.assign(**df.drop('datetime',1).pipe(lambda d:d.div(d.shift().bfill()).cumprod())
df_norm=df_norm.replace([np.inf,-np.inf],np.nan)
df_norm.fillna(方法='ffill',inplace=True)
df_norm.fillna(方法='bfill',inplace=True)
ticker=df_norm.columns.values.tolist()
股票代码pop(0)
ticker_list=pd.DataFrame({'ticker':ticker})

#要执行的操作:如果列表长度请尝试分别打印
x[i]
y[i]
,以便知道这两个选项中的哪一个会导致键错误。另外,请发布该函数,因为如果没有它,我们就不知道发生了什么。

正如我们所想,问题确实出在cumsum更新函数上。我将函数重写如下:

def ssd(x, y):

    spread_diff_sq = np.subtract(x, y) **2
    spread_diff_sq_cum = spread_diff_sq.cumsum()
    spread_cumdiff = spread_diff_sq_cum.iloc[-1]

    return spread_cumdiff

这并不是问题的根源,但是它避免了循环。

这似乎是
spread_cumdiff+=(x[i]-y[i])**2的
+=
部分的问题;我拿走了
+
进行测试,然后该函数似乎可以工作了。不知道该怎么办。
def ssd(x, y):

    spread_diff_sq = np.subtract(x, y) **2
    spread_diff_sq_cum = spread_diff_sq.cumsum()
    spread_cumdiff = spread_diff_sq_cum.iloc[-1]

    return spread_cumdiff