Python e media pesata

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Python e media pesata

Messaggio da cloudany »

Ciao ragazzi, altro dubbio amletico, sto provando a calcolare la media pesata su una distribuzione, presente in vari files, così strutturata:

Codice: Seleziona tutto

drive-------------------------------------------------------------------------k='6'
 
seq
nelsa
s length: 4044778
# 51 1
# 64 1
# 65 1
# 67 2
# 70 1
# 72 1
# 73 1
# 77 1
# 79 1
# 86 1
# 88 2
# 89 1
# 92 1
# 94 1
# 95 1
# 96 2
# 100 1
# 103 1
# 105 1
# 108 1
# 112 1
# 119 1
# 123 1
# 126 1
# 127 1
# 129 1
# 130 1
# 133 3
# 134 1
# 135 1
# 138 2
# 139 1
# 140 1
# 141 1
# 142 1
# 143 1
# 144 2
# 145 1
# 148 2
# 150 3
# 151 1
# 152 1
# 153 1
# 154 1
# 155 1
# 156 1
# 157 1
# 159 3
# 160 1
# 161 1
# 162 1
# 163 1
# 164 1
# 165 2
# 167 2
# 168 1
# 169 1
# 170 1
# 172 2
# 173 1
# 174 1
# 175 1

-------------------------------------------------------------------------k='7'
 
seq
nelsa
s length: 4044778
# 4 1
# 5 1
# 8 1
# 9 1
# 10 3
# 11 3
# 12 4
# 13 7
# 14 6
# 15 5
# 16 11
# 17 7
# 18 14
# 19 8
# 20 15
# 21 13
# 22 10
# 23 6
# 24 22
# 25 14
# 26 19
# 27 17
# 28 20
# 29 25
# 30 15
# 31 22
# 32 18
# 33 23
# 34 30
# 35 24
# 36 35
# 37 39
# 38 27
# 39 33
# 40 36
# 41 34
# 42 40
# 43 43
# 44 44
# 45 44
# 46 43
# 47 50
# 48 51
# 49 54
# 50 55
# 51 44
# 52 49
# 53 56
# 54 35
# 55 52
# 56 47
# 57 48
# 58 65
# 59 56
# 60 53
# 61 54
# 62 66
# 63 47
# 64 61
# 65 50
# 66 46
# 67 69
# 68 65
# 69 66
# 70 59
# 71 59
# 72 55
# 73 73
# 74 91
# 75 73
# 76 56
# 77 66
# 78 63
# 79 67
# 80 78
# 81 51
# 82 69
# 83 60
# 84 64
# 85 73
# 86 58
# 87 60
# 88 64
# 89 73
# 90 63
# 91 65
# 92 59
# 93 69
# 94 67
# 95 73
# 96 50
# 97 53
# 98 68
# 99 65
# 100 63
# 101 55
# 102 73
# 103 76
# 104 66
# 105 70
# 106 75
# 107 66
# 108 56
# 109 49
# 110 68
# 111 52
# 112 66
# 113 67
# 114 66
# 115 52
# 116 61
# 117 59
# 118 65
# 119 67
# 120 56
# 121 60
# 122 64
# 123 53
# 124 59
# 125 66
# 126 58
# 127 77
# 128 51
# 129 67
# 130 53
# 131 56
# 132 62
# 133 64
# 134 56
# 135 42
# 136 71
# 137 57
# 138 53
# 139 52
# 140 65
# 141 59
# 142 61
# 143 60
# 144 64
Sono file "spaced" non c'è possibilità di variare ciò
Devo calcolare la media pesata cioè:
(val1_col2 * val1_col3)/ Num_#

ed estrarre massimo e minimo il tutto scrivendolo in un nuovo file.
Come faccio in Python a dirgli vai dal primo # all'ultimo # però quello prima della linea tratteggiata di separazione?

Fino ad ora sono riuscito a ricavare ciò, ma non è sufficiente:

Codice: Seleziona tutto

#! /usr/bin/python

import numpy
import csv

file = open('Acetobacterium_woodii_DSM_1030.mdistr', 'rb')
data = csv.reader(file, delimiter=' ')
table = [row for row in data]

for row in table:
    i = table.index(row)
    a = table[i]
    print a
" 4 letters are enough to explain mankind"
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Python e media pesata

Messaggio da crap0101 »

data la semplicità del formato penso ti convenga iterare sulle linee e agire tenendo presente il separatore e agire di conseguenza, al massimo puoi splittare il file secondo il separatore ('-----' se non ci sono altre occorrenze che potrebbero confondere) e poi estrai i valori come detto sopra o con una regex.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Python e media pesata

Messaggio da crap0101 »

un veloce esempio prendendo i dati che hai messo sopra:

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ cat ex.py
import operator
import re
import sys

SEP = '-'*20

def get_data (seq):
    pairs = [map(int, e) for e in seq]
    w = sum(p[1] for p in pairs)
    pond = [operator.mul(*t)/w for t in pairs]
    return (pairs, w, pond) # o solo quel che ti serve

reg = re.compile('(?m)^#\s+(\d+)\s+(\d+)\s*$')  
data = []

with open(sys.argv[1]) as infile:
    txt = infile.read()
    for part in txt.split(SEP):
        r = reg.findall(part)
        if r:
            data.append(get_data(r))

for d in data:
    print "pond:", d[2]
crap0101@orange:/tmp/foo$ python ex.py input.txt
pond: [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 5, 1, 1, 1, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 4, 2, 2, 2]
pond: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti