diff --git a/code/corelation.py b/code/corelation.py index 2b55ec6..79bc956 100644 --- a/code/corelation.py +++ b/code/corelation.py @@ -2,109 +2,7 @@ import pandas as pd import matplotlib.pyplot as plt import numpy as np from datetime import datetime -import os -# Manuelle Zuordnung der Monatsnamen von Deutsch auf Englisch -# month_translation = { -# 'Jan': 'Jan', 'Feb': 'Feb', 'Mär': 'Mar', 'Apr': 'Apr', 'Mai': 'May', 'Jun': 'Jun', -# 'Jul': 'Jul', 'Aug': 'Aug', 'Sep': 'Sep', 'Okt': 'Oct', 'Nov': 'Nov', 'Dez': 'Dec', 'Mrz': 'Mar' -# } - - -# Funktion, um 'Okt 10-16' in eine Kalenderwoche zu konvertieren und das Startdatum zurückzugeben -# def convert_to_week_number_and_start_date(date_range_str): -# # Splitte den Datumsbereich in Monat und Tage -# start_part, end_part = date_range_str.split(" - ") -# start_month_str, start_day = start_part.split(" ") -# start_day = int(start_day) # Nimm den Starttag -# -# # Konvertiere den deutschen Monatsnamen in den englischen -# if start_month_str in month_translation: -# start_month_str = month_translation[start_month_str] -# -# # Erstelle das Datum basierend auf dem Starttag und dem aktuellen Jahr -# current_year = datetime.now().year -# date_str = f"{start_month_str} {start_day} {current_year}" -# -# try: -# start_date = datetime.strptime(date_str, "%b %d %Y") # Konvertiere in ein Datum -# except ValueError: -# raise ValueError(f"Ungültiges Datum: {date_str}") -# -# week_number = start_date.isocalendar()[1] # Kalenderwoche ermitteln -# -# return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück -# Funktion, um 'Okt 10-16' oder 'Okt 10 - 16' in eine Kalenderwoche zu konvertieren und das Startdatum zurückzugeben -# def convert_to_week_number_and_start_date(date_range_str): -# # Entferne zusätzliche Leerzeichen um den Bindestrich herum -# date_range_str = date_range_str.replace(" - ", "-") -# -# # Splitte den Datumsbereich in Start- und Endbereich -# start_part, end_part = date_range_str.split("-") -# start_month_str, start_day = start_part.split(" ") -# start_day = int(start_day.strip()) # Nimm den Starttag und entferne etwaige Leerzeichen -# -# # Konvertiere den deutschen Monatsnamen in den englischen -# if start_month_str in month_translation: -# start_month_str = month_translation[start_month_str] -# -# # Erstelle das Datum basierend auf dem Starttag und dem aktuellen Jahr -# current_year = datetime.now().year -# date_str = f"{start_month_str} {start_day} {current_year}" -# -# try: -# start_date = datetime.strptime(date_str, "%b %d %Y") # Konvertiere in ein Datum -# except ValueError: -# raise ValueError(f"Ungültiges Datum: {date_str}") -# -# week_number = start_date.isocalendar()[1] # Kalenderwoche ermitteln -# -# return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück - -# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4' oder 'Okt 10-16' in die Kalenderwoche zu konvertieren -# und das Startdatum zurückzugeben -# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4' oder 'Okt 10-16' in die Kalenderwoche zu konvertieren -# und das Startdatum zurückzugeben -# def convert_to_week_number_and_start_date(date_range_str): -# # Entferne zusätzliche Leerzeichen um den Bindestrich herum -# date_range_str = date_range_str.replace(" - ", "-") -# -# # Splitte den Datumsbereich in Start- und Endteil -# start_part, end_part = date_range_str.split("-") -# -# # Verarbeite den Startteil -# start_month_str, start_day = start_part.split(" ") -# start_day = int(start_day.strip()) # Nimm den Starttag und entferne etwaige Leerzeichen -# -# # Wenn der Endteil einen Monat enthält, verarbeite ihn ebenfalls -# if " " in end_part: -# end_month_str, end_day = end_part.split(" ") -# end_day = int(end_day.strip()) # Nimm den Endtag -# else: -# # Wenn der Endteil keinen Monat enthält, verwenden wir denselben Monat wie im Startteil -# end_month_str = start_month_str -# end_day = int(end_part.strip()) -# -# # Konvertiere den deutschen Monatsnamen in den englischen für beide Monate -# if start_month_str in month_translation: -# start_month_str = month_translation[start_month_str] -# if end_month_str in month_translation: -# end_month_str = month_translation[end_month_str] -# -# # Erstelle das Datum basierend auf dem Starttag und dem aktuellen Jahr -# current_year = datetime.now().year -# start_date_str = f"{start_month_str} {start_day} {current_year}" -# -# try: -# # Konvertiere in ein Datum -# start_date = datetime.strptime(start_date_str, "%b %d %Y") -# except ValueError: -# raise ValueError(f"Ungültiges Startdatum: {start_date_str}") -# -# # Berechne die Kalenderwoche basierend auf dem Startdatum -# week_number = start_date.isocalendar()[1] -# -# return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück # Manuelle Zuordnung der Monatsnamen von Deutsch auf Englisch month_translation = { 'Jan': 'Jan', 'Feb': 'Feb', 'Mär': 'Mar', 'Mrz': 'Mar', 'Apr': 'Apr', 'Mai': 'May', 'Jun': 'Jun', @@ -112,8 +10,8 @@ month_translation = { } -# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4', 'Dez 29, 2023-Jan 4, 2024', 'Dez 22-28 2023' oder 'Dez 28' in Kalenderwoche und Startdatum zu konvertieren -def convert_to_week_number_and_start_date(date_range_str): +# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4', 'Dez 22-28 2023' oder 'Dez 28' in Kalenderwoche und Jahr zu konvertieren +def convert_to_week_and_year(date_range_str): # Entferne zusätzliche Leerzeichen um den Bindestrich herum und entferne Kommas date_range_str = date_range_str.replace(" - ", "-").replace(",", "") @@ -131,10 +29,11 @@ def convert_to_week_number_and_start_date(date_range_str): # Konvertiere das Datum start_date = datetime.strptime(f"{month_str} {day} {year_str}", "%b %d %Y") - # Berechne die Kalenderwoche + # Berechne die Kalenderwoche und das Jahr week_number = start_date.isocalendar()[1] + year = start_date.year - return week_number, start_date.strftime('%Y-%m-%d') + return f"W{week_number}-{year}" # Prüfen, ob das Jahr am Ende steht (z.B. 'Dez 22-28 2023') if date_range_str[-4:].isdigit(): @@ -177,79 +76,58 @@ def convert_to_week_number_and_start_date(date_range_str): except ValueError: raise ValueError(f"Ungültiges Startdatum: {start_month_str} {start_day} {year_str}") - try: - # Konvertiere das Enddatum in ein Datum - end_date = datetime.strptime(f"{end_month_str} {end_day} {year_str}", "%b %d %Y") - except ValueError: - raise ValueError(f"Ungültiges Enddatum: {end_month_str} {end_day} {year_str}") - - # Berechne die Kalenderwoche basierend auf dem Startdatum + # Berechne die Kalenderwoche und das Jahr basierend auf dem Startdatum week_number = start_date.isocalendar()[1] + year = start_date.year - return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück + return f"W{week_number}-{year}" # Gib Kalenderwoche und Jahr im Format W-YYYY zurück -# Funktion zum Bereinigen und Zwischenspeichern der Daten -def clean_and_save_data(hr_data, sleep_data, output_dir='sandbox'): - # Entferne 'bpm' und konvertiere die Werte in numerische Daten - hr_data['In Ruhe'] = hr_data['In Ruhe'].str.replace(' bpm', '').astype(float) - hr_data['Hoch'] = hr_data['Hoch'].str.replace(' bpm', '').astype(float) +# Datei Pfade +hr_data_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/hr_gramic.csv' +sleep_data_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/sleep_gramic.csv' +hr_clean_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/sandbox/hr_data_clean.csv' +sleep_clean_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/sandbox/sleep_data_clean.csv' +combined_data_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/sandbox/combined_data.csv' - # Konvertiere die Spalte 'Datum' in Kalenderwoche (KW) und Startdatum - hr_data[['week', 'start_date']] = hr_data['Datum'].apply( - lambda x: pd.Series(convert_to_week_number_and_start_date(x))) +# Schritt 1: Lade die HR-Daten (mit Semikolon separiert) und entferne 'bpm' +hr_data = pd.read_csv(hr_data_path, sep=';') - # Berechne den Durchschnitt der Herzfrequenzdaten (In Ruhe und Hoch) - hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1) +# Entferne 'bpm' und konvertiere die Werte in numerische Daten +hr_data['In Ruhe'] = hr_data['In Ruhe'].str.replace(' bpm', '').astype(float) +hr_data['Hoch'] = hr_data['Hoch'].str.replace(' bpm', '').astype(float) - # Konvertiere auch das 'Datum' der Schlafdaten in Kalenderwoche (KW) und Startdatum - sleep_data[['week', 'start_date']] = sleep_data['Datum'].apply( - lambda x: pd.Series(convert_to_week_number_and_start_date(x))) +# Konvertiere die Spalte 'Datum' in Kalenderwoche (KW und Jahr) +hr_data['Woche'] = hr_data['Datum'].apply(convert_to_week_and_year) - # Speichere die bereinigten Daten in 'sandbox' - if not os.path.exists(output_dir): - os.makedirs(output_dir) +# Berechne den Durchschnitt der Herzfrequenzdaten (In Ruhe und Hoch) +hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1) - hr_data_clean_path = os.path.join(output_dir, 'hr_data_clean.csv') - sleep_data_clean_path = os.path.join(output_dir, 'sleep_data_clean.csv') +# Speichere nur die Spalten 'Woche' und 'avg_hr' in einer neuen CSV-Datei +hr_data_clean = hr_data[['Woche', 'avg_hr']] +hr_data_clean.to_csv(hr_clean_path, index=False) - hr_data.to_csv(hr_data_clean_path, sep=';', index=False) - sleep_data.to_csv(sleep_data_clean_path, sep=',', index=False) +# Schritt 2: Lade die Schlafdaten (mit Komma separiert) +sleep_data = pd.read_csv(sleep_data_path, sep=',') - print(f"HR-Daten wurden bereinigt und in {hr_data_clean_path} gespeichert.") - print(f"Schlafdaten wurden bereinigt und in {sleep_data_clean_path} gespeichert.") +# Konvertiere die Spalte 'Datum' in Kalenderwoche (KW und Jahr) +sleep_data['Woche'] = sleep_data['Datum'].apply(convert_to_week_and_year) - return hr_data, sleep_data +# Speichere nur die Spalten 'Woche' und 'Durchschnittliche Dauer' in einer neuen CSV-Datei +sleep_data_clean = sleep_data[['Woche', 'Durchschnittliche Dauer']] +sleep_data_clean.to_csv(sleep_clean_path, index=False) +# Schritt 3: Kombiniere die HR- und Schlafdaten basierend auf der 'Woche' +combined_data = pd.merge(hr_data_clean, sleep_data_clean, on='Woche', how='inner') -# Schritt 1: Lade die HR- und Schlafdaten -hr_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/hr_gramic.csv', - sep=';') -sleep_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/sleep_gramic.csv', - sep=',') +# Speichere das kombinierte Dataset in einer neuen CSV-Datei +combined_data.to_csv(combined_data_path, index=False) -# Bereinige und speichere die Daten -hr_data, sleep_data = clean_and_save_data(hr_data, sleep_data) - -# Schritt 2: Sortiere beide Datensätze nach 'week' und 'start_date' -hr_data = hr_data.sort_values(by=['week', 'start_date']) -sleep_data = sleep_data.sort_values(by=['week', 'start_date']) - -# Schritt 3: Kombiniere die beiden Datensätze anhand der 'week' und 'start_date' Spalten mit einem äußeren Join -combined_data = pd.merge(hr_data, sleep_data, on=['week', 'start_date'], how='outer') - -# Zeige die kombinierten Daten -print("\nKombinierte Daten:") -print(combined_data) - -# Schritt 4: Entferne alle Zeilen mit fehlenden Daten -combined_data = combined_data.dropna() - -# Schritt 5: Berechne die Korrelation zwischen 'avg_hr' und 'Durchschnittliche Dauer' +# Schritt 4: Berechne die Korrelation zwischen avg_hr und der Schlafdauer correlation = combined_data['avg_hr'].corr(combined_data['Durchschnittliche Dauer']) -print(f"\nDie Korrelation zwischen der durchschnittlichen Herzfrequenz und der Schlafdauer ist: {correlation}") +print(f"Die Korrelation zwischen der durchschnittlichen Herzfrequenz und der Schlafdauer ist: {correlation}") -# Schritt 6: Visualisiere den Zusammenhang zwischen Herzfrequenz und Schlafdauer +# Schritt 5: Visualisiere den Zusammenhang zwischen Herzfrequenz und Schlafdauer plt.figure(figsize=(10, 6)) plt.scatter(combined_data['avg_hr'], combined_data['Durchschnittliche Dauer'], color='blue', label='Datenpunkte') plt.title('Zusammenhang zwischen Herzfrequenz (Durchschnitt) und Schlafdauer') diff --git a/code/corelation_old4.py b/code/corelation_old4.py new file mode 100644 index 0000000..2b55ec6 --- /dev/null +++ b/code/corelation_old4.py @@ -0,0 +1,266 @@ +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +from datetime import datetime +import os + +# Manuelle Zuordnung der Monatsnamen von Deutsch auf Englisch +# month_translation = { +# 'Jan': 'Jan', 'Feb': 'Feb', 'Mär': 'Mar', 'Apr': 'Apr', 'Mai': 'May', 'Jun': 'Jun', +# 'Jul': 'Jul', 'Aug': 'Aug', 'Sep': 'Sep', 'Okt': 'Oct', 'Nov': 'Nov', 'Dez': 'Dec', 'Mrz': 'Mar' +# } + + +# Funktion, um 'Okt 10-16' in eine Kalenderwoche zu konvertieren und das Startdatum zurückzugeben +# def convert_to_week_number_and_start_date(date_range_str): +# # Splitte den Datumsbereich in Monat und Tage +# start_part, end_part = date_range_str.split(" - ") +# start_month_str, start_day = start_part.split(" ") +# start_day = int(start_day) # Nimm den Starttag +# +# # Konvertiere den deutschen Monatsnamen in den englischen +# if start_month_str in month_translation: +# start_month_str = month_translation[start_month_str] +# +# # Erstelle das Datum basierend auf dem Starttag und dem aktuellen Jahr +# current_year = datetime.now().year +# date_str = f"{start_month_str} {start_day} {current_year}" +# +# try: +# start_date = datetime.strptime(date_str, "%b %d %Y") # Konvertiere in ein Datum +# except ValueError: +# raise ValueError(f"Ungültiges Datum: {date_str}") +# +# week_number = start_date.isocalendar()[1] # Kalenderwoche ermitteln +# +# return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück +# Funktion, um 'Okt 10-16' oder 'Okt 10 - 16' in eine Kalenderwoche zu konvertieren und das Startdatum zurückzugeben +# def convert_to_week_number_and_start_date(date_range_str): +# # Entferne zusätzliche Leerzeichen um den Bindestrich herum +# date_range_str = date_range_str.replace(" - ", "-") +# +# # Splitte den Datumsbereich in Start- und Endbereich +# start_part, end_part = date_range_str.split("-") +# start_month_str, start_day = start_part.split(" ") +# start_day = int(start_day.strip()) # Nimm den Starttag und entferne etwaige Leerzeichen +# +# # Konvertiere den deutschen Monatsnamen in den englischen +# if start_month_str in month_translation: +# start_month_str = month_translation[start_month_str] +# +# # Erstelle das Datum basierend auf dem Starttag und dem aktuellen Jahr +# current_year = datetime.now().year +# date_str = f"{start_month_str} {start_day} {current_year}" +# +# try: +# start_date = datetime.strptime(date_str, "%b %d %Y") # Konvertiere in ein Datum +# except ValueError: +# raise ValueError(f"Ungültiges Datum: {date_str}") +# +# week_number = start_date.isocalendar()[1] # Kalenderwoche ermitteln +# +# return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück + +# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4' oder 'Okt 10-16' in die Kalenderwoche zu konvertieren +# und das Startdatum zurückzugeben +# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4' oder 'Okt 10-16' in die Kalenderwoche zu konvertieren +# und das Startdatum zurückzugeben +# def convert_to_week_number_and_start_date(date_range_str): +# # Entferne zusätzliche Leerzeichen um den Bindestrich herum +# date_range_str = date_range_str.replace(" - ", "-") +# +# # Splitte den Datumsbereich in Start- und Endteil +# start_part, end_part = date_range_str.split("-") +# +# # Verarbeite den Startteil +# start_month_str, start_day = start_part.split(" ") +# start_day = int(start_day.strip()) # Nimm den Starttag und entferne etwaige Leerzeichen +# +# # Wenn der Endteil einen Monat enthält, verarbeite ihn ebenfalls +# if " " in end_part: +# end_month_str, end_day = end_part.split(" ") +# end_day = int(end_day.strip()) # Nimm den Endtag +# else: +# # Wenn der Endteil keinen Monat enthält, verwenden wir denselben Monat wie im Startteil +# end_month_str = start_month_str +# end_day = int(end_part.strip()) +# +# # Konvertiere den deutschen Monatsnamen in den englischen für beide Monate +# if start_month_str in month_translation: +# start_month_str = month_translation[start_month_str] +# if end_month_str in month_translation: +# end_month_str = month_translation[end_month_str] +# +# # Erstelle das Datum basierend auf dem Starttag und dem aktuellen Jahr +# current_year = datetime.now().year +# start_date_str = f"{start_month_str} {start_day} {current_year}" +# +# try: +# # Konvertiere in ein Datum +# start_date = datetime.strptime(start_date_str, "%b %d %Y") +# except ValueError: +# raise ValueError(f"Ungültiges Startdatum: {start_date_str}") +# +# # Berechne die Kalenderwoche basierend auf dem Startdatum +# week_number = start_date.isocalendar()[1] +# +# return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück +# Manuelle Zuordnung der Monatsnamen von Deutsch auf Englisch +month_translation = { + 'Jan': 'Jan', 'Feb': 'Feb', 'Mär': 'Mar', 'Mrz': 'Mar', 'Apr': 'Apr', 'Mai': 'May', 'Jun': 'Jun', + 'Jul': 'Jul', 'Aug': 'Aug', 'Sep': 'Sep', 'Okt': 'Oct', 'Nov': 'Nov', 'Dez': 'Dec' +} + + +# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4', 'Dez 29, 2023-Jan 4, 2024', 'Dez 22-28 2023' oder 'Dez 28' in Kalenderwoche und Startdatum zu konvertieren +def convert_to_week_number_and_start_date(date_range_str): + # Entferne zusätzliche Leerzeichen um den Bindestrich herum und entferne Kommas + date_range_str = date_range_str.replace(" - ", "-").replace(",", "") + + # Prüfen, ob das Format nur einen Tag und Monat enthält (z.B. 'Dez 28') + if "-" not in date_range_str and len(date_range_str.split(" ")) == 2: + # Nur ein Datum (Monat und Tag) + month_str, day_str = date_range_str.split(" ") + day = int(day_str.strip()) + year_str = str(datetime.now().year) # Verwende das aktuelle Jahr + + # Konvertiere den deutschen Monatsnamen in den englischen + if month_str in month_translation: + month_str = month_translation[month_str] + + # Konvertiere das Datum + start_date = datetime.strptime(f"{month_str} {day} {year_str}", "%b %d %Y") + + # Berechne die Kalenderwoche + week_number = start_date.isocalendar()[1] + + return week_number, start_date.strftime('%Y-%m-%d') + + # Prüfen, ob das Jahr am Ende steht (z.B. 'Dez 22-28 2023') + if date_range_str[-4:].isdigit(): + # Jahr am Ende des Datums + year_str = date_range_str[-4:] + date_range_str = date_range_str[:-5] # Entferne das Jahr aus der Datumsangabe + else: + # Kein Jahr am Ende -> nutze das aktuelle Jahr + year_str = str(datetime.now().year) + + # Splitte den Datumsbereich in Start- und Endteil + start_part, end_part = date_range_str.split("-") + + # Verarbeite den Startteil + start_parts = start_part.split(" ") + start_month_str = start_parts[0] + start_day = int(start_parts[1].strip()) # Nimm den Starttag und entferne etwaige Leerzeichen + + # Verarbeite den Endteil + end_parts = end_part.split(" ") + + # Verarbeite das Enddatum, basierend darauf, ob der Endteil das Jahr enthält + if len(end_parts) == 2: # Fall: 'Apr 4' + end_month_str = end_parts[0] + end_day = int(end_parts[1].strip()) + else: + # Fall: kein Monat -> nur Tag (z.B. '28' im Format 'Dez 22-28 2023') + end_month_str = start_month_str + end_day = int(end_parts[0].strip()) + + # Konvertiere den deutschen Monatsnamen in den englischen für beide Monate + if start_month_str in month_translation: + start_month_str = month_translation[start_month_str] + if end_month_str in month_translation: + end_month_str = month_translation[end_month_str] + + try: + # Konvertiere das Startdatum in ein Datum + start_date = datetime.strptime(f"{start_month_str} {start_day} {year_str}", "%b %d %Y") + except ValueError: + raise ValueError(f"Ungültiges Startdatum: {start_month_str} {start_day} {year_str}") + + try: + # Konvertiere das Enddatum in ein Datum + end_date = datetime.strptime(f"{end_month_str} {end_day} {year_str}", "%b %d %Y") + except ValueError: + raise ValueError(f"Ungültiges Enddatum: {end_month_str} {end_day} {year_str}") + + # Berechne die Kalenderwoche basierend auf dem Startdatum + week_number = start_date.isocalendar()[1] + + return week_number, start_date.strftime('%Y-%m-%d') # Gib KW und das Startdatum zurück + + +# Funktion zum Bereinigen und Zwischenspeichern der Daten +def clean_and_save_data(hr_data, sleep_data, output_dir='sandbox'): + # Entferne 'bpm' und konvertiere die Werte in numerische Daten + hr_data['In Ruhe'] = hr_data['In Ruhe'].str.replace(' bpm', '').astype(float) + hr_data['Hoch'] = hr_data['Hoch'].str.replace(' bpm', '').astype(float) + + # Konvertiere die Spalte 'Datum' in Kalenderwoche (KW) und Startdatum + hr_data[['week', 'start_date']] = hr_data['Datum'].apply( + lambda x: pd.Series(convert_to_week_number_and_start_date(x))) + + # Berechne den Durchschnitt der Herzfrequenzdaten (In Ruhe und Hoch) + hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1) + + # Konvertiere auch das 'Datum' der Schlafdaten in Kalenderwoche (KW) und Startdatum + sleep_data[['week', 'start_date']] = sleep_data['Datum'].apply( + lambda x: pd.Series(convert_to_week_number_and_start_date(x))) + + # Speichere die bereinigten Daten in 'sandbox' + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + hr_data_clean_path = os.path.join(output_dir, 'hr_data_clean.csv') + sleep_data_clean_path = os.path.join(output_dir, 'sleep_data_clean.csv') + + hr_data.to_csv(hr_data_clean_path, sep=';', index=False) + sleep_data.to_csv(sleep_data_clean_path, sep=',', index=False) + + print(f"HR-Daten wurden bereinigt und in {hr_data_clean_path} gespeichert.") + print(f"Schlafdaten wurden bereinigt und in {sleep_data_clean_path} gespeichert.") + + return hr_data, sleep_data + + +# Schritt 1: Lade die HR- und Schlafdaten +hr_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/hr_gramic.csv', + sep=';') +sleep_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/sleep_gramic.csv', + sep=',') + +# Bereinige und speichere die Daten +hr_data, sleep_data = clean_and_save_data(hr_data, sleep_data) + +# Schritt 2: Sortiere beide Datensätze nach 'week' und 'start_date' +hr_data = hr_data.sort_values(by=['week', 'start_date']) +sleep_data = sleep_data.sort_values(by=['week', 'start_date']) + +# Schritt 3: Kombiniere die beiden Datensätze anhand der 'week' und 'start_date' Spalten mit einem äußeren Join +combined_data = pd.merge(hr_data, sleep_data, on=['week', 'start_date'], how='outer') + +# Zeige die kombinierten Daten +print("\nKombinierte Daten:") +print(combined_data) + +# Schritt 4: Entferne alle Zeilen mit fehlenden Daten +combined_data = combined_data.dropna() + +# Schritt 5: Berechne die Korrelation zwischen 'avg_hr' und 'Durchschnittliche Dauer' +correlation = combined_data['avg_hr'].corr(combined_data['Durchschnittliche Dauer']) +print(f"\nDie Korrelation zwischen der durchschnittlichen Herzfrequenz und der Schlafdauer ist: {correlation}") + +# Schritt 6: Visualisiere den Zusammenhang zwischen Herzfrequenz und Schlafdauer +plt.figure(figsize=(10, 6)) +plt.scatter(combined_data['avg_hr'], combined_data['Durchschnittliche Dauer'], color='blue', label='Datenpunkte') +plt.title('Zusammenhang zwischen Herzfrequenz (Durchschnitt) und Schlafdauer') +plt.xlabel('Durchschnittliche Herzfrequenz (bpm)') +plt.ylabel('Schlafdauer (Stunden)') +plt.grid(True) + +# Linie zur Visualisierung des Trends hinzufügen +m, b = np.polyfit(combined_data['avg_hr'], combined_data['Durchschnittliche Dauer'], 1) +plt.plot(combined_data['avg_hr'], m * combined_data['avg_hr'] + b, color='red', + label=f'Trendlinie (Kor = {correlation:.2f})') + +plt.legend() +plt.show() diff --git a/code/sandbox/hr_data_clean.csv b/code/sandbox/hr_data_clean.csv deleted file mode 100644 index e098c31..0000000 --- a/code/sandbox/hr_data_clean.csv +++ /dev/null @@ -1,53 +0,0 @@ -Datum;In Ruhe;Hoch;week;start_date;avg_hr -Okt 4-10;67.0;130.0;40;2024-10-04;98.5 -Sep 27 - Okt 3;67.0;143.0;39;2024-09-27;105.0 -Sep 20-26;66.0;149.0;38;2024-09-20;107.5 -Sep 13-19;66.0;144.0;37;2024-09-13;105.0 -Sep 6-12;62.0;132.0;36;2024-09-06;97.0 -Aug 30 - Sep 5;64.0;141.0;35;2024-08-30;102.5 -Aug 23-29;67.0;150.0;34;2024-08-23;108.5 -Aug 16-22;63.0;143.0;33;2024-08-16;103.0 -Aug 9-15;69.0;141.0;32;2024-08-09;105.0 -Aug 2-8;67.0;140.0;31;2024-08-02;103.5 -Jul 26 - Aug 1;67.0;147.0;30;2024-07-26;107.0 -Jul 19-25;69.0;136.0;29;2024-07-19;102.5 -Jul 12-18;66.0;151.0;28;2024-07-12;108.5 -Jul 5-11;67.0;146.0;27;2024-07-05;106.5 -Jun 28 - Jul 4;66.0;157.0;26;2024-06-28;111.5 -Jun 21-27;64.0;141.0;25;2024-06-21;102.5 -Jun 14-20;70.0;145.0;24;2024-06-14;107.5 -Jun 7-13;69.0;134.0;23;2024-06-07;101.5 -Mai 31 - Jun 6;70.0;139.0;22;2024-05-31;104.5 -Mai 24-30;72.0;142.0;21;2024-05-24;107.0 -Mai 17-23;72.0;135.0;20;2024-05-17;103.5 -Mai 10-16;71.0;147.0;19;2024-05-10;109.0 -Mai 3-9;73.0;142.0;18;2024-05-03;107.5 -Apr 26 - Mai 2;69.0;151.0;17;2024-04-26;110.0 -Apr 19-25;61.0;135.0;16;2024-04-19;98.0 -Apr 12-18;58.0;140.0;15;2024-04-12;99.0 -Apr 5-11;64.0;131.0;14;2024-04-05;97.5 -Mrz 29 - Apr 4;63.0;139.0;13;2024-03-29;101.0 -Mrz 22-28;65.0;135.0;12;2024-03-22;100.0 -Mrz 15-21;66.0;137.0;11;2024-03-15;101.5 -Mrz 8-14;62.0;136.0;10;2024-03-08;99.0 -Mrz 1-7;70.0;134.0;9;2024-03-01;102.0 -Feb 23-29;68.0;144.0;8;2024-02-23;106.0 -Feb 16-22;71.0;132.0;7;2024-02-16;101.5 -Feb 9-15;65.0;143.0;6;2024-02-09;104.0 -Feb 2-8;66.0;133.0;5;2024-02-02;99.5 -Jan 26 - Feb 1;59.0;142.0;4;2024-01-26;100.5 -Jan 19-25;62.0;136.0;3;2024-01-19;99.0 -Jan 12-18;60.0;134.0;2;2024-01-12;97.0 -Jan 5-11;56.0;139.0;1;2024-01-05;97.5 -Dez 29, 2023 - Jan 4, 2024;59.0;128.0;52;2024-12-29;93.5 -Dez 22-28, 2023;52.0;124.0;51;2023-12-22;88.0 -Dez 15-21, 2023;57.0;133.0;50;2023-12-15;95.0 -Dez 8-14, 2023;65.0;133.0;49;2023-12-08;99.0 -Dez 1-7, 2023;69.0;134.0;48;2023-12-01;101.5 -Nov 24-30, 2023;68.0;139.0;47;2023-11-24;103.5 -Nov 17-23, 2023;68.0;143.0;46;2023-11-17;105.5 -Nov 10-16, 2023;64.0;144.0;45;2023-11-10;104.0 -Nov 3-9, 2023;63.0;140.0;44;2023-11-03;101.5 -Okt 27 - Nov 2, 2023;57.0;133.0;43;2023-10-27;95.0 -Okt 20-26, 2023;55.0;138.0;42;2023-10-20;96.5 -Okt 13-19, 2023;50.0;121.0;41;2023-10-13;85.5 diff --git a/code/sandbox/sleep_data_clean.csv b/code/sandbox/sleep_data_clean.csv deleted file mode 100644 index 0fc8250..0000000 --- a/code/sandbox/sleep_data_clean.csv +++ /dev/null @@ -1,53 +0,0 @@ -Datum,Ø Score,Ø Qualität,Durchschnittliche Dauer,Ø Schlafenszeit,Ø Aufstehzeit,week,start_date -Okt 10-16,46,Schlecht,6h 11min,1:28,7:50,41,2024-10-10 -Okt 3-9,56,Schlecht,6h 34min,0:33,7:22,40,2024-10-03 -Sep 26 - Okt 2,52,Schlecht,6h 23min,0:00,6:37,39,2024-09-26 -Sep 19-25,59,Schlecht,6h 41min,0:27,7:16,38,2024-09-19 -Sep 12-18,59,Schlecht,6h 18min,0:48,7:12,37,2024-09-12 -Sep 5-11,55,Schlecht,6h 19min,0:56,7:22,36,2024-09-05 -Aug 29 - Sep 4,66,Ausreichend,7h 1min,0:21,7:31,35,2024-08-29 -Aug 22-28,57,Schlecht,6h 17min,0:35,6:59,34,2024-08-22 -Aug 15-21,72,Ausreichend,6h 36min,0:38,7:25,33,2024-08-15 -Aug 8-14,56,Schlecht,5h 45min,0:16,6:06,32,2024-08-08 -Aug 1-7,64,Ausreichend,7h 4min,0:39,8:10,31,2024-08-01 -Jul 25-31,61,Ausreichend,6h 52min,0:40,7:56,30,2024-07-25 -Jul 18-24,54,Schlecht,6h 26min,2:16,9:19,29,2024-07-18 -Jul 11-17,74,Ausreichend,7h 10min,0:06,7:26,28,2024-07-11 -Jul 4-10,58,Schlecht,7h 35min,0:45,9:05,27,2024-07-04 -Jun 27 - Jul 3,60,Ausreichend,6h 8min,1:22,7:42,26,2024-06-27 -Jun 20-26,69,Ausreichend,6h 30min,0:19,6:58,25,2024-06-20 -Jun 13-19,59,Schlecht,6h 1min,0:25,6:33,24,2024-06-13 -Jun 6-12,60,Ausreichend,6h 22min,0:02,6:30,23,2024-06-06 -Mai 30 - Jun 5,60,Ausreichend,6h 33min,0:34,7:15,22,2024-05-30 -Mai 23-29,51,Schlecht,6h 47min,0:56,7:54,21,2024-05-23 -Mai 16-22,50,Schlecht,5h 51min,1:13,7:08,20,2024-05-16 -Mai 9-15,55,Schlecht,6h 21min,0:58,7:23,19,2024-05-09 -Mai 2-8,40,Schlecht,5h 36min,0:39,6:19,18,2024-05-02 -Apr 25 - Mai 1,55,Schlecht,6h 2min,1:18,7:26,17,2024-04-25 -Apr 18-24,56,Schlecht,6h 28min,3:11,9:55,16,2024-04-18 -Apr 11-17,56,Schlecht,6h 17min,1:23,7:51,15,2024-04-11 -Apr 4-10,62,Ausreichend,6h 18min,0:39,7:10,14,2024-04-04 -Mrz 28 - Apr 3,68,Ausreichend,6h 50min,1:45,8:51,13,2024-03-28 -Mrz 21-27,60,Ausreichend,6h 9min,0:56,7:13,12,2024-03-21 -Mrz 14-20,54,Schlecht,6h 11min,1:03,7:24,11,2024-03-14 -Mrz 7-13,54,Schlecht,6h 22min,0:49,7:17,10,2024-03-07 -Feb 29 - Mrz 6,50,Schlecht,6h 4min,0:56,7:09,9,2024-02-29 -Feb 22-28,61,Ausreichend,7h 11min,0:08,7:25,8,2024-02-22 -Feb 15-21,44,Schlecht,6h 58min,0:19,7:51,7,2024-02-15 -Feb 8-14,50,Schlecht,8h 17min,0:09,8:47,6,2024-02-08 -Feb 1-7,43,Schlecht,6h 12min,1:06,7:25,5,2024-02-01 -Jan 25-31,57,Schlecht,7h 21min,1:17,8:40,4,2024-01-25 -Jan 18-24,51,Schlecht,6h 25min,0:56,7:26,3,2024-01-18 -Jan 11-17,50,Schlecht,6h 27min,1:36,8:12,2,2024-01-11 -Jan 4-10,59,Schlecht,6h 44min,1:26,8:24,1,2024-01-04 -Dez 28, 2023 - Jan 3, 2024,54,Schlecht,7h 2min,52,2024-12-28 -Dez 21-27, 2023,55,Schlecht,7h 16min,0:38,51,2024-12-21 -Dez 14-20, 2023,56,Schlecht,7h 17min,0:31,50,2024-12-14 -Dez 7-13, 2023,44,Schlecht,7h 53min,23:46,49,2024-12-07 -Nov 30 - Dez 6, 2023,48,Schlecht,6h 51min,0:33,48,2024-11-30 -Nov 23-29, 2023,48,Schlecht,7h 11min,0:21,47,2024-11-23 -Nov 16-22, 2023,53,Schlecht,7h 7min,0:23,46,2024-11-16 -Nov 9-15, 2023,47,Schlecht,7h 5min,0:19,45,2024-11-09 -Nov 2-8, 2023,50,Schlecht,6h 2min,0:00,44,2024-11-02 -Okt 26 - Nov 1, 2023,59,Schlecht,6h 39min,0:14,43,2024-10-26 -Okt 19-25, 2023,48,Schlecht,6h 17min,0:46,42,2024-10-19 diff --git a/data/sandbox/combined_data.csv b/data/sandbox/combined_data.csv new file mode 100644 index 0000000..743d87c --- /dev/null +++ b/data/sandbox/combined_data.csv @@ -0,0 +1,42 @@ +Woche,avg_hr,Durchschnittliche Dauer +W40-2024,98.5,6h 34min +W39-2024,105.0,6h 23min +W38-2024,107.5,6h 41min +W37-2024,105.0,6h 18min +W36-2024,97.0,6h 19min +W35-2024,102.5,7h 1min +W34-2024,108.5,6h 17min +W33-2024,103.0,6h 36min +W32-2024,105.0,5h 45min +W31-2024,103.5,7h 4min +W30-2024,107.0,6h 52min +W29-2024,102.5,6h 26min +W28-2024,108.5,7h 10min +W27-2024,106.5,7h 35min +W26-2024,111.5,6h 8min +W25-2024,102.5,6h 30min +W24-2024,107.5,6h 1min +W23-2024,101.5,6h 22min +W22-2024,104.5,6h 33min +W21-2024,107.0,6h 47min +W20-2024,103.5,5h 51min +W19-2024,109.0,6h 21min +W18-2024,107.5,5h 36min +W17-2024,110.0,6h 2min +W16-2024,98.0,6h 28min +W15-2024,99.0,6h 17min +W14-2024,97.5,6h 18min +W13-2024,101.0,6h 50min +W12-2024,100.0,6h 9min +W11-2024,101.5,6h 11min +W10-2024,99.0,6h 22min +W9-2024,102.0,6h 4min +W8-2024,106.0,7h 11min +W7-2024,101.5,6h 58min +W6-2024,104.0,8h 17min +W5-2024,99.5,6h 12min +W4-2024,100.5,7h 21min +W3-2024,99.0,6h 25min +W2-2024,97.0,6h 27min +W1-2024,97.5,6h 44min +W52-2024,93.5,54 diff --git a/data/sandbox/hr_data_clean.csv b/data/sandbox/hr_data_clean.csv new file mode 100644 index 0000000..8e535c3 --- /dev/null +++ b/data/sandbox/hr_data_clean.csv @@ -0,0 +1,53 @@ +Woche,avg_hr +W40-2024,98.5 +W39-2024,105.0 +W38-2024,107.5 +W37-2024,105.0 +W36-2024,97.0 +W35-2024,102.5 +W34-2024,108.5 +W33-2024,103.0 +W32-2024,105.0 +W31-2024,103.5 +W30-2024,107.0 +W29-2024,102.5 +W28-2024,108.5 +W27-2024,106.5 +W26-2024,111.5 +W25-2024,102.5 +W24-2024,107.5 +W23-2024,101.5 +W22-2024,104.5 +W21-2024,107.0 +W20-2024,103.5 +W19-2024,109.0 +W18-2024,107.5 +W17-2024,110.0 +W16-2024,98.0 +W15-2024,99.0 +W14-2024,97.5 +W13-2024,101.0 +W12-2024,100.0 +W11-2024,101.5 +W10-2024,99.0 +W9-2024,102.0 +W8-2024,106.0 +W7-2024,101.5 +W6-2024,104.0 +W5-2024,99.5 +W4-2024,100.5 +W3-2024,99.0 +W2-2024,97.0 +W1-2024,97.5 +W52-2024,93.5 +W51-2023,88.0 +W50-2023,95.0 +W49-2023,99.0 +W48-2023,101.5 +W47-2023,103.5 +W46-2023,105.5 +W45-2023,104.0 +W44-2023,101.5 +W43-2023,95.0 +W42-2023,96.5 +W41-2023,85.5 diff --git a/data/sandbox/sleep_data_clean.csv b/data/sandbox/sleep_data_clean.csv new file mode 100644 index 0000000..5416f58 --- /dev/null +++ b/data/sandbox/sleep_data_clean.csv @@ -0,0 +1,53 @@ +Woche,Durchschnittliche Dauer +W41-2024,6h 11min +W40-2024,6h 34min +W39-2024,6h 23min +W38-2024,6h 41min +W37-2024,6h 18min +W36-2024,6h 19min +W35-2024,7h 1min +W34-2024,6h 17min +W33-2024,6h 36min +W32-2024,5h 45min +W31-2024,7h 4min +W30-2024,6h 52min +W29-2024,6h 26min +W28-2024,7h 10min +W27-2024,7h 35min +W26-2024,6h 8min +W25-2024,6h 30min +W24-2024,6h 1min +W23-2024,6h 22min +W22-2024,6h 33min +W21-2024,6h 47min +W20-2024,5h 51min +W19-2024,6h 21min +W18-2024,5h 36min +W17-2024,6h 2min +W16-2024,6h 28min +W15-2024,6h 17min +W14-2024,6h 18min +W13-2024,6h 50min +W12-2024,6h 9min +W11-2024,6h 11min +W10-2024,6h 22min +W9-2024,6h 4min +W8-2024,7h 11min +W7-2024,6h 58min +W6-2024,8h 17min +W5-2024,6h 12min +W4-2024,7h 21min +W3-2024,6h 25min +W2-2024,6h 27min +W1-2024,6h 44min +W52-2024,54 +W51-2024,Schlecht +W50-2024,Schlecht +W49-2024,Schlecht +W48-2024,Schlecht +W47-2024,Schlecht +W46-2024,Schlecht +W45-2024,Schlecht +W44-2024,Schlecht +W43-2024,Schlecht +W42-2024,Schlecht