Auswertung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
frosch
User
Beiträge: 10
Registriert: Donnerstag 17. September 2009, 09:17

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!
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

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...
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

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.
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()
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Hm, das überschreiben der __iadd__-Methode ist lässig. Gefällt mir, ist mir nur gerade nicht in den Sinn gekommen...
frosch
User
Beiträge: 10
Registriert: Donnerstag 17. September 2009, 09:17

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!
Antworten