Skip to content

Data Loading

src.preprocessing.data_loader

Enthält Methoden für das initiale Laden des Datensatzes und die Auswahl der gewünschten Zeilen und Spalten.

Author: André Gasch

load_dataset(dataset_path, format=loading_config['default_format'], csv_delimiter=loading_config['csv_delimiter'])

Liest einen Datensatz im CSV- oder JSON-Format von einem gegebenen Pfad.

Führt grundlegende Pfad- und Formatvalidierung durch und lädt die Daten in ein Pandas DataFrame. Handhabt leere Dateien.

Parameters:

Name Type Description Default
dataset_path str

Pfad zur Datensatzdatei (CSV oder JSON).

required
format Literal['json', 'csv']

Das Format der Datensatzdatei. Muss 'json' oder 'csv' sein. Standardmäßig 'csv'.

loading_config['default_format']
csv_delimiter str

Das Trennzeichen für CSV-Dateien. Wird ignoriert, wenn format='json'. Standardmäßig ','.

loading_config['csv_delimiter']

Returns:

Type Description
DataFrame

Ein Pandas DataFrame mit den geladenen Rohdaten.

Raises:

Type Description
FileNotFoundError

Wenn der angegebene dataset_path nicht existiert.

ValueError

Wenn das angegebene Format ('json' oder 'csv') ungültig ist.

EmptyDataError

Wenn die Datei leer ist oder kein gültiges DataFrame enthält.

Exception

Andere Fehler, die beim Lesen der Datei auftreten können (z.B. Formatfehler, falscher Delimiter etc.).

Source code in src\preprocessing\data_loader.py
def load_dataset(
    dataset_path: str,
    format: Literal["json", "csv"] = loading_config["default_format"],
    csv_delimiter: str = loading_config["csv_delimiter"],  # Nur relevant für CSV
) -> pd.DataFrame:
    """
    Liest einen Datensatz im CSV- oder JSON-Format von einem gegebenen Pfad.

    Führt grundlegende Pfad- und Formatvalidierung durch und lädt die Daten in ein
    Pandas DataFrame. Handhabt leere Dateien.

    Args:
        dataset_path: Pfad zur Datensatzdatei (CSV oder JSON).

        format: Das Format der Datensatzdatei. Muss 'json' oder 'csv' sein.
                Standardmäßig 'csv'.

        csv_delimiter: Das Trennzeichen für CSV-Dateien. Wird ignoriert, wenn
                       format='json'. Standardmäßig ','.

    Returns:
        Ein Pandas DataFrame mit den geladenen Rohdaten.

    Raises:
        FileNotFoundError: Wenn der angegebene dataset_path nicht existiert.

        ValueError: Wenn das angegebene Format ('json' oder 'csv') ungültig ist.

        pd.errors.EmptyDataError: Wenn die Datei leer ist oder kein gültiges
            DataFrame enthält.

        Exception: Andere Fehler, die beim Lesen der Datei auftreten können
            (z.B. Formatfehler, falscher Delimiter etc.).
    """
    # --- Validierung der Eingaben ---
    if not os.path.exists(dataset_path):
        raise FileNotFoundError(f"Die Datei wurde nicht gefunden: {dataset_path}")

    if format not in loading_config["allowed_formats"]:
        raise ValueError(
            f"""Ungültiges Format: '{format}'. Erlaubte Formate sind: {
                loading_config["allowed_formats"]
            }"""
        )

    # --- Laden des Datensatzes ---
    df: pd.DataFrame

    try:
        print(f"  -> Lade Datei: {dataset_path} im Format {format}")
        if format == "csv":
            # csv_delimiter wird nur bei CSV verwendet
            df = pd.read_csv(dataset_path, delimiter=csv_delimiter)
        elif format == "json":
            # read_json hat andere Standardparameter, hier die einfachste Form
            df = pd.read_json(dataset_path)
    except pd.errors.EmptyDataError:
        print(f"  -> WARNUNG: Die Datei '{dataset_path}' scheint leer zu sein.")
        # Rückgabe eines leeren DataFrames
        return pd.DataFrame()  # Gibt leeres DF zurück, keine Spalten garantiert
    except Exception as e:
        # Andere Lesefehler abfangen und neu auslösen
        raise Exception(
            f"Fehler beim Laden der Datei '{dataset_path}' im Format '{format}': {e}"
        ) from e

    print(f"  -> Laden abgeschlossen. DataFrame Shape: {df.shape}")
    return df

load_dataset_and_prepare_X_y(dataset_path=loading_config['dataset_path'], format=loading_config['default_format'], csv_delimiter=loading_config['csv_delimiter'], input_columns=prep_config['input_columns'], label_column=prep_config['label_column_name_in'])

