diff --git a/code/corelation.py b/code/corelation.py index a1f68c0..1660b7a 100644 --- a/code/corelation.py +++ b/code/corelation.py @@ -11,7 +11,6 @@ month_translation = { # Funktion zur Umwandlung von '6h 11min' in numerische Stundenwerte def convert_sleep_duration(sleep_duration_str): - print(sleep_duration_str) hours = 0 minutes = 0 if 'h' in sleep_duration_str: @@ -22,78 +21,53 @@ def convert_sleep_duration(sleep_duration_str): minutes = int(minutes_part) return hours + (minutes / 60) -# Funktion, um Datumsbereiche wie 'Mrz 29-Apr 4', 'Dez 22-28 2023' oder 'Dez 28' in Kalenderwoche und Jahr zu konvertieren +# Funktion, um Datumsbereiche 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(",", "") - # 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 + year_str = str(datetime.now().year) - # 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 und das Jahr week_number = start_date.isocalendar()[1] year = start_date.year 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(): - # Jahr am Ende des Datums year_str = date_range_str[-4:] - date_range_str = date_range_str[:-5] # Entferne das Jahr aus der Datumsangabe + date_range_str = date_range_str[:-5] 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 + start_day = int(start_parts[1].strip()) 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' + if len(end_parts) == 2: 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}") - - # Berechne die Kalenderwoche und das Jahr basierend auf dem Startdatum + start_date = datetime.strptime(f"{start_month_str} {start_day} {year_str}", "%b %d %Y") week_number = start_date.isocalendar()[1] year = start_date.year - return f"W{week_number}-{year}" # Gib Kalenderwoche und Jahr im Format W-YYYY zurück - + return f"W{week_number}-{year}" # Datei Pfade hr_data_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/hr_gramic.csv' @@ -104,84 +78,62 @@ combined_data_path = '/home/gra/PycharmProjects/cds_introduction_data_science_as graphic_corr_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/final/gramic_sleep_hr_correlation.png' graphic_weekly_path = '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/final/weekly_hr_sleep.png' - -# Schritt 1: Lade die HR-Daten (mit Semikolon separiert) und entferne 'bpm' +# Schritt 1: Lade die HR-Daten und entferne 'bpm' hr_data = pd.read_csv(hr_data_path, sep=';') - -# 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 Jahr) hr_data['Woche'] = hr_data['Datum'].apply(convert_to_week_and_year) - -# Berechne den Durchschnitt der Herzfrequenzdaten (In Ruhe und Hoch) hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1) - -# 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) -# Schritt 2: Lade die Schlafdaten (mit Komma separiert) +# Schritt 2: Lade die Schlafdaten sleep_data = pd.read_csv(sleep_data_path, sep=';') - -# Konvertiere die Spalte 'Datum' in Kalenderwoche (KW und Jahr) sleep_data['Woche'] = sleep_data['Datum'].apply(convert_to_week_and_year) - -# Konvertiere die Spalte 'Durchschnittliche Dauer' in numerische Stunden sleep_data['Durchschnittliche Dauer'] = sleep_data['Durchschnittliche Dauer'].apply(convert_sleep_duration) - - -# 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' +# Schritt 3: Kombiniere die HR- und Schlafdaten combined_data = pd.merge(hr_data_clean, sleep_data_clean, on='Woche', how='inner') - -# Speichere das kombinierte Dataset in einer neuen CSV-Datei combined_data.to_csv(combined_data_path, index=False) -# Schritt 4: Berechne die Korrelation zwischen avg_hr und der Schlafdauer +# Schritt 4: Berechne die Korrelation correlation = combined_data['avg_hr'].corr(combined_data['Durchschnittliche Dauer']) print(f"Die Korrelation zwischen der durchschnittlichen Herzfrequenz und der Schlafdauer ist: {correlation}") -# Schritt 5: Visualisiere den Zusammenhang zwischen Herzfrequenz und Schlafdauer +# Schritt 5: Visualisiere den Zusammenhang zwischen Herzfrequenz und Schlafdauer (invertierte x-Achse) 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.plot(combined_data['avg_hr'], m * combined_data['avg_hr'] + b, color='red', label=f'Trendlinie (Kor = {correlation:.2f})') +plt.gca().invert_xaxis() # X-Achse invertieren plt.legend() -# Speichern der Grafik plt.savefig(graphic_corr_path) plt.show() -# Schritt 6: Erstelle eine Grafik pro Kalenderwoche (Herzfrequenz und Schlafdaten) -plt.figure(figsize=(12, 6)) +# Schritt 6: Erstelle eine Grafik pro Kalenderwoche (HR und Schlafdaten) +fig, ax1 = plt.subplots(figsize=(12, 6)) -# Plot für die Herzfrequenz -plt.bar(combined_data['Woche'], combined_data['avg_hr'], width=0.4, label='Durchschnittliche Herzfrequenz', align='center') +# Erste Achse: Herzfrequenz +ax1.bar(combined_data['Woche'], combined_data['avg_hr'], width=0.4, label='Durchschnittliche Herzfrequenz', align='center', color='b') +ax1.set_xlabel('Kalenderwoche') +ax1.set_ylabel('Durchschnittliche Herzfrequenz (bpm)', color='b') +ax1.tick_params(axis='y', labelcolor='b') -# Plot für die Schlafdauer (mit Verschiebung, um Überlappung zu vermeiden) -plt.bar(combined_data['Woche'], combined_data['Durchschnittliche Dauer'], width=0.4, label='Schlafdauer', align='edge') +# Zweite Achse: Schlafdauer +ax2 = ax1.twinx() +ax2.bar(combined_data['Woche'], combined_data['Durchschnittliche Dauer'], width=0.4, label='Schlafdauer', align='edge', color='g') +ax2.set_ylabel('Schlafdauer (Stunden)', color='g') +ax2.tick_params(axis='y', labelcolor='g') -# Diagrammtitel und Achsenbeschriftungen plt.title('Durchschnittliche Herzfrequenz und Schlafdauer pro Kalenderwoche') -plt.xlabel('Kalenderwoche') -plt.ylabel('Wert') - -# Legende und Rotation der x-Achse -plt.legend() plt.xticks(rotation=45, ha='right') +fig.tight_layout() -# Speichern der zweiten Grafik plt.savefig(graphic_weekly_path) plt.show() diff --git a/data/final/gramic_sleep_hr_correlation.png b/data/final/gramic_sleep_hr_correlation.png index c3f1a92..5a5d6f9 100644 Binary files a/data/final/gramic_sleep_hr_correlation.png and b/data/final/gramic_sleep_hr_correlation.png differ diff --git a/data/final/weekly_hr_sleep.png b/data/final/weekly_hr_sleep.png index fe8ac90..2f5bd92 100644 Binary files a/data/final/weekly_hr_sleep.png and b/data/final/weekly_hr_sleep.png differ