J'exécute le script python suivant:
#!/usr/bin/python
import os,sys
from scipy import stats
import numpy as np
f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
w=f[i].split()
l1=w[1:8]
l2=w[8:15]
list1=[float(x) for x in l1]
list2=[float(x) for x in l2]
result=stats.ttest_ind(list1,list2)
print result[1]
Cependant, j'ai eu les erreurs comme:
ValueError: could not convert string to float: id
Je suis confus par ceci. Quand j'essaye cela pour seulement une ligne dans la section interactive, au lieu d'une boucle avec script:
>>> from scipy import stats
>>> import numpy as np
>>> f=open('data2.txt','r').readlines()
>>> w=f[1].split()
>>> l1=w[1:8]
>>> l2=w[8:15]
>>> list1=[float(x) for x in l1]
>>> list1
[5.3209183842, 4.6422726719, 4.3788135547, 5.9299061614, 5.9331108706, 5.0287087832, 4.57...]
Je fonctionne bien.
Quelqu'un peut-il expliquer un peu à ce sujet? Merci
Il est évident que certaines de vos lignes n'ont pas de données float valides, en particulier certaines lignes ont un texte id
qui ne peut pas être converti en float.
Lorsque vous l’essayez dans l’Invite interactif, vous n’essayez que la première ligne. Le meilleur moyen est donc d’imprimer la ligne où vous obtenez cette erreur et vous saurez que la mauvaise ligne, par exemple.
#!/usr/bin/python
import os,sys
from scipy import stats
import numpy as np
f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
w=f[i].split()
l1=w[1:8]
l2=w[8:15]
try:
list1=[float(x) for x in l1]
list2=[float(x) for x in l2]
except ValueError,e:
print "error",e,"on line",i
result=stats.ttest_ind(list1,list2)
print result[1]
Mon erreur était très simple: le fichier texte contenant les données avait un caractère espace (donc non visible) sur la dernière ligne.
En tant que résultat de grep, j'avais 45
au lieu de 45
.
Cette erreur est assez verbeuse:
ValueError: could not convert string to float: id
Quelque part dans votre fichier texte, une ligne contient le mot id
qui ne peut pas être converti en nombre.
Votre code de test fonctionne car le mot id
n'est pas présent dans line 2
.
Si vous voulez attraper cette ligne, essayez ce code. J'ai nettoyé votre code un peu:
#!/usr/bin/python
import os, sys
from scipy import stats
import numpy as np
for index, line in enumerate(open('data2.txt', 'r').readlines()):
w = line.split(' ')
l1 = w[1:8]
l2 = w[8:15]
try:
list1 = map(float, l1)
list2 = map(float, l2)
except ValueError:
print 'Line {i} is corrupt!'.format(i = index)'
break
result = stats.ttest_ind(list1, list2)
print result[1]
Vos données ne correspondent peut-être pas à vos attentes - il semble que vous attendiez, mais que vous n'obteniez pas, qu'elles flottent.
Une solution simple pour savoir où cela se produit serait d'ajouter un try/except à la boucle for:
for i in range(0,N):
w=f[i].split()
l1=w[1:8]
l2=w[8:15]
try:
list1=[float(x) for x in l1]
list2=[float(x) for x in l2]
except ValueError, e:
# report the error in some way that is helpful -- maybe print out i
result=stats.ttest_ind(list1,list2)
print result[1]
Peut-être que vos chiffres ne sont pas vraiment des chiffres, mais des lettres se faisant passer pour des chiffres?
Dans mon cas, la police que j'utilisais signifiait que "l" et "1" étaient très similaires. J'avais une chaîne comme 'l1919' que je pensais être '11919' et qui a tout gâché.
Vérifiez le numéro dans le fichier csv d'origine pour voir s'il y a des guillemets doubles sur les numéros.