import pandas as pd import matplotlib.pyplot as plt import numpy as np from datetime import datetime # 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' } # Funktion, um 'Okt 10-16' in eine Kalenderwoche zu konvertieren def convert_to_week_number(date_range_str): # Splitte den Datumsbereich in Monat und Tage month_str, day_range = date_range_str.split(" ") start_day = int(day_range.split("-")[0]) # Nimm den Starttag current_year = datetime.now().year # Konvertiere den deutschen Monatsnamen in den englischen if month_str in month_translation: month_str = month_translation[month_str] # Erstelle das Datum basierend auf dem Starttag und dem aktuellen Jahr date_str = f"{month_str} {start_day} {current_year}" start_date = datetime.strptime(date_str, "%b %d %Y") # Konvertiere in ein Datum return start_date.isocalendar()[1] # Gib die Kalenderwoche zurück # Schritt 1: Lade die HR-Daten (mit Semikolon separiert) und entferne 'bpm' hr_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/hr_gramic.csv', sep=';') # Zeige die ersten Zeilen der HR-Daten vor der Bereinigung print("HR-Daten (vor der Bereinigung):") print(hr_data.head()) # 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) hr_data['week'] = hr_data['Datum'].apply(convert_to_week_number) # Zeige die HR-Daten nach der Umwandlung in Wochen print("\nHR-Daten (nach der Umwandlung in KW):") print(hr_data.head()) # Schritt 2: Berechne den Durchschnitt der Herzfrequenzdaten (In Ruhe und Hoch) hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1) # Schritt 3: Lade die Schlafdaten (mit Komma separiert) sleep_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/sleep_gramic.csv', sep=',') # Zeige die ersten Zeilen der Schlafdaten print("\nSchlafdaten:") print(sleep_data.head()) # Konvertiere auch das 'Datum' der Schlafdaten in Kalenderwoche (KW) sleep_data['week'] = sleep_data['Datum'].apply(convert_to_week_number) # Schritt 4: Sicherstellen, dass beide Datensätze nach 'week' sortiert sind hr_data = hr_data.sort_values(by='week') sleep_data = sleep_data.sort_values(by='week') # Schritt 5: Kombiniere die beiden Datensätze anhand der 'week' Spalte mit einem äußeren Join combined_data = pd.merge(hr_data, sleep_data, on='week', how='outer') # Zeige die kombinierten Daten print("\nKombinierte Daten:") print(combined_data) # Schritt 6: Entferne alle Zeilen mit fehlenden Daten combined_data = combined_data.dropna() # Schritt 7: Berechne die Korrelation zwischen dem durchschnittlichen Herzfrequenzwert ('avg_hr') und der Schlafdauer ('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 8: 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()