渴望接受丢失的数据

时间:2019-07-01 03:57:57

标签: python-2.7 scipy missing-data pearson-correlation

我需要在scipy pearsonr函数中包括丢失的数据。问题是如果我从文件中读取例如'NA',那么我不能将其转换为浮点数,以便numpy接受。如果我用numpy读取它,则带有'NA'值的灵活数组类型不能与'dropna'或类似的东西一起使用。我如何才能接受丢失的数据?我已经阅读了有关数据掩码的信息,但是我不明白如何在代码中使用它。

谢谢

#!/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:无法使用灵活类型执行归约

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解您的问题。一个最小的例子 会有所帮助。但是我想您会得到类似以下的内容:

>>> x = np.array([[ 1., 2., 3.], [ 4., 5., 6.], [ 7., 8., 9.]]).astype('object')
>>> x[0,1] = 'NA'
>>> x[2,2] = 'NA'
>>> x
array([[1.0, 'NA', 3.0],
       [4.0, 5.0, 6.0],
       [7.0, 8.0, 'NA']], dtype=object)

因此,由于存在'NA',因此您有一个numpy类型的对象数组。

>>> x.astype('float')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'NA'

这就是为什么您不能将其转换为float?所以你有 要做的就是用NaN代替'NA'

>>> x[x=='NA'] = np.nan
>>> x
array([[1.0, nan, 3.0],
       [4.0, 5.0, 6.0],
       [7.0, 8.0, nan]], dtype=object)
>>> x.astype('float')
array([[ 1., nan,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8., nan]])

答案 1 :(得分:0)

好吧,所以我完全避免使用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")