{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","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":30761,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import polars as pl\nimport polars.selectors as cs\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter, PercentFormatter\nimport numpy as np\nimport seaborn as sns\nimport lightgbm\nfrom colorama import Fore, Style\nfrom scipy.optimize import minimize\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score, ConfusionMatrixDisplay\n\ntarget_labels = ['None', 'Mild', 'Moderate', 'Severe']","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-12-07T08:11:24.241108Z","iopub.execute_input":"2024-12-07T08:11:24.241494Z","iopub.status.idle":"2024-12-07T08:11:26.916713Z","shell.execute_reply.started":"2024-12-07T08:11:24.241452Z","shell.execute_reply":"2024-12-07T08:11:26.915783Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"season_dtype = pl.Enum(['Spring', 'Summer', 'Fall', 'Winter'])\n\ntrain = (\n    pl.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\n    .with_columns(pl.col('^.*Season$').cast(season_dtype))\n)\n\ntest = (\n    pl.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\n    .with_columns(pl.col('^.*Season$').cast(season_dtype))\n)\n\ntrain","metadata":{"execution":{"iopub.status.busy":"2024-12-07T08:11:26.918563Z","iopub.execute_input":"2024-12-07T08:11:26.919135Z","iopub.status.idle":"2024-12-07T08:11:27.102231Z","shell.execute_reply.started":"2024-12-07T08:11:26.919098Z","shell.execute_reply":"2024-12-07T08:11:27.101122Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\n\ndef analyze_actigraphy(id, only_one_week=False, small=False):\n    file_path = f'/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet/id={id}/part-0.parquet'\n    \n        # ファイルの存在を確認\n    if not os.path.exists(file_path):\n        print(f\"Parquet file for id={id} does not exist.\")\n        return False # 関数を終了\n    \n    try:\n        # パーケットファイルを読み込む\n        actigraphy = pl.read_parquet(file_path)\n    except Exception as e:\n        print(f\"Error reading parquet file for id={id}: {e}\")\n        return False\n    \n    day = actigraphy.get_column('relative_date_PCIAT') + actigraphy.get_column('time_of_day') / 86400e9\n    sample = train.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    internet_use = sample.get_column('PreInt_EduHx-computerinternet_hoursday').item()\n    sii = sample.get_column('sii').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}, Internet Use={internet_use}, sii={sii}' )\n    plt.show()\n    return True\n\nanalyze_actigraphy('0417c91e', only_one_week=False)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-12-07T08:11:27.104205Z","iopub.execute_input":"2024-12-07T08:11:27.104608Z","iopub.status.idle":"2024-12-07T08:11:29.670508Z","shell.execute_reply.started":"2024-12-07T08:11:27.104568Z","shell.execute_reply":"2024-12-07T08:11:29.669382Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 'sii'が3の行から'id'を取得\nids_with_sii_3 = train.filter((pl.col('sii') == 3) | (pl.col('sii') == 2)).get_column('id').unique()","metadata":{"execution":{"iopub.status.busy":"2024-12-07T08:11:29.673100Z","iopub.execute_input":"2024-12-07T08:11:29.673395Z","iopub.status.idle":"2024-12-07T08:11:29.681683Z","shell.execute_reply.started":"2024-12-07T08:11:29.673366Z","shell.execute_reply":"2024-12-07T08:11:29.680280Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 'sii'が3の行から'id'を取得\nids_with_train = train.get_column('id').unique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T08:11:29.682941Z","iopub.execute_input":"2024-12-07T08:11:29.683280Z","iopub.status.idle":"2024-12-07T08:11:29.690568Z","shell.execute_reply.started":"2024-12-07T08:11:29.683226Z","shell.execute_reply":"2024-12-07T08:11:29.689662Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ids_with_sii_3","metadata":{"execution":{"iopub.status.busy":"2024-12-07T08:11:29.691726Z","iopub.execute_input":"2024-12-07T08:11:29.692081Z","iopub.status.idle":"2024-12-07T08:11:29.703240Z","shell.execute_reply.started":"2024-12-07T08:11:29.692052Z","shell.execute_reply":"2024-12-07T08:11:29.702314Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 新しい列を初期化（すべての値を0に設定）\ntrain = train.with_columns(pl.lit(0).alias(\"actigraphy_data\"))\n\n# 各 `id` に対して関数を実行して列を更新\nfor id in ids_with_train:\n    result = analyze_actigraphy(id, only_one_week=False)\n    if result:\n        # `id` に対応する行の `new_column` を 1 に更新\n        train = train.with_columns(\n            pl.when(pl.col('id') == id)\n              .then(1)\n              .otherwise(pl.col(\"actigraphy_data\"))\n              .alias(\"actigraphy_data\")\n        )","metadata":{"execution":{"iopub.status.busy":"2024-12-07T08:11:29.704507Z","iopub.execute_input":"2024-12-07T08:11:29.704817Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport polars as pl\nimport matplotlib.pyplot as plt\n\n# 仮の Polars DataFrame\n# train = pl.DataFrame(...)\n\n# actigraphy_data が 1 のデータをフィルタ\nfiltered_data = train.filter(pl.col(\"actigraphy_data\") == 1)\n\n# sii 列の分布をカウント\nsii_distribution = (\n    filtered_data\n    .group_by(\"sii\")\n    .agg(pl.col(\"sii\").count().alias(\"count\"))\n)\n\n# Pandas DataFrame に変換して可視化の準備\nsii_distribution_df = sii_distribution.to_pandas()\n\n# 可視化\nplt.bar(sii_distribution_df[\"sii\"], sii_distribution_df[\"count\"])\nplt.title(\"Distribution of 'sii' where actigraphy_data = 1\")\nplt.xlabel(\"sii\")\nplt.ylabel(\"Count\")\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# # 'sii'が0または1の行から'id'を取得\n# ids_with_sii_0_or_1 = train.filter((pl.col('sii') == 0) | (pl.col('sii') == 1)).get_column('id').unique()\n\n# # 各'id'に対してanalyze_actigraphyを実行\n# for id in ids_with_sii_0_or_1:\n#     analyze_actigraphy(id, only_one_week=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}