Seite 1 von 1

Auswertung

Verfasst: Donnerstag 2. September 2010, 10:10
von frosch
Hallo,

ich habe ein ziemlich grosses Logfile mit 2 Spalten. In der ersten steht die runID und in der zweiten die Zeit. Für jeden User wurde ein Eintrag mit runID und Zeit erstellt. Nun möchte ich auswerten, wie die durchschnittliche Zeit pro runID ist. Ich habe schon mit Listen und Sets herumprobiert, aber irgendwie komme ich auf keine Lösung.

Hat wer Ideen wie ich die durchschnittliche Zeit pro runID berechnen kann?!?

Hier noch ein Beispiel meines Logfiles:
201, 26
200, 27
301, 13
300, 17
401, 21
400, 19
201, 28
200, 29
301, 10
300, 11
401, 26
400, 20
201, 35
200, 35

Der Frosch dank im Voraus!

Re: Auswertung

Verfasst: Donnerstag 2. September 2010, 10:14
von .robert
Hi,

also ich glaube es wäre sinnvoll, wenn du uns deine bisherigen Versuche mal zeigst. Wenn man nicht weiß, wo es bei dir hapert, kann man schlecht helfen...

Re: Auswertung

Verfasst: Donnerstag 2. September 2010, 10:29
von .robert
Also, im Prinzip ist das ja schon ein No-Brainer.
Mal eben so runter geschrieben:

Code: Alles auswählen

d = dict()
with open('log.txt', 'r') as l:
    for line in l:
        runID, runTime = line.split(',')
        if d.has_key(runID):
            d[runID].append(int(runTime.strip()))
        else:
            d[runID] = [int(runTime.strip())]

for key, value in d.items():
    print "{0}: {1}".format(key, sum(value)/len(value))
Ps.: mein 'Code' macht sehr viele Annahmen über das Format der log.txt. Du solltest da noch Fehlerbehandlung etc. einbauen.

Re: Auswertung

Verfasst: Donnerstag 2. September 2010, 10:49
von BlackJack
@.robert: Wenn das Log wirklich gross ist, dann könnte man das Aufsummieren schon beim Einlesen erledigen um Speicher zu sparen.

Code: Alles auswählen

from collections import defaultdict


class Averager(object):
    def __init__(self):
        self.total = 0
        self.count = 0
    
    def __float__(self):
        return float(self.total) / self.count
    
    def __iadd__(self, other):
        self.total += other
        self.count += 1
        return self


def main():
    result = defaultdict(Averager)
    with open('test.log') as lines:
        for line in lines:
            run_id, run_time = map(int, line.split(','))
            result[run_id] += run_time
    for key, value in sorted(result.iteritems()):
        print '%d: %f' % (key, value)


if __name__ == '__main__':
    main()

Re: Auswertung

Verfasst: Donnerstag 2. September 2010, 10:57
von .robert
Hm, das überschreiben der __iadd__-Methode ist lässig. Gefällt mir, ist mir nur gerade nicht in den Sinn gekommen...

Re: Auswertung

Verfasst: Donnerstag 2. September 2010, 11:48
von frosch
Manchmal sieht man den Wald vor lauter Bäumen nicht.
Ich habe eindeutig viel zu kompliziert gedacht. Eure Lösungen sind ja genial einfach und ich brauch nicht x-Listen und zu einem Ergebnis zu kommen. Man lernt nie aus!!

Der FROSCH dank!