final branch commit with cleanup
parent
1507a506ba
commit
ebc0d684e6
|
@ -1,35 +0,0 @@
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
# Lade die CSV-Dateien
|
|
||||||
# Datei 1 mit Semikolon (;) separiert (HR-Daten)
|
|
||||||
hr_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/hr_gramic.csv', sep=';')
|
|
||||||
|
|
||||||
# Datei 2 mit Komma (,) separiert (Schlafdaten)
|
|
||||||
sleep_data = pd.read_csv('/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/sleep_gramic.csv', sep=',')
|
|
||||||
|
|
||||||
# Überprüfen der ersten Zeilen der Dateien
|
|
||||||
print("HR-Daten:")
|
|
||||||
print(hr_data.head())
|
|
||||||
|
|
||||||
print("\nSchlafdaten:")
|
|
||||||
print(sleep_data.head())
|
|
||||||
|
|
||||||
# Annahme: Beide Datensätze enthalten eine Spalte für Wochen (z.B. 'week')
|
|
||||||
# und die jeweiligen Werte (z.B. 'avg_hr' für Herzfrequenz und 'sleep_duration' für Schlafdauer)
|
|
||||||
|
|
||||||
# Sicherstellen, dass beide Datensätze nach Woche sortiert sind
|
|
||||||
hr_data = hr_data.sort_values(by='Datum')
|
|
||||||
sleep_data = sleep_data.sort_values(by='week')
|
|
||||||
|
|
||||||
# Kombinieren der beiden Datensätze anhand der 'week' Spalte
|
|
||||||
combined_data = pd.merge(hr_data, sleep_data, on='Datum')
|
|
||||||
|
|
||||||
# Überprüfen der kombinierten Daten
|
|
||||||
print("\nKombinierte Daten:")
|
|
||||||
print(combined_data.head())
|
|
||||||
|
|
||||||
# Berechne die Korrelation zwischen der durchschnittlichen Herzfrequenz (z.B. 'avg_hr')
|
|
||||||
# und der Schlafdauer (z.B. 'sleep_duration')
|
|
||||||
correlation = combined_data['avg_hr'].corr(combined_data['Durchschnittliche Dauer'])
|
|
||||||
|
|
||||||
print(f"\nDie Korrelation zwischen der Herzfrequenz und der Schlafdauer ist: {correlation}")
|
|
|
@ -1,50 +0,0 @@
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# Zeige die bereinigten HR-Daten
|
|
||||||
print("\nHR-Daten (nach der Entfernung von 'bpm'):")
|
|
||||||
print(hr_data.head())
|
|
||||||
|
|
||||||
# Speichere die bereinigten HR-Daten in eine neue CSV-Datei (Zwischendatei)
|
|
||||||
hr_data.to_csv('hr_data_cleaned.csv', sep=';', index=False)
|
|
||||||
print("\nBereinigte HR-Daten wurden in '/home/gra/PycharmProjects/cds_introduction_data_science_assignment/data/raw/hr_data_cleaned.csv' gespeichert.")
|
|
||||||
|
|
||||||
# Schritt 2: Berechne den Durchschnitt der Herzfrequenzdaten (Resting HR und High HR)
|
|
||||||
hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1)
|
|
||||||
|
|
||||||
# Zeige die HR-Daten nach der Berechnung des Durchschnitts
|
|
||||||
print("\nHR-Daten (nach der Berechnung des Durchschnitts):")
|
|
||||||
print(hr_data.head())
|
|
||||||
|
|
||||||
# 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 Schlafdaten
|
|
||||||
print("\nSchlafdaten:")
|
|
||||||
print(sleep_data.head())
|
|
||||||
|
|
||||||
# Schritt 4: Sicherstellen, dass beide Datensätze nach 'week' sortiert sind
|
|
||||||
hr_data = hr_data.sort_values(by='Datum')
|
|
||||||
sleep_data = sleep_data.sort_values(by='Datum')
|
|
||||||
|
|
||||||
# Schritt 5: Kombiniere die beiden Datensätze anhand der 'week' Spalte
|
|
||||||
combined_data = pd.merge(hr_data, sleep_data, on='Datum')
|
|
||||||
|
|
||||||
# Zeige die kombinierten Daten
|
|
||||||
print("\nKombinierte Daten:")
|
|
||||||
print(combined_data.head())
|
|
||||||
|
|
||||||
# Schritt 6: Berechne die Korrelation zwischen dem durchschnittlichen Herzfrequenzwert ('avg_hr') und der Schlafdauer ('sleep_duration')
|
|
||||||
correlation = combined_data['avg_hr'].corr(combined_data['Durchschnittliche Dauer'])
|
|
||||||
|
|
||||||
print(f"\nDie Korrelation zwischen der durchschnittlichen Herzfrequenz und der Schlafdauer ist: {correlation}")
|
|
|
@ -1,94 +0,0 @@
|
||||||
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()
|
|
|
@ -1,266 +0,0 @@
|
||||||
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()
|
|
|
@ -1,144 +0,0 @@
|
||||||
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', '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 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(",", "")
|
|
||||||
|
|
||||||
# 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 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
|
|
||||||
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}")
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
|
|
||||||
# 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'
|
|
||||||
|
|
||||||
# Schritt 1: Lade die HR-Daten (mit Semikolon separiert) 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)
|
|
||||||
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)
|
|
||||||
|
|
||||||
# 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')
|
|
||||||
|
|
||||||
# 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
|
|
||||||
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
|
|
||||||
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()
|
|
|
@ -1,21 +0,0 @@
|
||||||
import requests
|
|
||||||
from bs4 import BeautifulSoup
|
|
||||||
import queue
|
|
||||||
import re
|
|
||||||
import time
|
|
||||||
import random
|
|
||||||
|
|
||||||
urls = queue.PriorityQueue()
|
|
||||||
urls.put((0.5, "https://www.scrapingcourse.com/ecommerce/"))
|
|
||||||
visited_urls = []
|
|
||||||
|
|
||||||
while not urls.empty():
|
|
||||||
_, current_url = urls.get()
|
|
||||||
soup = BeautifulSoup(get_html(current_url), "html.parser")
|
|
||||||
|
|
||||||
visited_urls.append(current_url)
|
|
||||||
crawl_page(soup, current_url, visited_urls, urls)
|
|
||||||
|
|
||||||
# if it is a product page:
|
|
||||||
# scrape_page(soup, url, products)
|
|
||||||
time.sleep(random.uniform(1, 3))
|
|
|
@ -1,53 +0,0 @@
|
||||||
Datum;In Ruhe;Hoch
|
|
||||||
Okt 4-10;67.0;130.0
|
|
||||||
Sep 27 - Okt 3;67.0;143.0
|
|
||||||
Sep 20-26;66.0;149.0
|
|
||||||
Sep 13-19;66.0;144.0
|
|
||||||
Sep 6-12;62.0;132.0
|
|
||||||
Aug 30 - Sep 5;64.0;141.0
|
|
||||||
Aug 23-29;67.0;150.0
|
|
||||||
Aug 16-22;63.0;143.0
|
|
||||||
Aug 9-15;69.0;141.0
|
|
||||||
Aug 2-8;67.0;140.0
|
|
||||||
Jul 26 - Aug 1;67.0;147.0
|
|
||||||
Jul 19-25;69.0;136.0
|
|
||||||
Jul 12-18;66.0;151.0
|
|
||||||
Jul 5-11;67.0;146.0
|
|
||||||
Jun 28 - Jul 4;66.0;157.0
|
|
||||||
Jun 21-27;64.0;141.0
|
|
||||||
Jun 14-20;70.0;145.0
|
|
||||||
Jun 7-13;69.0;134.0
|
|
||||||
Mai 31 - Jun 6;70.0;139.0
|
|
||||||
Mai 24-30;72.0;142.0
|
|
||||||
Mai 17-23;72.0;135.0
|
|
||||||
Mai 10-16;71.0;147.0
|
|
||||||
Mai 3-9;73.0;142.0
|
|
||||||
Apr 26 - Mai 2;69.0;151.0
|
|
||||||
Apr 19-25;61.0;135.0
|
|
||||||
Apr 12-18;58.0;140.0
|
|
||||||
Apr 5-11;64.0;131.0
|
|
||||||
Mrz 29 - Apr 4;63.0;139.0
|
|
||||||
Mrz 22-28;65.0;135.0
|
|
||||||
Mrz 15-21;66.0;137.0
|
|
||||||
Mrz 8-14;62.0;136.0
|
|
||||||
Mrz 1-7;70.0;134.0
|
|
||||||
Feb 23-29;68.0;144.0
|
|
||||||
Feb 16-22;71.0;132.0
|
|
||||||
Feb 9-15;65.0;143.0
|
|
||||||
Feb 2-8;66.0;133.0
|
|
||||||
Jan 26 - Feb 1;59.0;142.0
|
|
||||||
Jan 19-25;62.0;136.0
|
|
||||||
Jan 12-18;60.0;134.0
|
|
||||||
Jan 5-11;56.0;139.0
|
|
||||||
Dez 29, 2023 - Jan 4, 2024;59.0;128.0
|
|
||||||
Dez 22-28, 2023;52.0;124.0
|
|
||||||
Dez 15-21, 2023;57.0;133.0
|
|
||||||
Dez 8-14, 2023;65.0;133.0
|
|
||||||
Dez 1-7, 2023;69.0;134.0
|
|
||||||
Nov 24-30, 2023;68.0;139.0
|
|
||||||
Nov 17-23, 2023;68.0;143.0
|
|
||||||
Nov 10-16, 2023;64.0;144.0
|
|
||||||
Nov 3-9, 2023;63.0;140.0
|
|
||||||
Okt 27 - Nov 2, 2023;57.0;133.0
|
|
||||||
Okt 20-26, 2023;55.0;138.0
|
|
||||||
Okt 13-19, 2023;50.0;121.0
|
|
|
Loading…
Reference in New Issue