Становлюсь скучно, чтобы принять недостающие данные - PullRequest
0 голосов
/ 01 июля 2019

Мне нужно включить недостающие данные в функцию scipy Pearsonr.Проблема в том, что, если я читаю его из файла, например, с «NA», я не могу преобразовать его в float, чтобы 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: невозможно выполнить сокращение с гибким типом

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Хорошо, поэтому я вообще избегал использования 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")
0 голосов
/ 01 июля 2019

Я не уверен, что понимаю вашу проблему. Минимальный пример было бы полезно. Но я думаю, вы получите что-то вроде следующего:

>>> 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'.

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

И вот почему вы не можете конвертировать его в float? Так что все, что у вас есть сделать, это заменить «NA» с NaN

>>> 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...