edit pre-final
This commit is contained in:
		
							parent
							
								
									b8c420621b
								
							
						
					
					
						commit
						568c13053c
					
				@ -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
 | 
			
		||||
    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()
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 37 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 45 KiB  | 
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user