Architekturfrage - state of the art?

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
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

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.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
noisefloor
User
Beiträge: 3854
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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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:

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
Weitere Infos findest du hier:
http://pandas-validator.readthedocs.io/en/latest/
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

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