Flexible Datenaggregation

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
blinky
User
Beiträge: 6
Registriert: Samstag 15. März 2008, 22:12

Samstag 25. Oktober 2008, 21:01

Hej!

Die letzten Tage habe ich mit einer Idee gespielt, dich ich gerne testen würde:

Es geht um flexible Datenaggregation. Genauer: Ich würde gerne Daten aus Logfiles in eine hierarchische Struktur organisieren (z. B. ein apache-log nach Browser und dann nach Version schachteln) und dann aggregieren (also für jeden Browser und für jede Version des Browsers die Häufigkeit berechnen), um schließlich eine Liste/Diagramm zu bauen.

Natürlich könnte ich auch die Logs zeilenweise durchgehen und einfach aufsummieren -- aber das wäre langweilig, nicht? :) Ich müsste zudem schon im Voraus wissen, welche Browser auftauchen werden.

Außerdem würde ich dann später gerne z. B. auch über Http-responses und URLs aggregieren, also wie oft habe ich welche Fehler, und wo wird jeder dieser Fehler produziert (und wie häufig jeweils). Oder schauen, an welchem Wochentag die Leute am längsten auf der Seite bleiben, oder ... Ich suche also eine eher allgemeine Lösung.

Wie könnte man das (ungefähr) umsetzen? Bäume aus "geschachtelten" Objekten bauen? Nested lists? Gäbe es womöglich eine bessere/einfachere Art, diese Dinge zu analysieren?

Ich würde mich über Antworten und Ideen sehr freuen -- schonmal ganz herzlichen Dank


-blinky
BlackJack

Samstag 25. Oktober 2008, 21:20

Wieso müsstest Du vorher wissen welche Browser vorkommen!?

Eine allgemeine Lösung gibt's wohl nicht weil für die passende Datenstruktur wichtig ist, welche Anfragen man haben wird. Das muss man also schon *vorher* wissen.
blinky
User
Beiträge: 6
Registriert: Samstag 15. März 2008, 22:12

Samstag 25. Oktober 2008, 21:44

BlackJack hat geschrieben:Wieso müsstest Du vorher wissen welche Browser vorkommen!?
Damit meinte ich die einfachste Variante: In der Logfile die z.B. die Zahl der "Firefox"-Einträge zu zählen. Wenn irgendwann ein neuer Browser auftaucht, muss für den auch ein neuer Eintrag erstellt werden. Sobald man darüber hinausgeht, muss man das nicht mehr wissen. da hast Du recht.
BlackJack hat geschrieben:Eine allgemeine Lösung gibt's wohl nicht weil für die passende Datenstruktur wichtig ist, welche Anfragen man haben wird. Das muss man also schon *vorher* wissen.
Naja ein bisschen gefiltert werden die Daten schon vorher. Die Datenstruktur würde nur noch das abbekommen, was sie auch speichern soll -- um bei dem oberen Beispiel zu bleiben, z.B. foo("Firefox", "3.0.2").

Ich glaube, ich habe mich nicht genau genug ausgedrückt. Ich poste mal als ein einfaches Beispiel ein Paar Zeilen Code, mit denen ich ein wenig herumgespielt habe. Der macht bei weitem nicht das, was ich eigentlich vorhabe, aber vielleicht zeigt er die Richtung, in die ich möchte, besser:

Code: Alles auswählen

class DataBasket:
	def __init__(self):
		self.data = {}
		
	def catch(self, contents):
		if contents in self.data:
			self.data[contents] += 1
		else:
			self.data[contents] = 1

	def output(self):
		return self.data
Das funktioniert ganz gut, aber natürlich nur eindimensional. Das gleiche würde ich nun gern mit verschachtelten Daten versuchen.
blinky
User
Beiträge: 6
Registriert: Samstag 15. März 2008, 22:12

Sonntag 26. Oktober 2008, 20:34

Hi,

nach einiger Diskussion mit den freundlichen Leuten in #python.de und Inspektion des obrigen Codes wurde angeregt, doch eine DB zu verwenden und dann zu aggregieren (eine Idee, auf die ich hätte längst kommen sollen)

Sie hatten recht. Für den Moment ist das wirklich wesentlich besser.

Ich bin allerdings noch nicht ganz überzeugt; irgendwas in mir weckt den Ehrzeig, den "GROUP BY" Befehl in python zu reimplementieren und damit die DB zu umgehen (die IMHO ein bisschen overkill ist). Aber vermutlich ist das meine Sturheit :)

Besten Dank soweit -- und falls noch Anmerkungen sind, ich nehme sie gern entgegen.

-Blinky
Antworten