2017-07-19 105 views
-1

我试图复制找到here的PCA示例,但试图运行pca_summary()时出现以下错误,任何想法都不胜感激。谢谢!使用python sckit-learn进行PCA分析 - 输入错误

raise TypeError("data argument can't be an iterator") 
TypeError: data argument can't be an iterator 
+0

您正在使用什么版本的Python用? – DavidG

+0

我正在使用3.6.0 –

+0

我可以使用python 3.6重现错误。它似乎是在pca_summary函数内的这行:summary = pd.DataFrame(zip(a,b,c),index = names,columns = columns)导致python 3.6中的问题。 – sera

回答

3

这是zip引起的常见问题。

这是因为zip在python 3中改变了,它现在返回一个迭代器。

see also here

pca_summary功能做到这一点:

def pca_summary(pca, standardised_data, out=True): 
    names = ["PC"+str(i) for i in range(1, len(pca.explained_variance_ratio_)+1)] 
    a = list(np.std(pca.transform(standardised_data), axis=0)) 
    b = list(pca.explained_variance_ratio_) 
    c = [np.sum(pca.explained_variance_ratio_[:i]) for i in range(1, len(pca.explained_variance_ratio_)+1)] 
    columns = pd.MultiIndex.from_tuples([("sdev", "Standard deviation"), ("varprop", "Proportion of Variance"), ("cumprop", "Cumulative Proportion")]) 
    summary = pd.DataFrame(list(zip(a, b, c)), index=names, columns=columns) 
    if out: 
     print("Importance of components:") 
     display(summary) 
    return summary 

所以只需更换

summary = pd.DataFrame(zip(a, b, c), index=names, columns=columns) 

summary = pd.DataFrame(list(zip(a, b, c)), index=names, columns=columns)