{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","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"}],"dockerImageVersionId":31012,"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\nimport matplotlib.pyplot as plt # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns\n\n\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\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-19T03:42:53.630897Z","iopub.execute_input":"2025-04-19T03:42:53.631255Z","iopub.status.idle":"2025-04-19T03:43:01.532742Z","shell.execute_reply.started":"2025-04-19T03:42:53.631213Z","shell.execute_reply":"2025-04-19T03:43:01.531002Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\ntrain_df = pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/train.csv\")\nprint(train_df.head())\nprint(train_df.info())\nprint(train_df.describe())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T04:51:47.068290Z","iopub.execute_input":"2025-04-21T04:51:47.068601Z","iopub.status.idle":"2025-04-21T04:51:49.133006Z","shell.execute_reply.started":"2025-04-21T04:51:47.068571Z","shell.execute_reply":"2025-04-21T04:51:49.132150Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['expert_consensus'].value_counts().sort_index().plot(kind='bar', title=\"Class Distribution\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T04:53:05.450521Z","iopub.execute_input":"2025-04-21T04:53:05.450909Z","iopub.status.idle":"2025-04-21T04:53:05.947393Z","shell.execute_reply.started":"2025-04-21T04:53:05.450878Z","shell.execute_reply":"2025-04-21T04:53:05.946450Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pyarrow.parquet as pq\n\nsample_file = \"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/2208063991.parquet\"\neeg_df = pd.read_parquet(sample_file)\nprint(eeg_df.head())\nprint(eeg_df.columns)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T04:55:27.429879Z","iopub.execute_input":"2025-04-21T04:55:27.430360Z","iopub.status.idle":"2025-04-21T04:55:27.687862Z","shell.execute_reply.started":"2025-04-21T04:55:27.430329Z","shell.execute_reply":"2025-04-21T04:55:27.686844Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_patients = train_df['patient_id'].nunique()\nprint(f\"Number of unique patients in train dataset: {num_patients}\")\n\n# Number of unique EEG IDs\nnum_eeg_ids = train_df['eeg_id'].nunique()\nprint(f\"Number of unique EEG IDs in train dataset: {num_eeg_ids}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T04:55:48.493580Z","iopub.execute_input":"2025-04-21T04:55:48.493858Z","iopub.status.idle":"2025-04-21T04:55:48.503177Z","shell.execute_reply.started":"2025-04-21T04:55:48.493836Z","shell.execute_reply":"2025-04-21T04:55:48.502312Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport matplotlib.pyplot as plt \nimport seaborn as sns\nnumerical_columns = train_df.select_dtypes(include=['int64', 'float64']).columns\ncorr_matrix = train_df[numerical_columns].corr()\n\n# Increase the size of the figure\nplt.figure(figsize=(12, 8)) \n\n# Heatmap for correlation analysis\n# We are using 'coolwarm' colormap here to distinguish positive and negative correlations easily\nsns.heatmap(corr_matrix, annot=True, cmap='coolwarm')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T04:56:39.232200Z","iopub.execute_input":"2025-04-21T04:56:39.232598Z","iopub.status.idle":"2025-04-21T04:56:41.106213Z","shell.execute_reply.started":"2025-04-21T04:56:39.232573Z","shell.execute_reply":"2025-04-21T04:56:41.104927Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.hist(figsize=(15, 10))\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T04:57:25.331935Z","iopub.execute_input":"2025-04-21T04:57:25.332466Z","iopub.status.idle":"2025-04-21T04:57:27.196359Z","shell.execute_reply.started":"2025-04-21T04:57:25.332437Z","shell.execute_reply":"2025-04-21T04:57:27.195241Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"eeg = pd.read_parquet('/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/2208063991.parquet')\n\n#List of columns to plot\ncolumns_to_plot = [\n    'Fp1', 'F3', 'C3', 'P3', 'F7', 'T3', 'T5', 'O1', 'Fz', 'Cz', 'Pz', \n    'Fp2', 'F4', 'C4', 'P4', 'F8', 'T4', 'T6', 'O2', 'EKG'\n]\n\n# Determine the number of rows/columns needed for subplots\nnum_plots = len(columns_to_plot)\nnum_columns = 2  # Set to 2 as per the previous code\nnum_rows = num_plots // num_columns + (num_plots % num_columns > 0)\n\n# Create subplots\nfig, axes = plt.subplots(num_rows, num_columns, figsize=(20, num_rows * 4))\n\n# Flatten the axes array for easy iteration\naxes = axes.flatten()\n\n# Plot each column in a subplot\nfor i, col in enumerate(columns_to_plot):\n    axes[i].plot(eeg[col])\n    axes[i].set_title(f'Electrode: {col}', fontsize=14)\n\n# Hide any unused subplots\nfor ax in axes[len(columns_to_plot):]:\n    ax.set_visible(False)\n\n# Set the overall figure title\nfig.suptitle('EEG Data Visualization Based on the International 10-20 System', fontsize=30, y=1.02)\n\n# Adjust layout to prevent overlap\nplt.tight_layout()\n\n# Show the plot\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T04:58:05.232515Z","iopub.execute_input":"2025-04-21T04:58:05.232841Z","iopub.status.idle":"2025-04-21T04:58:09.892484Z","shell.execute_reply.started":"2025-04-21T04:58:05.232817Z","shell.execute_reply":"2025-04-21T04:58:09.891190Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def visualize_eeg_signal(df, title, path=None):\n    eeg_columns = [\n        'Fp1', 'F3', 'C3', 'P3', 'F7', 'T3',\n        'T5', 'O1', 'Fz', 'Cz', 'Pz', 'Fp2',\n        'F4', 'C4', 'P4', 'F8', 'T4', 'T6',\n        'O2',\n    ]\n    ekg_column = 'EKG'\n    eeg_spacing = 500\n    \n    fig, axes = plt.subplots(figsize=(24, 24), nrows=2, height_ratios=[10, 1], dpi=100)\n\n    for column_idx, column in enumerate(eeg_columns):\n        axes[0].plot(np.arange(0, df.shape[0]), df[column] + (eeg_spacing * column_idx), linewidth=0.5, color='black')\n        \n    y_ticks = np.arange(0, len(eeg_columns)) * eeg_spacing - 100\n    axes[0].set_yticks(y_ticks)\n    axes[0].set_yticklabels(eeg_columns)\n    axes[0].tick_params(axis='x', labelsize=15)\n    axes[0].tick_params(axis='y', labelsize=15)\n    axes[0].set_xlabel('')\n    axes[0].set_ylabel('')\n    axes[0].set_title(title, size=15, pad=12.5, loc='center')\n    \n    axes[1].plot(np.arange(0, df.shape[0]), df['EKG'], linewidth=0.5, color='black')\n    axes[1].set_yticks(np.array(axes[1].get_yticks()) * 1.5)\n    axes[1].tick_params(axis='x', labelsize=12.5)\n    axes[1].tick_params(axis='y', labelsize=12.5)\n    axes[1].set_xlabel('')\n    axes[1].set_ylabel('')\n    axes[1].set_title('EKG', size=15, pad=12.5, loc='center')\n    \n    if path is None:\n        plt.show()\n    else:\n        plt.savefig(path, bbox_inches='tight')\n        plt.close(fig)\n\n\nvisualize_eeg_signal(\n    df=eeg,\n    title='EEG 2208063991'\n)\n\n        \n    \n   \n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T05:02:06.335674Z","iopub.execute_input":"2025-04-21T05:02:06.335963Z","iopub.status.idle":"2025-04-21T05:02:07.189569Z","shell.execute_reply.started":"2025-04-21T05:02:06.335943Z","shell.execute_reply":"2025-04-21T05:02:07.188669Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\ntrain_df['expert_consensus'].value_counts().plot(kind='bar')\nplt.title(\"Distribution of Expert Consensus Labels\")\nplt.xticks(rotation=45)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T05:04:44.535700Z","iopub.execute_input":"2025-04-21T05:04:44.536043Z","iopub.status.idle":"2025-04-21T05:04:44.751326Z","shell.execute_reply.started":"2025-04-21T05:04:44.536006Z","shell.execute_reply":"2025-04-21T05:04:44.750387Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport pyarrow.parquet as pq\nfrom scipy.signal import welch, spectrogram\nimport os\n\n# Config\nplt.style.use('ggplot')\nplt.rcParams['figure.figsize'] = (15, 6)\nsns.set_palette(\"husl\")\n\n# Load data\ntrain_df = pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/train.csv\")\nlabels = [\"seizure_vote\", \"lpd_vote\", \"gpd_vote\", \"lrda_vote\", \"grda_vote\", \"other_vote\"]\nplt.figure(figsize=(14, 7))\ntrain_df[labels].sum().sort_values().plot(kind='barh')\nplt.title(\"Total Votes per Label Across All Samples\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T05:19:59.982006Z","iopub.execute_input":"2025-04-21T05:19:59.982902Z","iopub.status.idle":"2025-04-21T05:20:00.629607Z","shell.execute_reply.started":"2025-04-21T05:19:59.982873Z","shell.execute_reply":"2025-04-21T05:20:00.628724Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from itertools import combinations\nfor combo in combinations(labels, 2):\n    plt.figure()\n    sns.scatterplot(data=train_df, x=combo[0], y=combo[1], alpha=0.6)\n    plt.title(f\"Vote Interaction: {combo[0]} vs {combo[1]}\")\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T05:21:19.366840Z","iopub.execute_input":"2025-04-21T05:21:19.367152Z","iopub.status.idle":"2025-04-21T05:21:26.604247Z","shell.execute_reply.started":"2025-04-21T05:21:19.367128Z","shell.execute_reply":"2025-04-21T05:21:26.603216Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(14, 8))\nsns.boxplot(data=train_df[labels])\nplt.title(\"Distribution of Expert Vote Confidence per Label\")\nplt.xticks(rotation=45)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T05:27:10.263700Z","iopub.execute_input":"2025-04-21T05:27:10.264024Z","iopub.status.idle":"2025-04-21T05:27:10.742713Z","shell.execute_reply.started":"2025-04-21T05:27:10.264002Z","shell.execute_reply":"2025-04-21T05:27:10.741800Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def plot_spectrograms_for_class(target_label, n_samples=3):\n    class_samples = train_df[train_df[target_label] > 0].sample(n_samples)\n    for _, row in class_samples.iterrows():\n        spec = pq.read_pandas(\n            f\"/kaggle/input/hms-harmful-brain-activity-classification/train_spectrograms/{row.spectrogram_id}.parquet\"\n        ).to_pandas()\n        \n        plt.figure(figsize=(18, 4))\n        plt.imshow(spec.iloc[:, 1:].T, aspect='auto', cmap='viridis', vmax=5)\n        plt.colorbar(label='Power (dB)')\n        plt.title(f\"Spectrogram for {target_label} (Patient {row.patient_id}, Votes: {row[labels].to_dict()})\")\n        plt.xlabel(\"Time (bins)\")\n        plt.ylabel(\"Frequency (Hz)\")\n        plt.show()\n\nfor label in labels:\n    plot_spectrograms_for_class(label)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T05:27:56.144320Z","iopub.execute_input":"2025-04-21T05:27:56.144628Z","iopub.status.idle":"2025-04-21T05:28:06.540382Z","shell.execute_reply.started":"2025-04-21T05:27:56.144607Z","shell.execute_reply":"2025-04-21T05:28:06.539095Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def plot_eegs_for_class(target_label, n_samples=2, electrodes=('Fp1', 'Fp2', 'T3', 'T4')):\n    class_samples = train_df[train_df[target_label] > 0].sample(n_samples)\n    for _, row in class_samples.iterrows():\n        eeg = pq.read_pandas(\n            f\"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/{row.eeg_id}.parquet\"\n        ).to_pandas()\n        \n        plt.figure(figsize=(18, 8))\n        for col in electrodes:\n            plt.plot(eeg[col].values[:2000], label=col)\n        plt.legend()\n        plt.title(f\"EEG for {target_label} (Patient {row.patient_id})\")\n        plt.xlabel(\"Time (samples)\")\n        plt.ylabel(\"Amplitude (µV)\")\n        plt.show()\n\nfor label in labels:\n    plot_eegs_for_class(label)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T05:32:23.898978Z","iopub.execute_input":"2025-04-21T05:32:23.899434Z","iopub.status.idle":"2025-04-21T05:32:29.450888Z","shell.execute_reply.started":"2025-04-21T05:32:23.899409Z","shell.execute_reply":"2025-04-21T05:32:29.449899Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport pyarrow.parquet as pq\nimport matplotlib.pyplot as plt\nimport random\n\n# Directory where EEG parquet files are stored\nEEG_DIR = \"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs\"\n\n# Get list of all available parquet files\neeg_files = [f for f in os.listdir(EEG_DIR) if f.endswith(\".parquet\")]\n\n# Randomly select 5 files (or any number you prefer)\nsample_files = random.sample(eeg_files, 5)\n\n# Loop over each selected file and plot signals from specific electrodes\nfor file in sample_files:\n    eeg_id = file.split(\".\")[0]\n    eeg_path = os.path.join(EEG_DIR, file)\n\n    # Load EEG data\n    eeg_data = pd.read_parquet(eeg_path)\n\n    # Electrodes to plot\n    electrodes_to_plot = ['Fp1', 'F3', 'C3', 'O1']  # you can change this list\n\n    plt.figure(figsize=(14, 6))\n    for ch in electrodes_to_plot:\n        if ch in eeg_data.columns:\n            plt.plot(eeg_data[ch].values[:1000], label=ch)  # first 1000 samples\n\n    plt.title(f\"EEG ID: {eeg_id}\")\n    plt.xlabel(\"Time\")\n    plt.ylabel(\"Signal\")\n    plt.legend()\n    plt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-21T08:26:01.036302Z","iopub.execute_input":"2025-04-21T08:26:01.037451Z","iopub.status.idle":"2025-04-21T08:26:02.950325Z","shell.execute_reply.started":"2025-04-21T08:26:01.037417Z","shell.execute_reply":"2025-04-21T08:26:02.949242Z"}},"outputs":[],"execution_count":null}]}