Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/43 cache downloaded data #44

Merged
merged 3 commits into from
Aug 9, 2022
Merged

Conversation

pmayd
Copy link
Collaborator

@pmayd pmayd commented Aug 1, 2022

Closes #43

PR stellt einen cache_data decorator für die downloadfunktion get_data() zur Verfügung. get_data ist eine neue Methode, die mittels method="cubefile" cubefiles downloaden kann und mittels method="tablefile" tablefiles. Egal welche Methode verwendet wird, cache_data funktioniert wie folgt:

  • name ist ein required parameter für get_data, daher immer vorhanden
  • name wird verwendet, um im cache_dir (hinterlegt in der config.ini) im Unterordner data nach einem Ordner mit dem Namen zu suchen
  • Ist kein Ordner cache_dir/data/<name> vorhanden, wurde das Objekt noch nicht gedownloaded und get_data nutzt einen REST-API Call auf Genesis data Endpunkt
    • Wenn die Daten erfolgreich heruntergeladen wurden, wird das pandas Dataframe (get_data liefert immer ein DataFrame Objekt zurück) mittels df.to_csv() im Ordner cache_dir/data/<name>/<yyyymmdd>/<name>.xz komprimiert abgespeichert
  • Ist der Ordner cache_dir/data/<name> vorhanden, so wird im Ordner nach dem letzten Datum gesucht ( wird in int umgewandelt und sortiert), und die Datei <name>.xz mittels pandas pd.read_csv() gelesen.

Offen:

  • Soweit klappt alles, siehe auch Tests, aber wir müssen das natürlich weiter testen und durchdenken. Eine TODO ist noch, wie wir damit umgehen, wenn Daten auf GENESIS aktualisiert werden. Ich würde das aber nicht in den Dekorator packen, sondern eine eigene Funktion dafür schreiben mit der der User alle seine gecachten Datensätze auf Aktualität überprüfen kann. Dazu müssen wir eventuell noch im Pfad abspeichern, ob es ein cube oder table war, oder über catalogue danach suchen.

pmayd added 2 commits August 1, 2022 17:42
…data is now in data.py module and table.py and cube.py only hold specific parsing logic
@@ -4,77 +4,18 @@
import pandas as pd


def is_cube_metadata_header(line: str) -> bool:
"""Check if a line is a cube metadata header.
def get_data(data: str) -> pd.DataFrame:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

die Methode get_data existiert auch in data.py. Würde diese hier dann eher get_cube_data oder so nennen

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bzw, aktuell brauchen wir diese Methode ja nicht mehr, da in data.py schon die Logik abgebildet ist. Wobei man noch diskutieren könnte ob man diese Methode nicht analog zur tablefile-Methode in data.py importiert.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gut gesehen! Ich packe es in cube.py. Bin nicht ganz glücklich mit der Logik...stehe aber auf dem Schlauch, ob es besser ist diese Indirektion einzubauen oder ob wir nicht direkt die Methoden aus den Modulen verwenden sollten. Ich mache erstmal letzteres und verzichte auf die private methods ganz

return cube["QEI"]


def _get_tablefile_data(data: str) -> pd.DataFrame:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ich würde die Methode direkt aus table.py importieren

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

passt genau

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Idee war, dass man später das ganze einfach erweitern können soll, dazu bietet es sich dann meist an solche Methoden an einer Stelle zu haben, anstatt in einer Hauptmethode immer weitere if else einzubauen. Aber genau das passiert gerade noch in der Methode get_data, daher ist dein Vorschlag sauberer. Irgendwann sollte get_data so umgebaut werden, dass man nicht jede Methode per if-else einbaut, sondern der Code ab Zeile 46 sollte durch etwas ersetzt werden, was automatisch die verüfbaren Methoden ausliest.

return _get_cubefile_data(data)


def _get_cubefile_data(data: str) -> pd.DataFrame:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

siehe Comments incube.py. Glaube es macht Sinn wenn wir die Logik hier nach cube.py auslagern. Dann wäre es analog zu table (+ eventuell zukünftige Endpunkte)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gut gesehen danke

@pmayd
Copy link
Collaborator Author

pmayd commented Aug 9, 2022

Code überarbeitet und gemergt

@pmayd pmayd merged commit 2d89642 into dev Aug 9, 2022
@pmayd pmayd deleted the feature/43-cache-downloaded-data branch August 9, 2022 08:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants