edit corelation.py and add hr_data_cleaned.csv
parent
692099b36d
commit
5e2c6e7187
|
@ -2,109 +2,7 @@ import pandas as pd
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from datetime import datetime
|
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
|
# Manuelle Zuordnung der Monatsnamen von Deutsch auf Englisch
|
||||||
month_translation = {
|
month_translation = {
|
||||||
'Jan': 'Jan', 'Feb': 'Feb', 'Mär': 'Mar', 'Mrz': 'Mar', 'Apr': 'Apr', 'Mai': 'May', 'Jun': 'Jun',
|
'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
|
# 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_number_and_start_date(date_range_str):
|
def convert_to_week_and_year(date_range_str):
|
||||||
# Entferne zusätzliche Leerzeichen um den Bindestrich herum und entferne Kommas
|
# Entferne zusätzliche Leerzeichen um den Bindestrich herum und entferne Kommas
|
||||||
date_range_str = date_range_str.replace(" - ", "-").replace(",", "")
|
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
|
# Konvertiere das Datum
|
||||||
start_date = datetime.strptime(f"{month_str} {day} {year_str}", "%b %d %Y")
|
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]
|
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')
|
# Prüfen, ob das Jahr am Ende steht (z.B. 'Dez 22-28 2023')
|
||||||
if date_range_str[-4:].isdigit():
|
if date_range_str[-4:].isdigit():
|
||||||
|
@ -177,79 +76,58 @@ def convert_to_week_number_and_start_date(date_range_str):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValueError(f"Ungültiges Startdatum: {start_month_str} {start_day} {year_str}")
|
raise ValueError(f"Ungültiges Startdatum: {start_month_str} {start_day} {year_str}")
|
||||||
|
|
||||||
try:
|
# Berechne die Kalenderwoche und das Jahr basierend auf dem Startdatum
|
||||||
# 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]
|
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
|
# Datei Pfade
|
||||||
def clean_and_save_data(hr_data, sleep_data, output_dir='sandbox'):
|
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
|
# Entferne 'bpm' und konvertiere die Werte in numerische Daten
|
||||||
hr_data['In Ruhe'] = hr_data['In Ruhe'].str.replace(' bpm', '').astype(float)
|
hr_data['In Ruhe'] = hr_data['In Ruhe'].str.replace(' bpm', '').astype(float)
|
||||||
hr_data['Hoch'] = hr_data['Hoch'].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
|
# Konvertiere die Spalte 'Datum' in Kalenderwoche (KW und Jahr)
|
||||||
hr_data[['week', 'start_date']] = hr_data['Datum'].apply(
|
hr_data['Woche'] = hr_data['Datum'].apply(convert_to_week_and_year)
|
||||||
lambda x: pd.Series(convert_to_week_number_and_start_date(x)))
|
|
||||||
|
|
||||||
# Berechne den Durchschnitt der Herzfrequenzdaten (In Ruhe und Hoch)
|
# Berechne den Durchschnitt der Herzfrequenzdaten (In Ruhe und Hoch)
|
||||||
hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1)
|
hr_data['avg_hr'] = hr_data[['In Ruhe', 'Hoch']].mean(axis=1)
|
||||||
|
|
||||||
# Konvertiere auch das 'Datum' der Schlafdaten in Kalenderwoche (KW) und Startdatum
|
# Speichere nur die Spalten 'Woche' und 'avg_hr' in einer neuen CSV-Datei
|
||||||
sleep_data[['week', 'start_date']] = sleep_data['Datum'].apply(
|
hr_data_clean = hr_data[['Woche', 'avg_hr']]
|
||||||
lambda x: pd.Series(convert_to_week_number_and_start_date(x)))
|
hr_data_clean.to_csv(hr_clean_path, index=False)
|
||||||
|
|
||||||
# Speichere die bereinigten Daten in 'sandbox'
|
# Schritt 2: Lade die Schlafdaten (mit Komma separiert)
|
||||||
if not os.path.exists(output_dir):
|
sleep_data = pd.read_csv(sleep_data_path, sep=',')
|
||||||
os.makedirs(output_dir)
|
|
||||||
|
|
||||||
hr_data_clean_path = os.path.join(output_dir, 'hr_data_clean.csv')
|
# Konvertiere die Spalte 'Datum' in Kalenderwoche (KW und Jahr)
|
||||||
sleep_data_clean_path = os.path.join(output_dir, 'sleep_data_clean.csv')
|
sleep_data['Woche'] = sleep_data['Datum'].apply(convert_to_week_and_year)
|
||||||
|
|
||||||
hr_data.to_csv(hr_data_clean_path, sep=';', index=False)
|
# Speichere nur die Spalten 'Woche' und 'Durchschnittliche Dauer' in einer neuen CSV-Datei
|
||||||
sleep_data.to_csv(sleep_data_clean_path, sep=',', index=False)
|
sleep_data_clean = sleep_data[['Woche', 'Durchschnittliche Dauer']]
|
||||||
|
sleep_data_clean.to_csv(sleep_clean_path, index=False)
|
||||||
|
|
||||||
print(f"HR-Daten wurden bereinigt und in {hr_data_clean_path} gespeichert.")
|
# Schritt 3: Kombiniere die HR- und Schlafdaten basierend auf der 'Woche'
|
||||||
print(f"Schlafdaten wurden bereinigt und in {sleep_data_clean_path} gespeichert.")
|
combined_data = pd.merge(hr_data_clean, sleep_data_clean, on='Woche', how='inner')
|
||||||
|
|
||||||
return hr_data, sleep_data
|
# 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 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'])
|
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.figure(figsize=(10, 6))
|
||||||
plt.scatter(combined_data['avg_hr'], combined_data['Durchschnittliche Dauer'], color='blue', label='Datenpunkte')
|
plt.scatter(combined_data['avg_hr'], combined_data['Durchschnittliche Dauer'], color='blue', label='Datenpunkte')
|
||||||
plt.title('Zusammenhang zwischen Herzfrequenz (Durchschnitt) und Schlafdauer')
|
plt.title('Zusammenhang zwischen Herzfrequenz (Durchschnitt) und Schlafdauer')
|
||||||
|
|
|
@ -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()
|
|
@ -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
|
|
|
|
@ -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
|
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
Loading…
Reference in New Issue