{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30822,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport re\nfrom sklearn.base import clone\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom scipy.optimize import minimize\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nimport polars as pl\nimport polars.selectors as cs\nimport matplotlib.pyplot as plt\nfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter, PercentFormatter\nimport seaborn as sns\n\nfrom sklearn.preprocessing import StandardScaler\nimport matplotlib.pyplot as plt\nfrom keras.models import Model\nfrom keras.layers import Input, Dense\nfrom keras.optimizers import Adam\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\n\nfrom colorama import Fore, Style\nfrom IPython.display import clear_output\nimport warnings\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom sklearn.ensemble import VotingRegressor, RandomForestRegressor, GradientBoostingRegressor\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.pipeline import Pipeline\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.046204Z","iopub.execute_input":"2024-12-22T16:04:18.046640Z","iopub.status.idle":"2024-12-22T16:04:18.056319Z","shell.execute_reply.started":"2024-12-22T16:04:18.046604Z","shell.execute_reply":"2024-12-22T16:04:18.054525Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data structure","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\ndata_dict = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/data_dictionary.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.058132Z","iopub.execute_input":"2024-12-22T16:04:18.058633Z","iopub.status.idle":"2024-12-22T16:04:18.164339Z","shell.execute_reply.started":"2024-12-22T16:04:18.058586Z","shell.execute_reply":"2024-12-22T16:04:18.162112Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Train","metadata":{}},{"cell_type":"code","source":"display(train.head())\nprint(f\"Train shape: {train.shape}\")\ntrain.describe().transpose()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.167356Z","iopub.execute_input":"2024-12-22T16:04:18.167811Z","iopub.status.idle":"2024-12-22T16:04:18.470238Z","shell.execute_reply.started":"2024-12-22T16:04:18.167767Z","shell.execute_reply":"2024-12-22T16:04:18.468655Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Test","metadata":{}},{"cell_type":"code","source":"display(test.head())\nprint(f\"Test shape: {test.shape}\")\ntest.describe().transpose()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.472301Z","iopub.execute_input":"2024-12-22T16:04:18.472707Z","iopub.status.idle":"2024-12-22T16:04:18.650273Z","shell.execute_reply.started":"2024-12-22T16:04:18.472669Z","shell.execute_reply":"2024-12-22T16:04:18.648211Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Data dictionary","metadata":{}},{"cell_type":"code","source":"data_dict.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.651579Z","iopub.execute_input":"2024-12-22T16:04:18.651963Z","iopub.status.idle":"2024-12-22T16:04:18.666956Z","shell.execute_reply.started":"2024-12-22T16:04:18.651926Z","shell.execute_reply":"2024-12-22T16:04:18.665705Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.668343Z","iopub.execute_input":"2024-12-22T16:04:18.668924Z","iopub.status.idle":"2024-12-22T16:04:18.742215Z","shell.execute_reply.started":"2024-12-22T16:04:18.668813Z","shell.execute_reply":"2024-12-22T16:04:18.740976Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.743274Z","iopub.execute_input":"2024-12-22T16:04:18.743592Z","iopub.status.idle":"2024-12-22T16:04:18.822426Z","shell.execute_reply.started":"2024-12-22T16:04:18.743564Z","shell.execute_reply":"2024-12-22T16:04:18.821112Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Ý nghĩa các cột bị thiếu trong test","metadata":{}},{"cell_type":"code","source":"train_cols = set(train.columns)\ntest_cols = set(test.columns)\ncolumns_not_in_test = sorted(list(train_cols - test_cols))\ndata_dict[data_dict['Field'].isin(columns_not_in_test)]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.826065Z","iopub.execute_input":"2024-12-22T16:04:18.826448Z","iopub.status.idle":"2024-12-22T16:04:18.843543Z","shell.execute_reply.started":"2024-12-22T16:04:18.826417Z","shell.execute_reply":"2024-12-22T16:04:18.842105Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Null value","metadata":{}},{"cell_type":"code","source":"# Dùng để tính phần trăm các giá trị trong cột\n# sort_by_nan = True, sẽ sắp xếp các cột theo tỉ lệ thiếu dữ liệu\n\ndef calculate_missing_stats(data, sort_by_nan=True):\n    columns = data.columns \n\n    missing_percentages = {}  # Dictionary lưu tỷ lệ NaN\n\n    for col in columns:\n        if data[col].dtype in ['object', 'category']:\n            # Tính số lượng và phần trăm các giá trị trong cột\n            counts = data[col].value_counts(dropna=False, sort=False)\n            percents = data[col].value_counts(normalize=True, dropna=False, sort=False) * 100\n            # Không cần lưu bảng thống kê chi tiết cho các cột kiểu object\n        else:\n            # Tính thống kê mô tả cho các cột số\n            missing_count = data[col].isnull().sum()\n            missing_percentage = (missing_count / len(data)) * 100  # Phần trăm NaN\n            missing_percentages[col] = missing_percentage\n\n    # Sắp xếp các cột theo tỷ lệ NaN nếu sort_by_nan được bật\n    if sort_by_nan:\n        sorted_missing = pd.Series(missing_percentages).sort_values(ascending=False)\n\n        # Vẽ biểu đồ tỷ lệ NaN\n        plt.figure(figsize=(12, 8))\n        sorted_missing.plot(kind='bar', color='skyblue')\n        plt.title('Tỷ lệ giá trị bị thiếu (NaN) của các cột')\n        plt.xlabel('Cột')\n        plt.ylabel('Tỷ lệ NaN (%)')\n        plt.xticks(rotation=90, ha='right', fontsize=10)\n        plt.show()\n\n    return missing_percentages\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.846188Z","iopub.execute_input":"2024-12-22T16:04:18.846626Z","iopub.status.idle":"2024-12-22T16:04:18.869217Z","shell.execute_reply.started":"2024-12-22T16:04:18.846562Z","shell.execute_reply":"2024-12-22T16:04:18.867647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Sử dụng hàm (ví dụ): nếu muốn sắp xếp theo tỷ lệ NaN\ncalculate_missing_stats(train)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:18.870259Z","iopub.execute_input":"2024-12-22T16:04:18.870671Z","iopub.status.idle":"2024-12-22T16:04:19.667523Z","shell.execute_reply.started":"2024-12-22T16:04:18.870619Z","shell.execute_reply":"2024-12-22T16:04:19.666393Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"calculate_missing_stats(test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:19.668647Z","iopub.execute_input":"2024-12-22T16:04:19.669009Z","iopub.status.idle":"2024-12-22T16:04:20.298713Z","shell.execute_reply.started":"2024-12-22T16:04:19.668964Z","shell.execute_reply":"2024-12-22T16:04:20.297080Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Sii Correlation","metadata":{}},{"cell_type":"code","source":"vc = train['Basic_Demos-Enroll_Season'].value_counts()\nplt.pie(vc.values, labels=vc.index)\nplt.title('Season of enrollment')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:20.299842Z","iopub.execute_input":"2024-12-22T16:04:20.300187Z","iopub.status.idle":"2024-12-22T16:04:20.404260Z","shell.execute_reply.started":"2024-12-22T16:04:20.300159Z","shell.execute_reply":"2024-12-22T16:04:20.402780Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Đếm số lượng cho cột 'Basic_Demos-Sex'\nvc_sex = train['Basic_Demos-Sex'].value_counts()\nplt.pie(vc_sex.values, labels=['boys', 'girls'], autopct='%1.1f%%')\nplt.title('Sex of participant')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:20.406055Z","iopub.execute_input":"2024-12-22T16:04:20.406599Z","iopub.status.idle":"2024-12-22T16:04:20.571757Z","shell.execute_reply.started":"2024-12-22T16:04:20.406550Z","shell.execute_reply":"2024-12-22T16:04:20.570350Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Đếm số lượng cho cột 'sii'\nvc_sii = train['sii'].value_counts()\nplt.pie(vc_sii.values, labels=['0', '1', '2', '3'], autopct='%1.1f%%')\nplt.title('sii of participant')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:20.573632Z","iopub.execute_input":"2024-12-22T16:04:20.574212Z","iopub.status.idle":"2024-12-22T16:04:20.751053Z","shell.execute_reply.started":"2024-12-22T16:04:20.574152Z","shell.execute_reply":"2024-12-22T16:04:20.749210Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Danh sách các cột phân loại\ncategorical_columns = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', \n                       'FGC-Season', 'BIA-Season', 'PCIAT-Season', 'SDS-Season', 'PreInt_EduHx-Season']\n\n# Thiết lập kích thước cho đồ thị\nplt.figure(figsize=(16, 24))\n\n# Lặp qua từng cột phân loại và vẽ biểu đồ thanh\nfor i, col in enumerate(categorical_columns, 1):\n    plt.subplot(4, 2, i)  # 4 hàng, 2 cột, vẽ đồ thị thứ i\n    sns.barplot(x=col, y='sii', data=train, ci=None)  # Vẽ biểu đồ thanh, không tính khoảng tin cậy\n    plt.xticks(rotation=45)  # Xoay nhãn trên trục x\n    plt.title(f\"'sii' vs {col}\")  # Tiêu đề cho biểu đồ\n\n# Điều chỉnh không gian giữa các biểu đồ\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:20.752803Z","iopub.execute_input":"2024-12-22T16:04:20.753356Z","iopub.status.idle":"2024-12-22T16:04:22.475999Z","shell.execute_reply.started":"2024-12-22T16:04:20.753305Z","shell.execute_reply":"2024-12-22T16:04:22.474967Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Phân bố sii theo các feature","metadata":{}},{"cell_type":"code","source":"data = train\n\nfor column in train.columns:\n    if column in ['sii', 'id']:\n        continue\n    \n    feature_to_plot = column\n    \n    if data[feature_to_plot].dtype in ['float64', 'int64']:\n        plt.figure(figsize=(10, 6))\n        sns.scatterplot(data=data, x=feature_to_plot, y=\"sii\", hue=\"sii\", palette=\"viridis\", alpha=0.8)\n        plt.title(f\"Scatter Plot of {feature_to_plot} vs SII\", fontsize=16)\n        plt.xlabel(feature_to_plot, fontsize=12)\n        plt.ylabel(\"SII (Label)\", fontsize=12)\n        plt.grid(True)\n        plt.show()\n    \n    else:\n        plt.figure(figsize=(10, 6))\n        sns.countplot(data=data, x=feature_to_plot, hue=\"sii\", palette=\"bright\")\n        plt.title(f\"Bar Plot of {feature_to_plot} vs SII\", fontsize=16)\n        plt.xlabel(feature_to_plot, fontsize=12)\n        plt.ylabel(\"Count\", fontsize=12)\n        plt.xticks(rotation=45)\n        plt.grid(axis='y')\n        plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:04:22.477119Z","iopub.execute_input":"2024-12-22T16:04:22.477410Z","iopub.status.idle":"2024-12-22T16:05:00.565099Z","shell.execute_reply.started":"2024-12-22T16:04:22.477385Z","shell.execute_reply":"2024-12-22T16:05:00.563900Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## sii tương quan với BMI, Age","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\ndef plot_correlation_matrix(train_data, target_col=\"sii\", keywords=None):\n    if keywords is None:\n        print(\"No keywords provided.\")\n        return\n\n    # Lọc các cột có từ khóa trong tên\n    matched_columns = [col for col in train_data.columns if any(keyword in col for keyword in keywords)]\n    \n    if not matched_columns:\n        print(f\"No columns found with the keywords {keywords}.\")\n        return\n    \n    # Tạo DataFrame mới chứa hệ số tương quan giữa các cột và target_col\n    correlation_data = {col: train_data[col].corr(train_data[target_col]) for col in matched_columns}\n    \n    # Chuyển đổi từ dictionary sang DataFrame để dễ dàng hiển thị\n    correlation_df = pd.DataFrame(list(correlation_data.items()), columns=[\"Feature\", \"Correlation\"])\n    \n    # Vẽ ma trận tương quan\n    plt.figure(figsize=(10, 6))\n    sns.heatmap(correlation_df.set_index('Feature').T, annot=True, cmap='coolwarm', center=0, fmt='.2f')\n    plt.title(f\"Correlation Matrix for Features Containing Keywords: {', '.join(keywords)}\", fontsize=16)\n    plt.show()\n\n    # In ra bảng hệ số tương quan\n    print(\"Correlation coefficients:\")\n    print(correlation_df)\n\n# Ví dụ sử dụng hàm với một danh sách các từ khóa\nkeywords = [\"BMI\", \"Age\"]  # Ví dụ các từ khóa\nplot_correlation_matrix(train, target_col=\"sii\", keywords=keywords)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:05:00.566120Z","iopub.execute_input":"2024-12-22T16:05:00.566579Z","iopub.status.idle":"2024-12-22T16:05:00.874005Z","shell.execute_reply.started":"2024-12-22T16:05:00.566545Z","shell.execute_reply":"2024-12-22T16:05:00.872863Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Hàm Feature Engineering\ndef feature_engineering(df):\n    season_cols = [col for col in df.columns if 'Season' in col]\n    df = df.drop(season_cols, axis=1) \n    df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age']\n    df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n    df['BMI_Internet_Hours'] = df['Physical-BMI'] * df['PreInt_EduHx-computerinternet_hoursday']\n    df['BFP_BMI'] = df['BIA-BIA_Fat'] / df['BIA-BIA_BMI']\n    df['FFMI_BFP'] = df['BIA-BIA_FFMI'] / df['BIA-BIA_Fat']\n    df['FMI_BFP'] = df['BIA-BIA_FMI'] / df['BIA-BIA_Fat']\n    df['LST_TBW'] = df['BIA-BIA_LST'] / df['BIA-BIA_TBW']\n    df['BFP_BMR'] = df['BIA-BIA_Fat'] * df['BIA-BIA_BMR']\n    df['BFP_DEE'] = df['BIA-BIA_Fat'] * df['BIA-BIA_DEE']\n    df['BMR_Weight'] = df['BIA-BIA_BMR'] / df['Physical-Weight']\n    df['DEE_Weight'] = df['BIA-BIA_DEE'] / df['Physical-Weight']\n    df['SMM_Height'] = df['BIA-BIA_SMM'] / df['Physical-Height']\n    df['Muscle_to_Fat'] = df['BIA-BIA_SMM'] / df['BIA-BIA_FMI']\n    df['Hydration_Status'] = df['BIA-BIA_TBW'] / df['Physical-Weight']\n    df['ICW_TBW'] = df['BIA-BIA_ICW'] / df['BIA-BIA_TBW']\n    \n    return df\n\n# Áp dụng hàm feature_engineering vào train_data\ntrain_data = feature_engineering(train)\n\n# Ví dụ sử dụng hàm với một danh sách các từ khóa\nkeywords = [\"BMI\", \"Age\"]  # Ví dụ các từ khóa\nplot_correlation_matrix(train_data, target_col=\"sii\", keywords=keywords)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:05:00.875084Z","iopub.execute_input":"2024-12-22T16:05:00.875383Z","iopub.status.idle":"2024-12-22T16:05:01.231662Z","shell.execute_reply.started":"2024-12-22T16:05:00.875355Z","shell.execute_reply":"2024-12-22T16:05:01.230491Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Actigraphy","metadata":{}},{"cell_type":"code","source":"train_pl = pl.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\nactigraphy = pl.read_parquet('/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet/id=0417c91e/part-0.parquet')\nactigraphy","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:05:01.233144Z","iopub.execute_input":"2024-12-22T16:05:01.233448Z","iopub.status.idle":"2024-12-22T16:05:01.479660Z","shell.execute_reply.started":"2024-12-22T16:05:01.233422Z","shell.execute_reply":"2024-12-22T16:05:01.478771Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\n* step: Đơn vị bước (có thể là chỉ số mẫu hoặc thời gian trong chuỗi thời gian).\n* X, Y, Z: Dữ liệu về chuyển động trên ba trục không gian. Đây là các giá trị chuyển động thu được từ cảm biến (thường là gia tốc kế).\n* enmo: ENMO (Energy Expenditure) – Mức độ năng lượng tiêu thụ dựa trên chuyển động, được tính từ ba trục chuyển động X, Y, Z.\n* anglez: Góc quay của đối tượng, có thể liên quan đến vị trí của thiết bị.\n* non-wear_flag: Cờ đánh dấu khi thiết bị không được đeo (0: đeo, 1: không đeo).\n* light: Đo lường mức độ ánh sáng trong môi trường của đối tượng (có thể liên quan đến môi trường ánh sáng mà đối tượng tiếp xúc).\n* battery_voltage: Điện áp của pin thiết bị.\n* time_of_day: Thời gian trong ngày, có thể được đo bằng giây hoặc micro giây kể từ một mốc thời gian (ví dụ, thời gian Unix).\n* weekday: Ngày trong tuần (1 = Thứ Hai, 2 = Thứ Ba, ...).\n* quarter: Quý trong năm (1, 2, 3, 4).\n* relative_date_PCIAT: Ngày và thời gian tuyệt đối của sự kiện, tính từ một mốc thời gian ban đầu.\n","metadata":{}},{"cell_type":"code","source":"def analyze_actigraphy(id, only_one_week=False, small=False):\n    actigraphy = pl.read_parquet(f'/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet/id={id}/part-0.parquet')\n    day = actigraphy.get_column('relative_date_PCIAT') + actigraphy.get_column('time_of_day') / 86400e9\n    sample = train_pl.filter(pl.col('id') == id)\n    age = sample.get_column('Basic_Demos-Age').item()\n    sex = ['boy', 'girl'][sample.get_column('Basic_Demos-Sex').item()]\n    actigraphy = (\n        actigraphy\n        .with_columns(\n            (day.diff() * 86400).alias('diff_seconds'),\n            (np.sqrt(np.square(pl.col('X')) + np.square(pl.col('Y')) + np.square(pl.col('Z'))).alias('norm'))\n        )\n    )\n\n    if only_one_week:\n        start = np.ceil(day.min())\n        mask = (start <= day.to_numpy()) & (day.to_numpy() <= start + 7*3)\n        mask &= ~ actigraphy.get_column('non-wear_flag').cast(bool).to_numpy()\n    else:\n        mask = np.full(len(day), True)\n        \n    if small:\n        timelines = [\n            ('enmo', 'forestgreen'),\n            ('light', 'orange'),\n        ]\n    else:\n        timelines = [\n            ('X', 'm'),\n            ('Y', 'm'),\n            ('Z', 'm'),\n#             ('norm', 'c'),\n            ('enmo', 'forestgreen'),\n            ('anglez', 'lightblue'),\n            ('light', 'orange'),\n            ('non-wear_flag', 'chocolate')\n    #         ('diff_seconds', 'k'),\n        ]\n        \n    _, axs = plt.subplots(len(timelines), 1, sharex=True, figsize=(12, len(timelines) * 1.1 + 0.5))\n    for ax, (feature, color) in zip(axs, timelines):\n        ax.set_facecolor('#eeeeee')\n        ax.scatter(day.to_numpy()[mask],\n                   actigraphy.get_column(feature).to_numpy()[mask],\n                   color=color, label=feature, s=1)\n        ax.legend(loc='upper left', facecolor='#eeeeee')\n        if feature == 'diff_seconds':\n            ax.set_ylim(-0.5, 20.5)\n    axs[-1].set_xlabel('day')\n    axs[-1].xaxis.set_major_locator(MaxNLocator(integer=True))\n    plt.tight_layout()\n    axs[0].set_title(f'id={id}, {sex}, age={age}')\n    plt.show()\n\nanalyze_actigraphy('0417c91e', only_one_week=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:05:01.480904Z","iopub.execute_input":"2024-12-22T16:05:01.481220Z","iopub.status.idle":"2024-12-22T16:05:04.033715Z","shell.execute_reply.started":"2024-12-22T16:05:01.481193Z","shell.execute_reply":"2024-12-22T16:05:04.032646Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport polars as pl\n\n# Hàm tính toán giá trị trung bình của các trường trong mỗi file parquet\ndef calculate_mean_for_parquet(id):\n    # Đọc parquet từ đường dẫn\n    parquet_path = f'/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet/id={id}/part-0.parquet'\n    \n    # Kiểm tra nếu file parquet tồn tại\n    if os.path.exists(parquet_path):\n        actigraphy = pl.read_parquet(parquet_path)\n\n        # Tính ngày từ relative_date_PCIAT và time_of_day\n        day = actigraphy['relative_date_PCIAT'] + actigraphy['time_of_day'] / 86400e9\n        \n        # Tính giá trị trung bình cho các cột yêu cầu\n        means = actigraphy.select([\n            pl.col('step').median().alias('mean_step'),\n            pl.col('X').median().alias('mean_X'),\n            pl.col('Y').median().alias('mean_Y'),\n            pl.col('Z').median().alias('mean_Z'),\n            pl.col('enmo').median().alias('mean_enmo'),\n            pl.col('anglez').median().alias('mean_anglez'),\n            pl.col('non-wear_flag').median().alias('mean_non_wear_flag'),\n            pl.col('light').median().alias('mean_light'),\n            pl.col('battery_voltage').median().alias('mean_battery_voltage'),\n            pl.col('time_of_day').median().alias('mean_time_of_day'),\n            pl.col('weekday').median().alias('mean_weekday'),\n            pl.col('quarter').median().alias('mean_quarter'),\n            pl.col('relative_date_PCIAT').median().alias('mean_relative_date_PCIAT')\n        ])\n\n        # Thêm cột 'id' vào kết quả để dễ dàng nhận diện\n        means = means.with_columns(pl.lit(id).alias('id'))\n        \n        return means\n    else:\n        return None\n\n# Lấy danh sách các id từ cột 'id' trong DataFrame train\nids = train['id'].tolist()  # Sửa lại để dùng Pandas thay vì Polars\n\n# Tính toán giá trị trung bình cho mỗi id và gộp kết quả vào một DataFrame\nall_means = []\n\nfor id in ids:\n    result = calculate_mean_for_parquet(id)\n    if result is not None:\n        all_means.append(result)\n\n# Gộp các kết quả lại thành một DataFrame duy nhất\nif all_means:\n    all_means_df = pl.concat(all_means)\n    print(all_means_df)\nelse:\n    print(\"Không có dữ liệu hợp lệ để gộp.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:07:55.961777Z","iopub.execute_input":"2024-12-22T16:07:55.962228Z","iopub.status.idle":"2024-12-22T16:08:37.550927Z","shell.execute_reply.started":"2024-12-22T16:07:55.962192Z","shell.execute_reply":"2024-12-22T16:08:37.549488Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import polars as pl\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\n\ndef add_sii_and_PCIAT(all_means_df, train):\n    # Kiểm tra nếu DataFrame rỗng\n    if all_means_df.is_empty() or train.empty:\n        print(\"Một trong hai DataFrame (all_means_df hoặc train) là rỗng.\")\n        return None\n\n    # Gộp các cột 'sii' và 'PCIAT-PCIAT_Total' từ train vào all_means_df\n    train_subset = train[['id', 'sii', 'PCIAT-PCIAT_Total']]\n    all_means_df = all_means_df.join(pl.from_pandas(train_subset), on='id', how='left')\n\n    # Kiểm tra xem các cột đã được thêm vào chưa\n    if 'sii' not in all_means_df.columns or 'PCIAT-PCIAT_Total' not in all_means_df.columns:\n        print(\"Không thể thêm cột 'sii' và 'PCIAT-PCIAT_Total' vào DataFrame.\")\n        return None\n\n    return all_means_df\n\n\ndef check_correlation(all_means_df):\n    # Lọc các cột có kiểu dữ liệu số\n    numeric_columns = [\n        col for col in all_means_df.columns if all_means_df[col].dtype in [\n            pl.Float32, pl.Float64, pl.Int32, pl.Int64\n        ]\n    ]\n    if not numeric_columns:\n        print(\"Không có cột số để tính toán độ tương quan.\")\n        return None\n\n    # Chuyển DataFrame sang Pandas để tính toán tương quan\n    all_means_pandas = all_means_df.select(numeric_columns).to_pandas()\n\n    # Tính toán ma trận tương quan\n    corr_matrix = all_means_pandas.corr()\n\n    # # In ra ma trận tương quan\n    # print(\"Ma trận tương quan:\")\n    # print(corr_matrix)\n\n    return corr_matrix\n\n\ndef plot_heatmap(corr_matrix):\n    # Vẽ heatmap nếu ma trận tương quan không rỗng\n    if corr_matrix is not None and not corr_matrix.empty:\n        plt.figure(figsize=(10, 8))\n        sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', vmin=-1, vmax=1)\n        plt.title('Ma trận tương quan')\n        plt.show()\n    else:\n        print(\"Ma trận tương quan rỗng, không thể vẽ heatmap.\")\n\n\n# Kiểm tra và xử lý nếu all_means có dữ liệu\nif all_means:\n    all_means_df = pl.concat(all_means)\n\n    if all_means_df.is_empty():\n        print(\"all_means_df là rỗng sau khi gộp.\")\n    else:\n        # Gộp dữ liệu 'sii' và 'PCIAT-PCIAT_Total' từ DataFrame train\n        all_means_with_sii_PCIAT = add_sii_and_PCIAT(all_means_df, train)\n\n        if all_means_with_sii_PCIAT is not None and not all_means_with_sii_PCIAT.is_empty():\n            # Tính toán ma trận tương quan\n            corr_matrix = check_correlation(all_means_with_sii_PCIAT)\n\n            # Vẽ heatmap từ ma trận tương quan\n            plot_heatmap(corr_matrix)\n        else:\n            print(\"Không có dữ liệu hợp lệ sau khi gộp.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T16:11:02.428716Z","iopub.execute_input":"2024-12-22T16:11:02.429286Z","iopub.status.idle":"2024-12-22T16:11:03.433642Z","shell.execute_reply.started":"2024-12-22T16:11:02.429236Z","shell.execute_reply":"2024-12-22T16:11:03.431846Z"}},"outputs":[],"execution_count":null}]}