{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport re\nfrom string import punctuation\nfrom nltk.tokenize import word_tokenize\nfrom keras.utils import to_categorical\nimport string\nfrom tensorflow.keras.preprocessing.text import Tokenizer\nfrom tensorflow.keras.preprocessing.sequence import pad_sequences\nfrom sklearn.model_selection import train_test_split\nimport spacy\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report\nfrom sklearn.metrics import log_loss\nfrom imblearn.over_sampling import RandomOverSampler\nfrom imblearn.over_sampling import SMOTE, SMOTENC\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom imblearn.combine import SMOTEENN\nfrom collections import Counter\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\nimport joblib\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input/'):\n    for filename in filenames:\n        os.path.join(dirname, filename)\n#         print(os.path.join(dirname, filename))\n\npd.set_option('display.max_rows', 200)\npd.set_option('display.max_columns', 150)\npd.set_option('display.width', 1000)\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"execution":{"iopub.status.busy":"2024-06-24T08:40:12.776997Z","iopub.execute_input":"2024-06-24T08:40:12.777362Z","iopub.status.idle":"2024-06-24T08:40:34.764965Z","shell.execute_reply.started":"2024-06-24T08:40:12.777334Z","shell.execute_reply":"2024-06-24T08:40:34.763946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def take_data(ids,slug):\n    # Cast all float columns to float16\n    df =pd.read_parquet(f'/kaggle/input/hms-harmful-brain-activity-classification/train_{slug}/{ids}.parquet')\n    if slug == 'eegs':\n        df = df.drop(columns = ['EKG'])\n    return df\nimport mne\ndef pad_or_truncate_eeg(eeg_data, target_length=10000):\n#     eeg_data = eeg_data.to_numpy()\n    current_length, features = eeg_data.shape\n#     print(current_length)\n    if current_length < target_length:\n        # Pad with zeros\n        padding = np.zeros((target_length - current_length, features))\n        eeg_data_padded = np.vstack((eeg_data, padding))\n    elif current_length > target_length:\n        # Truncate to target length\n        eeg_data_padded = eeg_data[:target_length, :]\n    else:\n        eeg_data_padded = eeg_data\n    return eeg_data_padded\n\ndef pad_or_truncate_spec(spectrogram_data, target_time_dimension=500):\n    current_time_dim, frequency_dim = spectrogram_data.shape\n    spectrogram_data = spectrogram_data.to_numpy()\n    if current_time_dim < target_time_dimension:\n        # Pad with zeros\n        padding = np.zeros((target_time_dimension - current_time_dim, frequency_dim))\n        spectrogram_data_padded = np.vstack((spectrogram_data, padding))\n    elif current_time_dim > target_time_dimension:\n        # Truncate to target time dimension\n        spectrogram_data_padded = spectrogram_data[:target_time_dimension, :]\n    else:\n        spectrogram_data_padded = spectrogram_data\n    return spectrogram_data_padded\n\n## Wavelet Transform\nimport numpy as np\nimport pywt\n\ndef perform_cwt(signal, wavelet_width, fs, lower_freq, upper_freq, n_scales, border_crop, stride):\n    # Calculate the central frequencies of the wavelet\n    wavelet = 'cmor' + str(wavelet_width) + '-1.0'\n    central_freq = pywt.central_frequency(wavelet)\n\n    # Calculate scales based on the desired frequency range\n    scales = central_freq * fs / np.linspace(lower_freq, upper_freq, n_scales)\n    \n    # Perform the Continuous Wavelet Transform\n    coefs, freqs = pywt.cwt(signal, scales, wavelet, sampling_period=1.0/fs)\n    \n    # Crop borders if needed\n    if border_crop > 0:\n        coefs = coefs[:, border_crop:-border_crop]\n\n    # Apply stride\n    coefs = coefs[:, ::stride]\n    \n    return coefs, freqs\n\n# Define parameters\nwavelet_width = 7\nfs = 200\nlower_freq = 0.5\nupper_freq = 20\nn_scales = 40\nborder_crop = 1\nstride = 16\n\n# Perform CWT for each channel\ndef cwt_all(raw_eeg_signal):\n    cwt_results = []\n    for i in range(raw_eeg_signal.shape[1]):\n        signal = raw_eeg_signal[:, i]\n        coefs, freqs = perform_cwt(signal, wavelet_width = 7, fs =200, lower_freq = 0.5, upper_freq = 20, n_scales = 40, border_crop = 1, stride = 16)\n        cwt_results.append(coefs)\n    return np.abs(np.array(cwt_results))\n# cwt_results is a list of CWT results for each EEG channel\n# Create a figure and axis\n\ndef mat_show(img):\n    fig, ax = plt.subplots(figsize=(10, 6))\n\n    # Use matshow to visualize the magnitude of CWT coefficients of the specified channel\n    cax = ax.matshow(img, aspect='auto', cmap='viridis')\n\n    # Add a color bar to show the intensity scale\n    fig.colorbar(cax)\n\n    # Set labels\n    ax.set_title(f'CWT Magnitude for Channel')\n    ax.set_xlabel('Time')\n    ax.set_ylabel('Scale')\n\n    # Show the plot\n    plt.show()\n# data = np.random.randn(10, 18, 10000)\nimport numpy as np\nfrom scipy.signal import butter, filtfilt","metadata":{"execution":{"iopub.status.busy":"2024-06-24T08:40:34.767232Z","iopub.execute_input":"2024-06-24T08:40:34.767585Z","iopub.status.idle":"2024-06-24T08:40:34.783138Z","shell.execute_reply.started":"2024-06-24T08:40:34.767555Z","shell.execute_reply":"2024-06-24T08:40:34.781901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\nimport numpy as np\nimport cv2\n# Define the function to process each row\nscaler = StandardScaler()\ndef process_eeg(row):\n    ## params \n    # Example data\n    fs_filtering = 10000  # Sampling frequency in Hz\n    lowcut = 0.5  # Low cut frequency in Hz\n    highcut = 20  # High cut frequency in Hz\n    sample_signal = take_data(row['eeg_id'], 'eegs').replace({np.inf:np.nan,-np.inf:np.nan})\n    sample_signal = sample_signal.dropna()\n    if len(sample_signal) > 10000:\n        left = int((len(sample_signal) - 10000) / 2)\n        right = left + 10000\n        sample_signal = sample_signal.iloc[left:right]\n    mapped_features = np.array([sample_signal['Fp1'] - sample_signal['F7'],\n                                sample_signal['F7'] - sample_signal['T3'],\n                                sample_signal['T3'] - sample_signal['T5'],\n                                sample_signal['T5'] - sample_signal['O1'],\n                                sample_signal['Fp1'] - sample_signal['F3'],\n                                sample_signal['F3'] - sample_signal['C3'],\n                                sample_signal['C3'] - sample_signal['P3'],\n                                sample_signal['P3'] - sample_signal['O1'],\n                                sample_signal['Fp2'] - sample_signal['F8'],\n                                sample_signal['F8'] - sample_signal['T4'],\n                                sample_signal['T4'] - sample_signal['T6'],\n                                sample_signal['T6'] - sample_signal['O2'],\n                                sample_signal['Fp2'] - sample_signal['F4'],\n                                sample_signal['F4'] - sample_signal['C4'],\n                                sample_signal['C4'] - sample_signal['P4'],\n                                sample_signal['P4'] - sample_signal['O2'],\n                                sample_signal['Fz'] - sample_signal['Cz'],\n                                sample_signal['Cz'] - sample_signal['Pz']])\n    mapped_features = np.transpose(mapped_features)\n    lower_percentile = np.percentile(mapped_features, 2, axis=-1, keepdims=True)\n    upper_percentile = np.percentile(mapped_features, 98, axis=-1, keepdims=True)\n    # Clip the values based on the computed percentiles\n    data_clipped = np.clip(mapped_features, lower_percentile, upper_percentile)\n    scalogram_image = cwt_all(data_clipped)\n    # Step 1: Stack the first two dimensions (18 and 40) into one dimension\n    stacked_image = np.reshape(scalogram_image, (18 * 40, scalogram_image.shape[2]))  # Resulting shape: (720, 625)\n    # Step 2: Resize the stacked image to (512, 512)\n    scalogram_image = cv2.resize(stacked_image, (512, 512), interpolation=cv2.INTER_LINEAR)\n    # stft wavelet\n    return scalogram_image","metadata":{"execution":{"iopub.status.busy":"2024-06-24T08:40:34.784739Z","iopub.execute_input":"2024-06-24T08:40:34.785546Z","iopub.status.idle":"2024-06-24T08:40:34.800485Z","shell.execute_reply.started":"2024-06-24T08:40:34.785505Z","shell.execute_reply":"2024-06-24T08:40:34.799478Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Base_Path = '/kaggle/input/hms-harmful-brain-activity-classification'\ndf_train = pd.read_csv(f'{Base_Path}/train.csv')\ndf_train['class name'] = df_train['expert_consensus'].copy()\ndf_train['expert_consensus'] = df_train['expert_consensus'].replace({'Seizure':1,'LPD':2,'GPD':3,'LRDA':4,'GRDA':5,'Other':6})\nunique_rows = df_train.drop_duplicates(subset=['eeg_id', 'spectrogram_id'])\nunique_rows[['eeg_id','spectrogram_id','class name']].head()\nunique_rows = unique_rows[unique_rows[['seizure_vote','lpd_vote','gpd_vote','lrda_vote','grda_vote']].T.sum() > 5]\nunique_rows = unique_rows.reset_index(drop = True)\nprint(len(unique_rows))\nlabels = unique_rows[['seizure_vote','lpd_vote','gpd_vote','lrda_vote','grda_vote','other_vote']].to_numpy()\nohe_labels = np.argmax(labels,axis =1)\nfinal_labels = to_categorical(ohe_labels)\nprint(final_labels.shape)","metadata":{"execution":{"iopub.status.busy":"2024-06-24T08:40:34.802421Z","iopub.execute_input":"2024-06-24T08:40:34.802770Z","iopub.status.idle":"2024-06-24T08:40:35.145581Z","shell.execute_reply.started":"2024-06-24T08:40:34.802742Z","shell.execute_reply":"2024-06-24T08:40:35.144633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n# Use joblib to parallelize the processing of rows\ndata_eeg = np.array(joblib.Parallel(n_jobs=4, backend ='loky',return_as ='list')(\n    joblib.delayed(process_eeg)(unique_rows.iloc[row]) for row in tqdm(range(len(unique_rows))) # len(unique_rows)\n)).astype(np.float16)","metadata":{"execution":{"iopub.status.busy":"2024-06-24T08:40:35.146664Z","iopub.execute_input":"2024-06-24T08:40:35.146982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.save('kaggle/working/3156-2.npy', data_eeg)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}