首页 > 解决方案 > 让 scipy 接受丢失的数据

问题描述

我需要在 scipy pearsonr 函数中包含缺失的数据。问题是,如果我从一个文件中读取它,例如“NA”,那么我无法将它转换为浮点数,以便 numpy 接受它。如果我用 numpy 读取它,那么具有 'NA' 值的灵活数组类型不能与 'dropna' 或类似的一起使用。我怎样才能让 scipy 接受丢失的数据?我已阅读有关数据掩码的信息,但我不明白如何在代码中使用它。

谢谢,

#!/usr/bin/env python
import sys
import scipy.stats as sp
import numpy as np

f1=open(sys.argv[1],'r') 

f2=open(sys.argv[2],'r') 

g=open(sys.argv[3],'w')

f1.readline()

otus=[]
metanames=[]
result={}

for i in f1:

    k1=i.split("\t")
    k1[-1]=k1[-1].rstrip("\n")
    otu=k1[0]

    f2.seek(0)

    result[otu]=[]
    f2.readline()

    for j in f2:

        k2=j.split("\t")
        k2[-1]=k2[-1].rstrip("\n")

        if k2[0] not in metanames:
            metanames.append(k2[0])

        x=np.asarray(k1[1:])
        y=np.asarray(k2[1:])

        corr = sp.pearsonr(x, y)

        result[otu].append(str(corr))

g.write("\t"+"\t".join(str(p) for p in metanames)+"\n")

for i in result.keys():

    g.write(i+"\t"+"\t".join(str(p) for p in result[i][0])+"\n")

TypeError:无法使用灵活类型执行归约

标签: python-2.7scipymissing-datapearson-correlation

解决方案


好的,所以我完全避免使用 numpy,而只是从两个数组中手动​​删除了 'nan' 和相应的值。

S。

f1=open(sys.argv[1],'r')

f2=open(sys.argv[2],'r')

g=open(sys.argv[3],'w')

f1.readline()

otus=[]
metanames=[]
result={}

for i in f1:

    k1=i.split("\t")
    k1[-1]=k1[-1].rstrip("\n")
    otu=k1[0]

    if otu not in otus:
        otus.append(otu)

    f2.seek(0)

    result[otu]=[]
    f2.readline()

    for j in f2:

        k2=j.split("\t")
        k2[-1]=k2[-1].rstrip("\n")

        if k2[0] not in metanames:
            metanames.append(k2[0])


        x=k1[1:]
        y=k2[1:]
        c=-1
        while c< len(x):
            if x[c]=='NaN' or y[c]=='NaN':
                del x[c]
                del y[c]
            else:
                x[c]=float(x[c])
                y[c]=float(y[c])
                c=c+1


        corr = sp.pearsonr(x, y)

        result[otu].append(corr[0])

g.write("\t"+"\t".join(str(p) for p in metanames)+"\n")


for i in result.keys():

    g.write(i)
    for z in result[i]:
        g.write("\t"+str(z))
    g.write("\n")

推荐阅读