From 9b0a644b3f803bf2b040b58ae528e964cc01c218 Mon Sep 17 00:00:00 2001 From: Dijkhof Date: Wed, 30 Jun 2021 15:16:25 +0200 Subject: [PATCH 1/4] 'formules.py' toevoegen --- formules.py | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 formules.py diff --git a/formules.py b/formules.py new file mode 100644 index 0000000..359689b --- /dev/null +++ b/formules.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Jun 16 09:34:35 2021 + +@author: - +""" +import osa +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +from datetime import timedelta +from scipy.optimize import curve_fit + +# Formulas + +def ReadCSV(filename): + df = pd.read_csv(filename, names=['Datetime', 'Acc X','Acc Y', 'Acc Z'], infer_datetime_format=True) + df['Datetime'] = pd.to_datetime(df['Datetime']) + df['Date'] = [d.date() for d in df['Datetime']] + df = df.reindex(columns=['Datetime','Date','Time','Acc X','Acc Y', 'Acc Z']) + return df + +def CreateDays(x, filename, path): + + savename = filename.replace('.csv','') + savepath = path + savename + os.makedirs(savepath) + os.chdir(savepath) + + startdate = x['Date'].iloc[0] + week = range(1,8) + + for i in week: + weekdayindex = i-1 + + day = startdate + timedelta(days=weekdayindex) + daydate = x['Date'] == startdate + timedelta(days=weekdayindex) + dataday = x[daydate] + totalweek = {day:dataday} + + savefile = totalweek[day] + varname = filename.replace('.csv','-') + str(day) + '.csv' + savefile.to_csv(varname) + + print(varname +' saved') + + return(totalweek) + + +def SVMEpoch(DF,ResampRate, ResampData): + newDF = pd.DataFrame(DF) + newDF['X2'] = np.power(newDF['Acc X'], 2) + newDF['Y2'] = np.power(newDF['Acc Y'], 2) + newDF['Z2'] = np.power(newDF['Acc Z'], 2) + newDF['SVM'] = np.sqrt(newDF[['X2', 'Y2', 'Z2']].sum(axis=1)) + newDF['Datetime'] = pd.to_datetime(newDF['Datetime']) + + EpochSVM = newDF.resample(ResampRate, on = ResampData).mean() + return(newDF, EpochSVM) + +def func(x, a, b, c): + return a * np.exp(-b*x) + c + +def SlopeWeeker(Keylist, Dict): + try: + SlopeWeek = pd.DataFrame(columns=['a','b', 'c', 'Name']) + SlopeWeek = SlopeWeek.set_index('Name') + + for key in Keylist: + newDF, EpochSVM = SVMEpoch(Dict[key], '60S', 'Datetime') + + ENMO = EpochSVM['SVM']-1 + ENMO = ENMO*1000 + + for value in ENMO: + if value < 0: + value = 0 + + BinSize = 5 + + ENMOmax = int(ENMO.max()) + + if ENMOmax % BinSize == 0: + ENMOmax = ENMOmax+1 #to make sure that interference with binsize is impossible + + MaxBin = int(ENMOmax/BinSize)+1 + ENMO = ENMO.astype(int) + + Counter = pd.DataFrame(np.zeros((1,MaxBin))) + + for x in Counter: + Count = (x+1)*BinSize + Start = Count - BinSize + Number = ENMO.between(Start, Count).sum() + Counter[x] = Number + + Counter = Counter.to_numpy() + Counter = Counter.astype(float) + Counter = Counter.flatten() + + Xscale = np.arange(0,ENMOmax, BinSize) + Xscale = Xscale.astype(float) + + popt, _ = curve_fit(func, Xscale, Counter, p0=None) # fit curve through points + a, b, c = popt + + Trendline = func(Xscale, a, b, c) + + SlopeWeek.loc[key, 'a'] = a + SlopeWeek.loc[key, 'b'] = b + SlopeWeek.loc[key, 'c'] = c + SlopeWeek.loc[key, 'ENMOmax'] = ENMOmax + + PtName = key.replace('35694_00000', '') + PtName = PtName.replace('resampled-','') + PtName = PtName.replace('.csv','') + + plt.figure() + plt.ylim(0,1440) + plt.xlim(0,(ENMOmax+10)) + plt.title('Intensity plot ' + PtName) + plt.xlabel('Movement intensity [bins of ' + str(BinSize) + ' mg]') + plt.ylabel('Amount of time spend at intensity [min]') + plt.grid() + plt.scatter(Xscale, y=Counter) + plt.plot(Xscale, Trendline, 'r--') + plt.show() + + PtName = (PtName + '.png') + plt.savefig(fname=PtName) + + except: + print(PtName + ' could not be used') + + return SlopeWeek From c3fe14a6c522807b88a12bff588c95c3e563e83d Mon Sep 17 00:00:00 2001 From: Dijkhof Date: Wed, 30 Jun 2021 15:17:00 +0200 Subject: [PATCH 2/4] 'plotter.py' toevoegen --- plotter.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 plotter.py diff --git a/plotter.py b/plotter.py new file mode 100644 index 0000000..2361b58 --- /dev/null +++ b/plotter.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Jun 16 13:03:03 2021 + +@author: - +""" + +import os +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt + +os.chdir('D:\AcA Mike Dijkhof\Scripts') # set path to folder of formules.py + +import formules + +rootdir = 'D:\AcA Mike Dijkhof\cwa files\Pt204_csv\Pt204_csv35694_0000020406.resampled' # provide path to .csv files of the cut weekdays +d = {} + +for subdir, dirs, files in os.walk(rootdir): + print(subdir) + for file in files: + print(file) + os.chdir(subdir) + + d[file] = pd.read_csv(file, infer_datetime_format=True) + +Keys = d.keys() + +#%% + +Check = formules.SlopeWeeker(Keys, d) +Worklist = Check +Length = pd.DataFrame(np.zeros(((1,int(len(Check)/7))))) + +# Create PtName, this depends on subdir string so has to be changed for each patient +PtName = subdir.replace('35694_00000', '') +PtName = PtName.replace('D:\AcA Mike Dijkhof\cwa files\Pt204_csv\Pt204_','') +PtName = PtName.replace('resampled-','') +PtName = PtName.replace('.resampled','') +PtName = PtName.replace('.csv','') + +for i in Length: + + CheckWeek = Worklist[:7] + + Worklist = Worklist.drop(CheckWeek.index, axis=0) + + CheckWeek.loc['Mean','a'] = CheckWeek['a'].median() + CheckWeek.loc['Mean','b'] = CheckWeek['b'].median() + CheckWeek.loc['Mean','c'] = CheckWeek['c'].median() + + CheckWeek.to_csv('Formula_Week6.csv') + + Xscale = np.arange(0,CheckWeek['ENMOmax'].max(), 5) + + plt.figure() + plt.ylim(0,1440) + plt.xlim(0,CheckWeek['ENMOmax'].max()) + plt.title('All weekdays and average plotted ' + PtName) + plt.xlabel('Movement intensity [bins of 5 mg]') + plt.ylabel('Amount of time spend at intensity [min]') + plt.grid() + + for i, r in CheckWeek.iterrows(): + Y = formules.func(Xscale, CheckWeek.loc[i,'a'],CheckWeek.loc[i,'b'], CheckWeek.loc[i,'c'] ) + if i != 'Mean': + plt.plot(Xscale, Y, 'grey') + else: + plt.plot(Xscale, Y, 'k--') + + plt.show() + plt.savefig(fname=('Weekplot ' + PtName+ '.png')) + From d96c52db24667a87a6eba9a9e83218b19563f14c Mon Sep 17 00:00:00 2001 From: Dijkhof Date: Wed, 30 Jun 2021 15:17:29 +0200 Subject: [PATCH 3/4] 'Totalplotter.py' toevoegen --- Totalplotter.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Totalplotter.py diff --git a/Totalplotter.py b/Totalplotter.py new file mode 100644 index 0000000..2b02ad7 --- /dev/null +++ b/Totalplotter.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +""" +Created on Sat Jun 26 13:27:00 2021 + +@author: D_Mik +""" + +import os +import pandas as pd +import formules +import numpy as np +import matplotlib.pyplot as plt + +# provide directory for formula parameters +rootdir = 'D:\AcA Mike Dijkhof\cwa files\Pt304_csv\Pt304_week_formula' + +d = {} +X = list() + +# import function parameters from previous scripts + +for subdir, dirs, files in os.walk(rootdir): + for file in files: + print(file) + os.chdir(subdir) + + name = file.replace('Formula_','') + name = name.replace('.csv','') + + df = pd.DataFrame(pd.read_csv(file)) + df = df.set_index('Name') + + scale = df['ENMOmax'].max() + + key = name + + d[key] = df.loc['Mean'] + X.append(scale) + +# plot curves +plt.figure(dpi=720) + +for key in d: + + formula = d[key] + Xscale = np.arange(0, max(X), 5) + + Y = formules.func(Xscale, formula.loc['a'], formula.loc['b'], formula.loc['c'] ) + + + plt.ylim(0,1440) + plt.xlim(0,(max(X)+10)) + plt.plot(Xscale, Y, label=key) + +plt.legend() +plt.title('All 6 weeks plotter for 304') #Change to pt-number +plt.show() + +plt.savefig(fname='Total_weeks_304.png') + + \ No newline at end of file From b1d836308ce9ccf67be387d910980f3df7519f01 Mon Sep 17 00:00:00 2001 From: Dijkhof Date: Wed, 30 Jun 2021 15:17:53 +0200 Subject: [PATCH 4/4] 'DayCutter.py' toevoegen --- DayCutter.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 DayCutter.py diff --git a/DayCutter.py b/DayCutter.py new file mode 100644 index 0000000..bb23f2f --- /dev/null +++ b/DayCutter.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" +Spyder Editor + +This is a temporary script file. +""" + +import os +import pandas as pd + +WeekPath = 'D:\AcA Mike Dijkhof\cwa files\Pt203_csv' # path to directory with .csv file of entire week +ScriptPath = 'D:\AcA Mike Dijkhof\Scripts' # path to directory of formules.py + +os.chdir(ScriptPath) + +import formules + +os.chdir(WeekPath) + +#%% + +for subdir, dirs, files in os.walk(WeekPath): + print(subdir) + os.chdir(subdir) + for i in files: + print(i) + if i.startswith('._'): #skip ._ files that may be present in the folder + continue + + df = pd.read_csv(i, header=0, names=['Datetime', 'Acc X','Acc Y', 'Acc Z'], dtype={"Datetime": str, "Acc X": 'float32', "Acc Y": 'float32', "Acc Z": 'float32'}, infer_datetime_format=True) + df['Datetime'] = pd.to_datetime(df['Datetime']) + df['Date'] = [d.date() for d in df['Datetime']] + df = df.reindex(columns=['Datetime','Date','Time','Acc X','Acc Y', 'Acc Z']) + + formules.CreateDays(df, i, subdir) + os.chdir(subdir) \ No newline at end of file