diff --git a/notebooks/statistics.ipynb b/notebooks/statistics.ipynb index 80c6436..44a823e 100644 --- a/notebooks/statistics.ipynb +++ b/notebooks/statistics.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -29,26 +29,21 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Reading GSVT\n" - ] - }, - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: 'C:/Studium/dsa/data/GSVT.pkl'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[3], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mdata_helper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43monly_demographic\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNumber of patients per category:\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m cat_name \u001b[38;5;129;01min\u001b[39;00m data\u001b[38;5;241m.\u001b[39mkeys():\n", - "File \u001b[1;32mc:\\Users\\klara\\projects\\DSA\\DSA_SS24\\notebooks\\../scripts\\data_helper.py:37\u001b[0m, in \u001b[0;36mload_data\u001b[1;34m(only_demographic, path_settings)\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m cat_name \u001b[38;5;129;01min\u001b[39;00m labels\u001b[38;5;241m.\u001b[39mkeys():\n\u001b[0;32m 36\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mReading \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcat_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 37\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mpath_data\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mcat_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m.pkl\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrb\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[0;32m 38\u001b[0m records \u001b[38;5;241m=\u001b[39m pickle\u001b[38;5;241m.\u001b[39mload(f)\n\u001b[0;32m 39\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m only_demographic:\n", - "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'C:/Studium/dsa/data/GSVT.pkl'" + "Reading GSVT\n", + "Reading AFIB\n", + "Reading SR\n", + "Reading SB\n", + "Number of patients per category:\n", + "age: 37011\n", + "diag: 37011\n", + "gender: 37011\n" ] } ], @@ -57,30 +52,56 @@ "\n", "print(\"Number of patients per category:\")\n", "for cat_name in data.keys():\n", - " print(f\"{cat_name}: {len(data[cat_name])}\")" + " print(f\"{cat_name}: {len(data[cat_name])}\")\n", + "\n", + "df_dgc = pd.DataFrame(data)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'data_helper' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m data_org \u001b[38;5;241m=\u001b[39m \u001b[43mdata_helper\u001b[49m\u001b[38;5;241m.\u001b[39mload_data(only_demographic\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m 3\u001b[0m df_dgc \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(data_org)\n", - "\u001b[1;31mNameError\u001b[0m: name 'data_helper' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of patients in a diagnosis category: SB 15826\n", + "SR 10426\n", + "AFIB 9756\n", + "GSVT 1003\n", + "Name: diag, dtype: int64\n", + "Min number of patients in a diagnosis category: 1003\n", + "unique values in the diagnosis category: ['GSVT' 'AFIB' 'SR' 'SB']\n", + "GSVT 1003\n", + "AFIB 1003\n", + "SR 1003\n", + "SB 1003\n", + "Name: diag, dtype: int64\n" ] } ], "source": [ - "data_org = data_helper.load_data(only_demographic=True)\n", + "# get number of patients in a diagnosis category\n", + "num_patients = df_dgc['diag'].value_counts()\n", + "print(f\"Number of patients in a diagnosis category: {num_patients}\")\n", + "# get min number of patients in a diagnosis category\n", + "min_num_patients = df_dgc['diag'].value_counts().min()\n", + "print(f\"Min number of patients in a diagnosis category: {min_num_patients}\")\n", "\n", - "df_dgc = pd.DataFrame(data_org)" + "# get the unique values of the diagnosis category\n", + "unique_vals = df_dgc['diag'].unique()\n", + "print(f\"unique values in the diagnosis category: {unique_vals}\")\n", + "\n", + "# get random sample of patients for each diagnosis category with min number of patients\n", + "sampled_data = pd.DataFrame()\n", + "for val in unique_vals:\n", + " sampled_data = pd.concat([sampled_data, df_dgc[df_dgc['diag'] == val].sample(min_num_patients)])\n", + "\n", + "\n", + "print(sampled_data['diag'].value_counts())\n", + "\n", + "df_dgc = sampled_data" ] }, { @@ -89,51 +110,44 @@ "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'df_dgc' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[21], line 36\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# #path = \"C:/Studium/dsa/data\"\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;66;03m# #path = \"C:/Users/Nils/Documents/HS-Mannheim/0000_MASTER/DSA/EKG_Prog/data\"\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;66;03m# path = \"C:/Users/klara/projects/DSA/data\"\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 33\u001b[0m \n\u001b[0;32m 34\u001b[0m \u001b[38;5;66;03m# Change from group to category\u001b[39;00m\n\u001b[0;32m 35\u001b[0m age_categories \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m10\u001b[39m, \u001b[38;5;241m20\u001b[39m, \u001b[38;5;241m30\u001b[39m, \u001b[38;5;241m40\u001b[39m, \u001b[38;5;241m50\u001b[39m, \u001b[38;5;241m60\u001b[39m, \u001b[38;5;241m70\u001b[39m, \u001b[38;5;241m80\u001b[39m, \u001b[38;5;241m90\u001b[39m]\n\u001b[1;32m---> 36\u001b[0m df_dgc[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mage_group\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mcut(\u001b[43mdf_dgc\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mage\u001b[39m\u001b[38;5;124m'\u001b[39m], bins\u001b[38;5;241m=\u001b[39mage_categories)\n\u001b[0;32m 37\u001b[0m corr_matrix_age_diag\u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mcrosstab(df_dgc[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mage_group\u001b[39m\u001b[38;5;124m'\u001b[39m], df_dgc[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdiag\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[0;32m 39\u001b[0m \u001b[38;5;66;03m# Chi-square test\u001b[39;00m\n", - "\u001b[1;31mNameError\u001b[0m: name 'df_dgc' is not defined" + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Correlation matrix\n", + "corr_matrix_age_diag= pd.crosstab(df_dgc['age_group'], df_dgc['diag'])\n", + "# Plot the correlation matrix\n", + "sns.heatmap(corr_matrix_age_diag, annot=True, cmap='coolwarm', fmt='d')\n", + "plt.title('Correlationmatrix of Age and Diagnostic Sample Groups', fontsize=16)\n", + "plt.xlabel('Diagnostic Group')\n", + "plt.ylabel('Age Group')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Chi-Square Statistic: 1054.3796287658074\n", + "P-value: 2.4773868106437145e-207\n", + "Chi-Square Statistic for SB in 60-70 vs others: 49.305576225492736\n", + "P-value for SB in 60-70 vs others: 2.1903897342655923e-12\n" ] } ], "source": [ - "# #path = \"C:/Studium/dsa/data\"\n", - "# #path = \"C:/Users/Nils/Documents/HS-Mannheim/0000_MASTER/DSA/EKG_Prog/data\"\n", - "# path = \"C:/Users/klara/projects/DSA/data\"\n", - "\n", - "# categories_dict = {\n", - "# 'SB': [426177001],\n", - "# 'AFIB': [164889003, 164890007],\n", - "# 'GSVT': [426761007, 713422000, 233896004, 233897008, 713422000],\n", - "# 'SR': [426783006, 427393009]\n", - "# }\n", - "\n", - "# data = {}\n", - "# for cat_name in categories_dict.keys():\n", - "# print(f\"Reading {cat_name}\")\n", - "# with open(f'{path}/{cat_name}.pkl', 'rb') as f:\n", - "# records = pickle.load(f)\n", - "# data[cat_name] = records\n", - "# print(f\"Length of {cat_name}: {len(records)}\")\n", - "\n", - "# data_demographic = {'age':[], 'diag':[], 'gender':[]}\n", - "# for cat_name, records in data.items():\n", - "# for record in records:\n", - "# age = record.comments[0].split(' ')[1]\n", - "# sex = record.comments[1].split(' ')[1]\n", - "# if age == 'NaN' or sex == 'NaN':\n", - "# continue\n", - "# # cut Age: from alter string \n", - "# data_demographic['age'].append(int(age))\n", - "# data_demographic['diag'].append(cat_name)\n", - "# data_demographic['gender'].append(sex)\n", - "\n", - "# df_dgc = pd.DataFrame(data_demographic)\n", - "\n", "# Change from group to category\n", "age_categories = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]\n", "df_dgc['age_group'] = pd.cut(df_dgc['age'], bins=age_categories)\n", @@ -171,13 +185,6 @@ "\n", "- The Chi-Square Statistic for sinus bradycardia in the age group 60-70 compared to the other age groups, is a value that shows whether there is a significant difference in the frequency of sinus bradycardia in the age group 60-70 in comparison to the other age groups. If the p-value is smaller than the significance level of 0.05, the difference in the frequency between the age group 60-70 and the other age groups is significant." ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -196,7 +203,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/scripts/__pycache__/data_helper.cpython-310.pyc b/scripts/__pycache__/data_helper.cpython-310.pyc index 45724f2..4119b09 100644 Binary files a/scripts/__pycache__/data_helper.cpython-310.pyc and b/scripts/__pycache__/data_helper.cpython-310.pyc differ diff --git a/scripts/__pycache__/feature_extraction.cpython-310.pyc b/scripts/__pycache__/feature_extraction.cpython-310.pyc index aad512f..0627a61 100644 Binary files a/scripts/__pycache__/feature_extraction.cpython-310.pyc and b/scripts/__pycache__/feature_extraction.cpython-310.pyc differ diff --git a/scripts/data_helper.py b/scripts/data_helper.py index c4353a7..358cf4d 100644 --- a/scripts/data_helper.py +++ b/scripts/data_helper.py @@ -13,7 +13,7 @@ import cv2 as cv TODO create overall description """ -def load_data(only_demographic:bool=False, path_settings:str="../settings.json"): +def load_data(only_demographic:bool=False, only_diagnosis_ids=False, path_settings:str="../settings.json"): """ Loads data from pickle files based on the specified settings. @@ -28,6 +28,10 @@ def load_data(only_demographic:bool=False, path_settings:str="../settings.json") path_data = settings["data_path"] labels = settings["labels"] + if only_diagnosis_ids: + with open(f'{path_data}/diagnosis.pkl', 'rb') as f: + return pickle.load(f) + data = {} if only_demographic: data = {'age': [], 'diag': [], 'gender': []} diff --git a/scripts/feature_extraction.py b/scripts/feature_extraction.py index ae4fc00..17f1041 100644 --- a/scripts/feature_extraction.py +++ b/scripts/feature_extraction.py @@ -5,6 +5,7 @@ import math import time from multiprocessing import Pool import sqlite3 +import random def get_y_value(ecg_cleaned, indecies): """ @@ -213,7 +214,6 @@ def extract_features_parallel(data_dict, num_processes, sampling_rate=500, used_ c = conn.cursor() # get unique data data_dict = exclude_already_extracted(data_dict, conn) - for label, data in data_dict.items(): print(f"Extracting features for {label} with {len(data)} data entries.") with Pool(processes=num_processes) as pool: @@ -239,7 +239,7 @@ def extract_features_parallel(data_dict, num_processes, sampling_rate=500, used_ -def extract_features(data_dict, sampling_rate=500, used_channels=[0, 1, 2, 3, 4, 5]): +def extract_features(data_dict, sampling_rate=500, used_channels=[0, 1, 2, 3, 4, 5], limit=1000): """ Extracts the features from the data. Args: @@ -266,6 +266,8 @@ def extract_features(data_dict, sampling_rate=500, used_channels=[0, 1, 2, 3, 4, print("No last file in DB") for label, data in data_dict.items(): + # get limit amount of radom samples out of data + data = random.sample(data, min(len(data), limit)) print(f"Extracting features for {label} with {len(data)} data entries.") for data_idx, record in enumerate(data): # Skip the records that are already in the database diff --git a/scripts/generate_data.py b/scripts/generate_data.py index 1dc4bbb..76f2321 100644 --- a/scripts/generate_data.py +++ b/scripts/generate_data.py @@ -30,7 +30,7 @@ def get_diagnosis_ids(record): list_diagnosis = [int(x.strip()) for x in diagnosis.split(',')] return list_diagnosis -def generate_raw_data(path_to_data, settings, max_counter=100_000): +def generate_raw_data(path_to_data, settings, max_counter=100_000, only_ids=False): """ Generates the raw data from the WFDB records. Args: @@ -43,7 +43,10 @@ def generate_raw_data(path_to_data, settings, max_counter=100_000): failed_records = [] categories = settings["labels"] - diag_dict = {k: [] for k in categories.keys()} + if only_ids: + diag_dict = {} + else: + diag_dict = {k: [] for k in categories.keys()} # Loop through the records for dir_th in os.listdir(path_to_data): path_to_1000_records = path_to_data + '/' + dir_th @@ -60,12 +63,15 @@ def generate_raw_data(path_to_data, settings, max_counter=100_000): record = wfdb.rdrecord(path_to_100_records + '/' + record_name) # Get the diagnosis diagnosis = np.array(get_diagnosis_ids(record)) - # check if diagnosis is a subset of one of the categories - for category_name, category_codes in categories.items(): - # if any of the diagnosis codes is in the category_codes - if any(i in category_codes for i in diagnosis): - diag_dict[category_name].append(record) - break + if only_ids: + diag_dict[record_name] = diagnosis + else: + # check if diagnosis is a subset of one of the categories + for category_name, category_codes in categories.items(): + # if any of the diagnosis codes is in the category_codes + if any(i in category_codes for i in diagnosis): + diag_dict[category_name].append(record) + break # Increment the counter of how many records we have read counter += 1 counter_bool = counter >= max_counter @@ -83,7 +89,7 @@ def generate_raw_data(path_to_data, settings, max_counter=100_000): break return diag_dict -def write_data(data_dict, path='./data', file_prefix=''): +def write_data(data_dict, path='./data', file_prefix='', only_ids=False): """ Writes the data to a pickle file. Args: @@ -93,6 +99,13 @@ def write_data(data_dict, path='./data', file_prefix=''): # if path not exists create it if not os.path.exists(path): os.makedirs(path) + + if only_ids: + # write to pickle + print(f"Writing diagnosis IDs to pickle with {len(data_dict)} data entries.") + with open(f'{path}/{file_prefix}.pkl', 'wb') as f: + pickle.dump(data_dict, f) + return # write to pickle for cat_name, data in data_dict.items(): print(f"Writing {cat_name} to pickle with {len(data)} data entries.") @@ -114,7 +127,7 @@ def generate_feature_data(input_data_path, settings, parallel=False, split_ratio split_ratio = settings['split_ratio'] print(list(os.listdir(input_data_path))) for file in os.listdir(input_data_path): - if file.endswith(".pkl"): + if file.endswith(".pkl") and not file.startswith("diagnosis"): print(f"Reading {file}") with open(f'{input_data_path}/{file}', 'rb') as f: data = pickle.load(f) @@ -127,13 +140,14 @@ def generate_feature_data(input_data_path, settings, parallel=False, split_ratio print(f"Using {max_processes} processes to extract features.") feature_extraction.extract_features_parallel(data_dict, num_processes=max_processes) else: - feature_extraction.extract_features(data_dict) + print(f"For even distribution of data, the limit is set to the smallest size: 1000.") + feature_extraction.extract_features(data_dict, limit=1000) # Split the data feature_extraction.split_and_shuffle_data(split_ratio=split_ratio) -def main(gen_data=True, gen_features=True, split_ratio=None, parallel=False, settings_path='./settings.json', num_process_files=-1): +def main(gen_data=True, gen_features=True, gen_diag_ids=True, split_ratio=None, parallel=False, settings_path='./settings.json', num_process_files=-1): """ Main function to generate the data. Args: @@ -159,6 +173,11 @@ def main(gen_data=True, gen_features=True, split_ratio=None, parallel=False, set if gen_features: feature_data_dict = generate_feature_data(settings["data_path"], settings, split_ratio=split_ratio, parallel=parallel) ret_data = feature_data_dict + if gen_diag_ids: + raw_data_dir = settings["wfdb_path"] + '/WFDBRecords' + data_dict = generate_raw_data(raw_data_dir, settings, max_counter=num_process_files, only_ids=True) + write_data(data_dict, path=settings["data_path"], file_prefix='diagnosis', only_ids=True) + ret_data = data_dict return ret_data @@ -178,6 +197,7 @@ if __name__ == '__main__': # SB, AFIB, GSVT, SR # new GSVT, AFIB, SR, SB # Generate the data - main(gen_data=True, gen_features=False, num_process_files=100_000) - #main(gen_data=False, gen_features=True, split_ratio=[0.8, 0.1, 0.1], parallel=False, num_process_files=100_000) + #main(gen_data=True, gen_features=False, gen_diag_ids=False, num_process_files=100_000) + #main(gen_data=False, gen_features=True, gen_diag_ids=False, split_ratio=[0.8, 0.1, 0.1]) + main(gen_data=False, gen_features=False, gen_diag_ids=True) print("Data generation completed.")