Ich habe eine größere Zahl von Daten, die ich in eine Datentabelle überführen muss, wofür ich mehrere verschachtelte Schleifen nutze. Ich muss zusätzlich ergänzend Fragen zu den Daten beantworten, z. B. nach Zuwachsraten oder nach dem niedrigsten oder höchsten Wert usw.
Im Kern habe ich zwei Herangehensweisen bei der grundsätzlichen Überlegung, die Daten, die ich zur Beantwortung der jeweiligen Frage benötigen werde, in eine geeignete Datenstruktur zu überführen, um so schneller und leichter eine Antwort zu finden.
Verfahren 1
Ich nutze die Schleifen, die mir die Datentabelle erzeugen, um auch die neuen Datenstrukturen zu erzeugen. Problem hier ist, dass mein Code unübersichtlich werden wird und - falls ich mal eine Prüfung herausnehmen muss oder kann - ich mich im Spaghetti-Code zurechtfinden muss und wahrscheinlich nicht mehr voll verstehe, was genau wofür (Datentabelle oder Teil einer mehrerer Prüfungen?) zuständig war.
Verfahren 2
Ich erzeuge die Datentabelle und erzeuge dann für jede Prüfung oder für Gruppen von Prüfungen eigene Datenstrukturen. Problem hier ist, dass ich vermute, dass die Laufzeit leidet, da ich ja viele Schleifendurchläufe oder Berechnungen (die ich schon für die Datentabelle erledigt hatte) erneute durchführen muss.
Da ich früher schon mal mit Verfahren 1 keine guten Erfahrungen gemacht hatte, geht meine Überlegung momentan eher zu Verfahren 2. Ich wollte mir aber dennoch mal Feedback einholen, wie ihr die Sache angehen würdet.
Architekturfrage - state of the art?
Ich vermute man kann auch beide Ziele erreichen, wenn man den Code vernünftig strukturiert. Zb durch hooks oder rekombinierbare Verarbeitungsschritte.
Aber ohne genauere Kenntnisse des Problems kann man da nicht konkreter werden. Wenn du jedoch mit einem Ansatz schon schlechte Erfahrungen gemacht hast, aber beim anderen nur Vermutungen zugrunde liegen, dann wähl den zweiten. Angenommene Probleme manifestieren sich oft nicht. Es sei denn, man kann das vorher schon belegen (zb bei Datenmengen, die jenseits des verfügbaren Speichers sind, oder wirklich sehr teuren Berechnungen.)
Und es gibt natürlich auch noch ein paar generische Techniken wie memoization mit denen man klaren Code schreibt, aber im Bedarfsfall auf gecachte Daten zugreift.
Aber ohne genauere Kenntnisse des Problems kann man da nicht konkreter werden. Wenn du jedoch mit einem Ansatz schon schlechte Erfahrungen gemacht hast, aber beim anderen nur Vermutungen zugrunde liegen, dann wähl den zweiten. Angenommene Probleme manifestieren sich oft nicht. Es sei denn, man kann das vorher schon belegen (zb bei Datenmengen, die jenseits des verfügbaren Speichers sind, oder wirklich sehr teuren Berechnungen.)
Und es gibt natürlich auch noch ein paar generische Techniken wie memoization mit denen man klaren Code schreibt, aber im Bedarfsfall auf gecachte Daten zugreift.
- noisefloor
- User
- Beiträge: 3853
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
also tendenziell würd ich es auch so machen, die "Rohdaten" in eine Tabelle / Datenbank / Pandas Data Frame / ... zu schreiben und dann die Abfragen zu machen. Also Datenhaltung und Datenverarbeitung trenne.
Was heißt den "größere Menge". Groß ist ja relativ...
Gruß, noisefloor
also tendenziell würd ich es auch so machen, die "Rohdaten" in eine Tabelle / Datenbank / Pandas Data Frame / ... zu schreiben und dann die Abfragen zu machen. Also Datenhaltung und Datenverarbeitung trenne.
Was heißt den "größere Menge". Groß ist ja relativ...
Gruß, noisefloor
Was für Arten von Prüfungen sind das denn? Möglicherweise hilft sowohl in Bezug auf die Performance wie auch hinsichtlich des Designs eine geeignete Bibliothek. Für pandas gibt es zum Beispiel einen Validierer, mit dem z.B. Bereichsprüfungen möglich sind. Beispiel aus der Doku:
Weitere Infos findest du hier:
http://pandas-validator.readthedocs.io/en/latest/
Code: Alles auswählen
import pandas as pd
import pandas_validator as pv
class SampleDataFrameValidator(pv.DataFrameValidator):
row_num = 5
column_num = 2
label1 = pv.IntegerColumnValidator('label1', min_value=0, max_value=10)
label2 = pv.FloatColumnValidator('label2', min_value=0, max_value=10)
validator = SampleDataFrameValidator()
df = pd.DataFrame({'label1': [0, 1, 2, 3, 4], 'label2': [5.0, 6.0, 7.0, 8.0, 9.0]})
validator.is_valid(df) # True.
df = pd.DataFrame({'label1': [11, 12, 13, 14, 15], 'label2': [5.0, 6.0, 7.0, 8.0, 9.0]})
validator.is_valid(df) # False.
df = pd.DataFrame({'label1': [0, 1, 2], 'label2': [5.0, 6.0, 7.0]})
validator.is_valid(df) # False
http://pandas-validator.readthedocs.io/en/latest/
Danke fürs Feedback, das hilft mir erst einmal weiter! Ich werde das 2. Verfahren mal testen und es dann probieren. Das klingt für mich sinnvoll angesichts der Rückmeldung. Die anderen Stichworte google ich mal und versuche mal zu verstehen, was da gemacht wird. Wahrscheinlich ist mein Problem dafür aber zu klein:
Ich habe im Schnitt zwischen 100 und 500 Datenpakete (das ist sicherlich etwas irreführend, also ein Datenpaket meint eine Zusammenstellung von Daten über die Zeit zu einem Teilthema). Die werden nach und nach in eine Tabelle eines HTML-Reports übertragen und dann angezeigt. Das Auslesen war etwas mühsam, weil das verschachtelte Listen erledigen.
Im Kern geht es darum Sachen zu finden, die komisch sind und dann genauer geprüft werden sollen. Also etwa: Wert a steigt an, während b und c vor sich rumdümpeln, solche Sachen sollen jetzt mal automatisiert gefunden werden. Das ist work in progress, weil ich noch nicht immer durchblicke, was ich suche...
Hintergrund für meine Frage ist, dass ich einige HTML-Berichte erzeuge, wo der Rechner dann schon mal so eine halbe Stunde beschäftigt ist. Die Datenbasis ist da nicht viel größer.
Ich habe im Schnitt zwischen 100 und 500 Datenpakete (das ist sicherlich etwas irreführend, also ein Datenpaket meint eine Zusammenstellung von Daten über die Zeit zu einem Teilthema). Die werden nach und nach in eine Tabelle eines HTML-Reports übertragen und dann angezeigt. Das Auslesen war etwas mühsam, weil das verschachtelte Listen erledigen.
Im Kern geht es darum Sachen zu finden, die komisch sind und dann genauer geprüft werden sollen. Also etwa: Wert a steigt an, während b und c vor sich rumdümpeln, solche Sachen sollen jetzt mal automatisiert gefunden werden. Das ist work in progress, weil ich noch nicht immer durchblicke, was ich suche...
Hintergrund für meine Frage ist, dass ich einige HTML-Berichte erzeuge, wo der Rechner dann schon mal so eine halbe Stunde beschäftigt ist. Die Datenbasis ist da nicht viel größer.