Fasst load_dataset() und prepare_X_y() zusammen. Alle Parameter lassen sich übergeben, es sind jedoch passende Default-Werte gesetzt.

Source code in src\preprocessing\data_loader.py
def load_dataset_and_prepare_X_y(
    dataset_path: str = loading_config["dataset_path"],
    format: Literal["json", "csv"] = loading_config["default_format"],
    csv_delimiter: str = loading_config["csv_delimiter"],
    input_columns: List[str] = prep_config["input_columns"],
    label_column: str = prep_config["label_column_name_in"],
):
    """
    Fasst load_dataset() und prepare_X_y() zusammen. Alle Parameter
    lassen sich übergeben, es sind jedoch passende Default-Werte gesetzt.
    """
    df = load_dataset(dataset_path, format=format, csv_delimiter=csv_delimiter)
    X, y = prepare_X_y(df, input_columns=input_columns, label_column=label_column)

    return X, y

prepare_X_y(df, input_columns, label_column)

Extrahiert X und y, indem relevante Input-Spalten und Label-Spalte getrennt werden.

Parameters:

Name Type Description Default
df DataFrame

Der pandas DataFrame, der vorbereitet werden soll.

required
input_columns List[str]

Eine Liste von Spaltennamen, die als Features (X) verwendet werden sollen.

required
label_column str

Der Name der Spalte, die als Label (y) verwendet werden soll.

required

Returns:

Type Description
DataFrame

Ein Tupel (X, y), wobei X ein DataFrame der Features und y eine Series des

Series

Labels ist.

Raises:

Type Description
KeyError

Wenn eine der angegebenen Spalten nicht im DataFrame existiert.

ValueError

Wenn input_columns leer ist oder label_column leer ist. Wenn label_column in input_columns enthalten ist.

Source code in src\preprocessing\data_loader.py
def prepare_X_y(
    df: pd.DataFrame, input_columns: List[str], label_column: str
) -> Tuple[pd.DataFrame, pd.Series]:
    """
    Extrahiert X und y, indem relevante Input-Spalten und Label-Spalte getrennt werden.

    Args:
        df: Der pandas DataFrame, der vorbereitet werden soll.

        input_columns: Eine Liste von Spaltennamen, die als Features (X) verwendet
            werden sollen.

        label_column: Der Name der Spalte, die als Label (y) verwendet werden soll.

    Returns:
        Ein Tupel (X, y), wobei X ein DataFrame der Features und y eine Series des
        Labels ist.

    Raises:
        KeyError: Wenn eine der angegebenen Spalten nicht im DataFrame existiert.

        ValueError: Wenn input_columns leer ist oder label_column leer ist.
                    Wenn label_column in input_columns enthalten ist.
    """
    print("-> Starte prepare_dataset...")

    # --- Grundlegende Eingabevalidierung ---
    if not input_columns:
        raise ValueError("Die Liste 'input_columns' darf nicht leer sein.")
    if not label_column:
        raise ValueError("'label_column' darf nicht leer sein.")
    if label_column in input_columns:
        raise ValueError(
            f"""Die Label-Spalte '{label_column}' darf nicht in 'input_columns'
             enthalten sein."""
        )

    # --- Spaltenexistenz prüfen (Pandas wird hier sowieso einen KeyError werfen) ---
    missing_inputs = [col for col in input_columns if col not in df.columns]
    if missing_inputs:
        raise KeyError(
            f"Die folgenden Input-Spalten fehlen im DataFrame: {missing_inputs}"
        )
    if label_column not in df.columns:
        raise KeyError(f"Die Label-Spalte '{label_column}' fehlt im DataFrame.")

    # --- Erstellen von X und y ---
    # Sicherstellen, dass X nur die input_columns in der angegebenen Reihenfolge enthält
    X = df[input_columns].copy()  # .copy() um SettingWithCopyWarning zu vermeiden
    y = df[label_column].copy()

    # Sicherstellen, dass y eine Series ist
    if not isinstance(y, pd.Series):
        # Dies sollte durch df[label_column] bereits eine Series sein, aber zur
        # Sicherheit
        y = pd.Series(y, name=label_column)
    elif (
        y.name is not prep_config["label_column_name_out"]
    ):  # Falls die Serie anonym ist
        y.name = prep_config["label_column_name_out"]

    print(f"  -> X erstellt mit Shape: {X.shape}, Spalten: {X.columns.tolist()}")
    print(f"  -> y erstellt mit Shape: {y.shape}, Name: {y.name}")
    print("-> prepare_dataset abgeschlossen.")
    return X, y

— André Gasch