Seite 1 von 1

Zaehler einbauen

Verfasst: Dienstag 17. Juli 2007, 10:31
von silky vanilla
Ich habe 7 Dateien aus denen ich jeweils die 4.Spalte summiere und in einer neuen Datei, die in der 4.Spalte dann nur noch die Summe enthaelt, ausgebe.

Code: Alles auswählen

inp0 = open('STRING_textmining.tab')header0 = inp0.readline()
inp1 = open('Ewing_Score nicht log trans1.LLS')
header1 = inp1.readline()
inp2 = open('Rhodes_Score1.LLS')
header2 = inp2.readline()
inp3 = open('STRING_coexpression1.LLS')
 header3 = inp3.readline()
inp4 = open('STRING_cooccurence1.LLS')
header4 = inp4.readline()
inp5 = open('STRING_fusion1.LLS')
header5 = inp5.readline()
inp6 = open('STRING_neighborhood1.LLS')
header6 = inp6.readline()
inp7 = open('STRING_textmining1.LLS')
header7 = inp7.readline()

out = open('max_of_all_LLS','w')


for line0, line1, line2, line3, line4, line5, line6,line7 in zip(inp0, inp1, inp2, inp3, inp4, inp5, inp6, inp7):
    cols0 = line0.split()
    cols1 = line1.split()
    cols2 = line2.split()
    cols3 = line3.split()
    cols4 = line4.split()
    cols5 = line5.split()
    cols6 = line6.split()
    cols7 = line7.split()
        sum=float(cols1[3])+float(cols2[3])+float(cols3[3])+float(cols4[3])+float(cols5[3])+float(cols6[3])+float(cols7[3])
    newline = '%s\t%s\t%s\t%f\n' % (cols0[0], cols0[1], cols0[2], sum)
    out.write(newline)
   
inp0.close()
inp1.close()
inp2.close()
inp3.close()
inp4.close()
inp5.close()
inp6.close()
inp7.close()
out.close()
Nun zu meiner Frage. Ich moechte gern wissen wieviele der Werte in Spalte 4 der Eingabedateien (aus denen ich dann die Summe bilde) > 0 sind (also durch wieviele Werte vergroessert sich die Summe?)
Ich muesste also einen Zaehler einbauen...aber wo genau und wie?
Kann mir jemand weiter helfen?

Verfasst: Dienstag 17. Juli 2007, 10:52
von Zap
Das Ding kenne ich doch ;)
Nicht mal getraut meine Version auszuprobieren?!
(Würde zudem gerne mal wissen ob das geht)

Naja egal, zu deiner Frage mit ".count(0)" kannst du die Nullen in einer Liste zählen.
Bei deiner lösung würd das dann so aussehen .....

Code: Alles auswählen

null_count = cols1[3].count(0) + cols2[3].count(0) + cols3[3].count(0) + cols4[3].count(0) + cols5[3].count(0) + cols6[3].count(0) + cols7[3].count(0)
Nicht schön, also mal lieber Schleifen angucken ;)

Re: Zaehler einbauen

Verfasst: Dienstag 17. Juli 2007, 10:56
von gerold
silky vanilla hat geschrieben:

Code: Alles auswählen

    s = cols1[3],cols2[3],cols3[3],cols4[3],cols5[3],cols6[3],cols7[3]
    a = max(s)
    newline = '%s\t%s\t%s\t%s\n' % (cols0[0], cols0[1], cols0[2], a)
Hallo silky vanilla!

Unabhängig von deiner Frage:

Vorsicht bei "max"!

Code: Alles auswählen

>>> s = ["100", "2000", "200", "50"]
>>> max(s)
'50'
>>> max( int(item) for item in s )
2000
>>> 
mfg
Gerold
:-)

Verfasst: Dienstag 17. Juli 2007, 11:00
von silky vanilla
Nicht schön, also mal lieber Schleifen angucken :wink:
Werd ich machen.


Zaehlt es aber in deinem Beispiel nicht alle Nullen die vorkommen, also auch die, fall ein Gleitkommazahl in der Spalte steht, die eine Null enthaelt?

Ich moechte aber nur wissen aus wieviel Werten, die >0 sind, die Summe besteht.
D.h. maximal koennen es 7 Werte sein.

Verfasst: Dienstag 17. Juli 2007, 11:31
von gerold
Hallo silky vanilla!

Ich habe keine Ahnung, ob es so funktioniert. Ich war zu faul, mir Testdateien anzulegen. Musst du also selber testen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-


mining_file = open('STRING_textmining.tab')

# Input-Dateien in einer Liste
inp_files = [
    open('Ewing_Score nicht log trans1.LLS'),
    open('Rhodes_Score1.LLS'),
    open('STRING_coexpression1.LLS'),
    open('STRING_cooccurence1.LLS'),
    open('STRING_fusion1.LLS'),
    open('STRING_neighborhood1.LLS'),
    open('STRING_textmining1.LLS'),
]

out_file = open('max_of_all_LLS','w')

# Erste Zeile überspringen
mining_file.readline()
for inp in inp_files:
    inp.readline()

# Berechnen
for inp_lines in zip(*inp):
    max_val = 0
    count_val = 0
    for inp_line in inp_lines:
        val = int(inp_line.split()[3])
        if val > 0:
            count_val += 1
        max_val = max(val, max_val)
    mining_cols = mining_file.readline().split()
    newline = '%s\t%s\t%s\t%i\n' % (mining_cols[0], mining_cols[1], mining_cols[2], max_val)
    out_file.write(newline)
    print max_val

# Dateien schließen
mining_file.close()
for inp in inp_files:
    inp.close()
out_file.close()
mfg
Gerold
:-)

Verfasst: Dienstag 17. Juli 2007, 11:39
von Zap
Achso, also sowas

Code: Alles auswählen

non_zero_values = ( len(cols1[3]) - cols1[3].count(0) ) + ( len(cols1[3]) - cols1[3].count(0) )  + ( len(cols1[3]) - cols1[3].count(0) )  ....
Float 0.xxxx Werte werden nicht gefunden.

Edit: sone ähnliche (ungetestete) Lösung hatte ich auch schon beim letzten mal in den Raum geworfen ;)
http://www.python-forum.de/post-73092.html#73092

Verfasst: Dienstag 17. Juli 2007, 13:45
von silky vanilla
@Gerold: Beim Testen kam folgende Fehlermeldung
Traceback (most recent call last):
File "/home/cellnet/claudiak/bei/18.561.296 random interactions/100 50 1000/sum and count evidence.py", line 26, in <module>
val = int(inp_line.split()[3])
IndexError: list index out of range

Verfasst: Dienstag 17. Juli 2007, 14:38
von silky vanilla
Das Problem ist geloest, Danke