{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.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":84493,"databundleVersionId":11305158,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **기본설정**","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport polars as pl\nfrom matplotlib import pyplot as plt\nfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter, PercentFormatter\nimport seaborn as sns\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-17T12:09:31.170064Z","iopub.execute_input":"2025-09-17T12:09:31.170506Z","iopub.status.idle":"2025-09-17T12:09:33.375136Z","shell.execute_reply.started":"2025-09-17T12:09:31.170476Z","shell.execute_reply":"2025-09-17T12:09:33.373567Z"}},"outputs":[{"name":"stdout","text":"/kaggle/input/jane-street-real-time-market-data-forecasting/responders.csv\n/kaggle/input/jane-street-real-time-market-data-forecasting/sample_submission.csv\n/kaggle/input/jane-street-real-time-market-data-forecasting/features.csv\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=4/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=5/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=6/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=3/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=1/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=8/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=2/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=0/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=7/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id=9/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/lags.parquet/date_id=0/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/test.parquet/date_id=0/part-0.parquet\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/jane_street_gateway.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/jane_street_inference_server.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/__init__.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/templates.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/base_gateway.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/relay.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/kaggle_evaluation.proto\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/__init__.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/generated/kaggle_evaluation_pb2.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/generated/kaggle_evaluation_pb2_grpc.py\n/kaggle/input/jane-street-real-time-market-data-forecasting/kaggle_evaluation/core/generated/__init__.py\n","output_type":"stream"}],"execution_count":1},{"cell_type":"markdown","source":"# **데이터 로드**","metadata":{}},{"cell_type":"code","source":"ROOT_DIR = \"/kaggle/input/jane-street-real-time-market-data-forecasting\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-17T12:09:41.914901Z","iopub.execute_input":"2025-09-17T12:09:41.915258Z","iopub.status.idle":"2025-09-17T12:09:41.919854Z","shell.execute_reply.started":"2025-09-17T12:09:41.915232Z","shell.execute_reply":"2025-09-17T12:09:41.918904Z"}},"outputs":[],"execution_count":3},{"cell_type":"code","source":"ROOT_DIR = \"/kaggle/input/jane-street-real-time-market-data-forecasting\"\n\n# === 경로 ===\ntrain_path = os.path.join(ROOT_DIR, \"train.parquet\")\n\n# === 메타데이터 ===\nlags = os.path.join(ROOT_DIR, \"lags.parquet\")\ntrain_path = os.path.join(ROOT_DIR, \"train.parquet\")\nlags_path  = os.path.join(ROOT_DIR, \"lags.parquet\")\nfeatures   = pl.read_csv(os.path.join(ROOT_DIR, \"features.csv\"))\nresponders = pl.read_csv(os.path.join(ROOT_DIR, \"responders.csv\"))\nsample_sub = pl.read_csv(os.path.join(ROOT_DIR, \"sample_submission.csv\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-17T12:09:43.755716Z","iopub.execute_input":"2025-09-17T12:09:43.75613Z","iopub.status.idle":"2025-09-17T12:09:43.989761Z","shell.execute_reply.started":"2025-09-17T12:09:43.756101Z","shell.execute_reply":"2025-09-17T12:09:43.988571Z"}},"outputs":[],"execution_count":4},{"cell_type":"markdown","source":"# **데이터 전처리(1)**","metadata":{}},{"cell_type":"code","source":"import os\nimport polars as pl\n\nROOT_DIR = \"/kaggle/input/jane-street-real-time-market-data-forecasting\"\n\n# -----------------------------\n# 1) train: 파티션 0~5만 로드\n# -----------------------------\nscan_list = []\nfor pid in range(6):  # 0~5만\n    f = os.path.join(ROOT_DIR, \"train.parquet\", f\"partition_id={pid}\", \"part-0.parquet\")\n    lf = pl.scan_parquet(f).with_columns(pl.lit(pid).alias(\"partition_id\"))\n    scan_list.append(lf)\n\ntrain_all_lf = pl.concat(scan_list, how=\"vertical_relaxed\")\n\ntcols        = train_all_lf.collect_schema().names()\nbase_cols    = [c for c in [\"date_id\",\"time_id\",\"symbol_id\",\"weight\",\"partition_id\"] if c in tcols]\nfeature_cols = sorted([c for c in tcols if c.startswith(\"feature_\")])\ntarget_cols  = [\"responder_6\"] if \"responder_6\" in tcols else []\n\n# responder_6만 남김 (y alias 제거)\nraw_data_lf = train_all_lf.select(base_cols + feature_cols + target_cols)\n\n# -----------------------------\n# 2) lags: 단일 파일(기본) + 예외적으로 파티션일 수도 있어 자동대응\n# -----------------------------\nlags_file = os.path.join(ROOT_DIR, \"lags.parquet\")  # 단일 파일일 때\nlags_part_glob = os.path.join(ROOT_DIR, \"lags.parquet\", \"date_id=*\", \"part-0.parquet\")  # 파티션일 때\n\n# 단일 파일 우선 시도, 실패하면 파티션으로\ntry:\n    lags_lf = pl.scan_parquet(lags_file).select(\n        [\"date_id\",\"time_id\",\"symbol_id\",\"responder_6_lag_1\"]\n    )\nexcept Exception:\n    lags_lf = pl.scan_parquet(lags_part_glob).select(\n        [\"date_id\",\"time_id\",\"symbol_id\",\"responder_6_lag_1\"]\n    )\n\n# -----------------------------\n# 3) join + 정렬 (lag 인덱스 기준: date_id, time_id, symbol_id)\n# -----------------------------\njoined_lf = (\n    raw_data_lf\n    .join(lags_lf, on=[\"date_id\",\"time_id\",\"symbol_id\"], how=\"left\")\n    .sort([\"date_id\",\"time_id\",\"symbol_id\"])\n)\n\nfinal_cols = base_cols + feature_cols + [\"responder_6\",\"responder_6_lag_1\"]\nraw_with_lag_lf = joined_lf.select([c for c in final_cols if c in joined_lf.collect_schema().names()])\n\n# -----------------------------\n# 4) split: 0~3 train / 4~5 test\n# -----------------------------\ntrain_lf = raw_with_lag_lf.filter(pl.col(\"partition_id\") <= 3)\ntest_lf  = raw_with_lag_lf.filter((pl.col(\"partition_id\") >= 4) & (pl.col(\"partition_id\") <= 5))\n\n# 확인\ndisplay(train_lf.head(5).collect())\ndisplay(test_lf.head(5).collect())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-17T12:09:47.375319Z","iopub.execute_input":"2025-09-17T12:09:47.375702Z","iopub.status.idle":"2025-09-17T12:10:32.199298Z","shell.execute_reply.started":"2025-09-17T12:09:47.375666Z","shell.execute_reply":"2025-09-17T12:10:32.197958Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"shape: (5, 86)\n┌─────────┬─────────┬───────────┬──────────┬───┬────────────┬────────────┬────────────┬────────────┐\n│ date_id ┆ time_id ┆ symbol_id ┆ weight   ┆ … ┆ feature_77 ┆ feature_78 ┆ responder_ ┆ responder_ │\n│ ---     ┆ ---     ┆ ---       ┆ ---      ┆   ┆ ---        ┆ ---        ┆ 6          ┆ 6_lag_1    │\n│ i16     ┆ i16     ┆ i8        ┆ f32      ┆   ┆ f32        ┆ f32        ┆ ---        ┆ ---        │\n│         ┆         ┆           ┆          ┆   ┆            ┆            ┆ f32        ┆ f32        │\n╞═════════╪═════════╪═══════════╪══════════╪═══╪════════════╪════════════╪════════════╪════════════╡\n│ 0       ┆ 0       ┆ 1         ┆ 3.889038 ┆ … ┆ -0.335556  ┆ -0.281498  ┆ 0.775981   ┆ -1.162801  │\n│ 0       ┆ 0       ┆ 7         ┆ 1.370613 ┆ … ┆ -0.245565  ┆ -0.302441  ┆ 0.703665   ┆ -0.492168  │\n│ 0       ┆ 0       ┆ 9         ┆ 2.285698 ┆ … ┆ -0.106842  ┆ -0.096792  ┆ 2.109352   ┆ -0.716492  │\n│ 0       ┆ 0       ┆ 10        ┆ 0.690606 ┆ … ┆ -0.215522  ┆ -0.296244  ┆ 1.114137   ┆ -0.263427  │\n│ 0       ┆ 0       ┆ 14        ┆ 0.44057  ┆ … ┆ 2.61825    ┆ 3.418133   ┆ -3.57282   ┆ -0.507432  │\n└─────────┴─────────┴───────────┴──────────┴───┴────────────┴────────────┴────────────┴────────────┘","text/html":"<div><style>\n.dataframe > thead > tr,\n.dataframe > tbody > tr {\n  text-align: right;\n  white-space: pre-wrap;\n}\n</style>\n<small>shape: (5, 86)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>date_id</th><th>time_id</th><th>symbol_id</th><th>weight</th><th>partition_id</th><th>feature_00</th><th>feature_01</th><th>feature_02</th><th>feature_03</th><th>feature_04</th><th>feature_05</th><th>feature_06</th><th>feature_07</th><th>feature_08</th><th>feature_09</th><th>feature_10</th><th>feature_11</th><th>feature_12</th><th>feature_13</th><th>feature_14</th><th>feature_15</th><th>feature_16</th><th>feature_17</th><th>feature_18</th><th>feature_19</th><th>feature_20</th><th>feature_21</th><th>feature_22</th><th>feature_23</th><th>feature_24</th><th>feature_25</th><th>feature_26</th><th>feature_27</th><th>feature_28</th><th>feature_29</th><th>feature_30</th><th>feature_31</th><th>&hellip;</th><th>feature_44</th><th>feature_45</th><th>feature_46</th><th>feature_47</th><th>feature_48</th><th>feature_49</th><th>feature_50</th><th>feature_51</th><th>feature_52</th><th>feature_53</th><th>feature_54</th><th>feature_55</th><th>feature_56</th><th>feature_57</th><th>feature_58</th><th>feature_59</th><th>feature_60</th><th>feature_61</th><th>feature_62</th><th>feature_63</th><th>feature_64</th><th>feature_65</th><th>feature_66</th><th>feature_67</th><th>feature_68</th><th>feature_69</th><th>feature_70</th><th>feature_71</th><th>feature_72</th><th>feature_73</th><th>feature_74</th><th>feature_75</th><th>feature_76</th><th>feature_77</th><th>feature_78</th><th>responder_6</th><th>responder_6_lag_1</th></tr><tr><td>i16</td><td>i16</td><td>i8</td><td>f32</td><td>i32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>i8</td><td>i8</td><td>i16</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>&hellip;</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td></tr></thead><tbody><tr><td>0</td><td>0</td><td>1</td><td>3.889038</td><td>0</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>0.851033</td><td>0.242971</td><td>0.2634</td><td>-0.891687</td><td>11</td><td>7</td><td>76</td><td>-0.883028</td><td>0.003067</td><td>-0.744703</td><td>null</td><td>-0.169586</td><td>null</td><td>-1.335938</td><td>-1.707803</td><td>0.91013</td><td>null</td><td>1.636431</td><td>1.522133</td><td>-1.551398</td><td>-0.229627</td><td>null</td><td>null</td><td>1.378301</td><td>-0.283712</td><td>0.123196</td><td>null</td><td>&hellip;</td><td>null</td><td>null</td><td>null</td><td>0.564021</td><td>2.088506</td><td>0.832022</td><td>null</td><td>0.204797</td><td>null</td><td>null</td><td>-0.808103</td><td>null</td><td>-2.037683</td><td>0.727661</td><td>null</td><td>-0.989118</td><td>-0.345213</td><td>-1.36224</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-1.251104</td><td>-0.110252</td><td>-0.491157</td><td>-1.02269</td><td>0.152241</td><td>-0.659864</td><td>null</td><td>null</td><td>-0.261412</td><td>-0.211486</td><td>-0.335556</td><td>-0.281498</td><td>0.775981</td><td>-1.162801</td></tr><tr><td>0</td><td>0</td><td>7</td><td>1.370613</td><td>0</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>0.676961</td><td>0.151984</td><td>0.192465</td><td>-0.521729</td><td>11</td><td>7</td><td>76</td><td>-0.865307</td><td>-0.225629</td><td>-0.582163</td><td>null</td><td>0.317467</td><td>null</td><td>-1.250016</td><td>-1.682929</td><td>1.412757</td><td>null</td><td>0.520378</td><td>0.744132</td><td>-0.788658</td><td>0.641776</td><td>null</td><td>null</td><td>0.2272</td><td>0.580907</td><td>1.128879</td><td>null</td><td>&hellip;</td><td>null</td><td>null</td><td>null</td><td>-10.835207</td><td>-0.002704</td><td>-0.621836</td><td>null</td><td>1.172836</td><td>null</td><td>null</td><td>-1.625862</td><td>null</td><td>-1.410017</td><td>1.063013</td><td>null</td><td>0.888355</td><td>0.467994</td><td>-1.36224</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-1.065759</td><td>0.013322</td><td>-0.592855</td><td>-1.052685</td><td>-0.393726</td><td>-0.741603</td><td>null</td><td>null</td><td>-0.281207</td><td>-0.182894</td><td>-0.245565</td><td>-0.302441</td><td>0.703665</td><td>-0.492168</td></tr><tr><td>0</td><td>0</td><td>9</td><td>2.285698</td><td>0</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>1.056285</td><td>0.187227</td><td>0.249901</td><td>-0.77305</td><td>11</td><td>7</td><td>76</td><td>-0.675719</td><td>-0.199404</td><td>-0.586798</td><td>null</td><td>-0.814909</td><td>null</td><td>-1.296782</td><td>-2.040234</td><td>0.639589</td><td>null</td><td>1.597359</td><td>0.657514</td><td>-1.350148</td><td>0.364215</td><td>null</td><td>null</td><td>-0.017751</td><td>-0.317361</td><td>-0.122379</td><td>null</td><td>&hellip;</td><td>null</td><td>null</td><td>null</td><td>-1.420632</td><td>-3.515137</td><td>-4.67776</td><td>null</td><td>0.535897</td><td>null</td><td>null</td><td>-0.72542</td><td>null</td><td>-2.29417</td><td>1.764551</td><td>null</td><td>-0.120789</td><td>-0.063458</td><td>-1.36224</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-0.882604</td><td>-0.072482</td><td>-0.617934</td><td>-0.86323</td><td>-0.241892</td><td>-0.709919</td><td>null</td><td>null</td><td>0.377131</td><td>0.300724</td><td>-0.106842</td><td>-0.096792</td><td>2.109352</td><td>-0.716492</td></tr><tr><td>0</td><td>0</td><td>10</td><td>0.690606</td><td>0</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>1.139366</td><td>0.273328</td><td>0.306549</td><td>-1.262223</td><td>42</td><td>5</td><td>150</td><td>-0.694008</td><td>3.004091</td><td>0.114809</td><td>null</td><td>-0.251882</td><td>null</td><td>-1.902009</td><td>-0.979447</td><td>0.241165</td><td>null</td><td>-0.392359</td><td>-0.224699</td><td>-2.129397</td><td>-0.855287</td><td>null</td><td>null</td><td>0.404142</td><td>-0.578156</td><td>0.105702</td><td>null</td><td>&hellip;</td><td>null</td><td>null</td><td>null</td><td>0.382074</td><td>2.669135</td><td>0.611711</td><td>null</td><td>2.413415</td><td>null</td><td>null</td><td>1.313203</td><td>null</td><td>-0.810125</td><td>2.939022</td><td>null</td><td>3.988801</td><td>1.834661</td><td>-1.36224</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-0.697595</td><td>1.074309</td><td>-0.206929</td><td>-0.530602</td><td>4.765215</td><td>0.571554</td><td>null</td><td>null</td><td>-0.226891</td><td>-0.251412</td><td>-0.215522</td><td>-0.296244</td><td>1.114137</td><td>-0.263427</td></tr><tr><td>0</td><td>0</td><td>14</td><td>0.44057</td><td>0</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>0.9552</td><td>0.262404</td><td>0.344457</td><td>-0.613813</td><td>44</td><td>3</td><td>16</td><td>-0.947351</td><td>-0.030018</td><td>-0.502379</td><td>null</td><td>0.646086</td><td>null</td><td>-1.844685</td><td>-1.58656</td><td>-0.182024</td><td>null</td><td>-0.969949</td><td>-0.673813</td><td>-1.282132</td><td>-1.399894</td><td>null</td><td>null</td><td>0.043815</td><td>-0.320225</td><td>-0.031713</td><td>null</td><td>&hellip;</td><td>null</td><td>null</td><td>null</td><td>-2.0146</td><td>-2.321076</td><td>-3.711265</td><td>null</td><td>1.253902</td><td>null</td><td>null</td><td>0.476195</td><td>null</td><td>-0.771732</td><td>2.843421</td><td>null</td><td>1.379815</td><td>0.411827</td><td>-1.36224</td><td>null</td><td>null</td><td>null</td><td>null</td><td>null</td><td>-0.948601</td><td>-0.136814</td><td>-0.447704</td><td>-1.141761</td><td>0.099631</td><td>-0.661928</td><td>null</td><td>null</td><td>3.678076</td><td>2.793581</td><td>2.61825</td><td>3.418133</td><td>-3.57282</td><td>-0.507432</td></tr></tbody></table></div>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"shape: (5, 86)\n┌─────────┬─────────┬───────────┬──────────┬───┬────────────┬────────────┬────────────┬────────────┐\n│ date_id ┆ time_id ┆ symbol_id ┆ weight   ┆ … ┆ feature_77 ┆ feature_78 ┆ responder_ ┆ responder_ │\n│ ---     ┆ ---     ┆ ---       ┆ ---      ┆   ┆ ---        ┆ ---        ┆ 6          ┆ 6_lag_1    │\n│ i16     ┆ i16     ┆ i8        ┆ f32      ┆   ┆ f32        ┆ f32        ┆ ---        ┆ ---        │\n│         ┆         ┆           ┆          ┆   ┆            ┆            ┆ f32        ┆ f32        │\n╞═════════╪═════════╪═══════════╪══════════╪═══╪════════════╪════════════╪════════════╪════════════╡\n│ 680     ┆ 0       ┆ 0         ┆ 2.29816  ┆ … ┆ -0.178144  ┆ -0.1951    ┆ 0.929775   ┆ null       │\n│ 680     ┆ 0       ┆ 1         ┆ 3.928745 ┆ … ┆ -0.266495  ┆ -0.470271  ┆ 0.826995   ┆ null       │\n│ 680     ┆ 0       ┆ 2         ┆ 1.340433 ┆ … ┆ 0.198109   ┆ 0.152837   ┆ -0.296969  ┆ null       │\n│ 680     ┆ 0       ┆ 3         ┆ 1.695526 ┆ … ┆ 9.818627   ┆ 11.179185  ┆ 2.047506   ┆ null       │\n│ 680     ┆ 0       ┆ 5         ┆ 2.700766 ┆ … ┆ -0.700707  ┆ -0.770234  ┆ 0.103898   ┆ null       │\n└─────────┴─────────┴───────────┴──────────┴───┴────────────┴────────────┴────────────┴────────────┘","text/html":"<div><style>\n.dataframe > thead > tr,\n.dataframe > tbody > tr {\n  text-align: right;\n  white-space: pre-wrap;\n}\n</style>\n<small>shape: (5, 86)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>date_id</th><th>time_id</th><th>symbol_id</th><th>weight</th><th>partition_id</th><th>feature_00</th><th>feature_01</th><th>feature_02</th><th>feature_03</th><th>feature_04</th><th>feature_05</th><th>feature_06</th><th>feature_07</th><th>feature_08</th><th>feature_09</th><th>feature_10</th><th>feature_11</th><th>feature_12</th><th>feature_13</th><th>feature_14</th><th>feature_15</th><th>feature_16</th><th>feature_17</th><th>feature_18</th><th>feature_19</th><th>feature_20</th><th>feature_21</th><th>feature_22</th><th>feature_23</th><th>feature_24</th><th>feature_25</th><th>feature_26</th><th>feature_27</th><th>feature_28</th><th>feature_29</th><th>feature_30</th><th>feature_31</th><th>&hellip;</th><th>feature_44</th><th>feature_45</th><th>feature_46</th><th>feature_47</th><th>feature_48</th><th>feature_49</th><th>feature_50</th><th>feature_51</th><th>feature_52</th><th>feature_53</th><th>feature_54</th><th>feature_55</th><th>feature_56</th><th>feature_57</th><th>feature_58</th><th>feature_59</th><th>feature_60</th><th>feature_61</th><th>feature_62</th><th>feature_63</th><th>feature_64</th><th>feature_65</th><th>feature_66</th><th>feature_67</th><th>feature_68</th><th>feature_69</th><th>feature_70</th><th>feature_71</th><th>feature_72</th><th>feature_73</th><th>feature_74</th><th>feature_75</th><th>feature_76</th><th>feature_77</th><th>feature_78</th><th>responder_6</th><th>responder_6_lag_1</th></tr><tr><td>i16</td><td>i16</td><td>i8</td><td>f32</td><td>i32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>i8</td><td>i8</td><td>i16</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>&hellip;</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td></tr></thead><tbody><tr><td>680</td><td>0</td><td>0</td><td>2.29816</td><td>4</td><td>0.851814</td><td>1.197591</td><td>0.219422</td><td>0.411698</td><td>2.057359</td><td>-0.542597</td><td>-3.4331</td><td>-1.090165</td><td>0.151888</td><td>11</td><td>7</td><td>76</td><td>-0.97142</td><td>0.670215</td><td>-0.502896</td><td>null</td><td>-0.070096</td><td>null</td><td>-1.308236</td><td>-2.120128</td><td>1.747068</td><td>-0.219661</td><td>0.791602</td><td>0.114922</td><td>-0.311672</td><td>0.156548</td><td>1.476346</td><td>1.301341</td><td>1.235173</td><td>-0.259882</td><td>-0.30125</td><td>-0.264237</td><td>&hellip;</td><td>null</td><td>-1.543409</td><td>0.809453</td><td>-2.679432</td><td>-1.730216</td><td>-1.349158</td><td>null</td><td>0.322135</td><td>null</td><td>null</td><td>-2.273168</td><td>null</td><td>-1.627507</td><td>1.155271</td><td>null</td><td>-3.847984</td><td>-2.230864</td><td>-0.171579</td><td>-0.273791</td><td>-0.301876</td><td>-0.432933</td><td>-1.215778</td><td>-1.670469</td><td>-0.637963</td><td>0.803874</td><td>-0.21269</td><td>-0.764702</td><td>0.435278</td><td>-0.619145</td><td>null</td><td>null</td><td>-0.021034</td><td>-0.045094</td><td>-0.178144</td><td>-0.1951</td><td>0.929775</td><td>null</td></tr><tr><td>680</td><td>0</td><td>1</td><td>3.928745</td><td>4</td><td>0.534441</td><td>1.07974</td><td>0.038748</td><td>0.275343</td><td>2.135057</td><td>-0.541966</td><td>-2.774344</td><td>-1.048089</td><td>0.163768</td><td>11</td><td>7</td><td>76</td><td>-0.873847</td><td>1.794426</td><td>-0.226819</td><td>null</td><td>-0.328627</td><td>null</td><td>-0.870575</td><td>-1.204292</td><td>0.935869</td><td>-0.064365</td><td>1.273109</td><td>0.752816</td><td>-0.062281</td><td>0.687036</td><td>0.546603</td><td>1.229373</td><td>1.535235</td><td>-0.483758</td><td>-0.431013</td><td>-0.058963</td><td>&hellip;</td><td>null</td><td>-1.687322</td><td>1.475159</td><td>-0.946082</td><td>-0.245348</td><td>-0.320477</td><td>null</td><td>0.505224</td><td>null</td><td>null</td><td>-1.074216</td><td>null</td><td>-1.909605</td><td>1.566016</td><td>null</td><td>-1.044804</td><td>-0.807186</td><td>-0.171579</td><td>-0.466983</td><td>-0.250124</td><td>-0.342297</td><td>-1.896279</td><td>-2.157645</td><td>-0.698755</td><td>1.743311</td><td>-0.069648</td><td>-0.933445</td><td>1.653637</td><td>-0.348816</td><td>null</td><td>null</td><td>-0.154413</td><td>-0.301091</td><td>-0.266495</td><td>-0.470271</td><td>0.826995</td><td>null</td></tr><tr><td>680</td><td>0</td><td>2</td><td>1.340433</td><td>4</td><td>-0.227643</td><td>0.764146</td><td>-0.243349</td><td>0.247027</td><td>2.347248</td><td>-0.478477</td><td>-2.660244</td><td>-1.261613</td><td>0.234425</td><td>81</td><td>2</td><td>59</td><td>-0.952889</td><td>-0.04806</td><td>-0.791763</td><td>null</td><td>-0.140953</td><td>null</td><td>-1.691419</td><td>-2.242023</td><td>-0.459649</td><td>-0.241993</td><td>-0.47108</td><td>-1.056603</td><td>-0.387841</td><td>-0.408962</td><td>0.359514</td><td>0.707161</td><td>0.669771</td><td>-0.641928</td><td>-0.645097</td><td>-0.362472</td><td>&hellip;</td><td>null</td><td>-0.339884</td><td>1.743191</td><td>-1.415999</td><td>7.039961</td><td>2.292301</td><td>null</td><td>2.115924</td><td>null</td><td>null</td><td>0.095438</td><td>null</td><td>-0.664823</td><td>2.016616</td><td>null</td><td>2.085358</td><td>0.690842</td><td>-0.171579</td><td>0.022096</td><td>-0.018111</td><td>-0.015769</td><td>-2.270972</td><td>-1.826189</td><td>-0.908704</td><td>-0.051331</td><td>-0.658539</td><td>-1.011692</td><td>-0.008993</td><td>-0.363811</td><td>null</td><td>null</td><td>1.677642</td><td>1.705228</td><td>0.198109</td><td>0.152837</td><td>-0.296969</td><td>null</td></tr><tr><td>680</td><td>0</td><td>3</td><td>1.695526</td><td>4</td><td>0.267686</td><td>1.193612</td><td>-0.388798</td><td>0.030673</td><td>2.175273</td><td>-0.408371</td><td>-1.859344</td><td>-0.771972</td><td>0.104885</td><td>4</td><td>3</td><td>11</td><td>-1.005184</td><td>0.546772</td><td>-0.587481</td><td>null</td><td>-0.628245</td><td>null</td><td>-1.243775</td><td>-2.907238</td><td>-0.098398</td><td>0.004987</td><td>-0.320296</td><td>-1.193256</td><td>1.260476</td><td>1.621998</td><td>-0.255902</td><td>-1.644356</td><td>-1.292619</td><td>-0.541355</td><td>-0.703121</td><td>0.00681</td><td>&hellip;</td><td>null</td><td>-1.533141</td><td>1.750444</td><td>0.208898</td><td>-0.322515</td><td>0.188045</td><td>null</td><td>-0.442253</td><td>null</td><td>null</td><td>-1.021894</td><td>null</td><td>-3.088617</td><td>1.440495</td><td>null</td><td>0.19264</td><td>0.270458</td><td>-0.171579</td><td>-0.387987</td><td>-0.30065</td><td>-0.169365</td><td>-1.324387</td><td>-2.20877</td><td>-0.975838</td><td>0.605086</td><td>-0.303872</td><td>-1.071495</td><td>0.445026</td><td>-0.465118</td><td>null</td><td>null</td><td>3.820025</td><td>4.335268</td><td>9.818627</td><td>11.179185</td><td>2.047506</td><td>null</td></tr><tr><td>680</td><td>0</td><td>5</td><td>2.700766</td><td>4</td><td>0.952372</td><td>0.861269</td><td>-0.375405</td><td>0.259099</td><td>2.497325</td><td>-0.618828</td><td>-2.754378</td><td>-0.479992</td><td>0.108627</td><td>2</td><td>10</td><td>171</td><td>-0.892601</td><td>0.207765</td><td>-0.420839</td><td>null</td><td>-0.522783</td><td>null</td><td>-1.711776</td><td>-2.078692</td><td>0.163208</td><td>0.023584</td><td>0.598875</td><td>-0.497226</td><td>0.231989</td><td>1.630302</td><td>-1.233744</td><td>-0.434498</td><td>0.37159</td><td>-0.586595</td><td>-0.512672</td><td>0.017691</td><td>&hellip;</td><td>null</td><td>-1.078132</td><td>2.067645</td><td>-0.571223</td><td>-0.124274</td><td>-0.282079</td><td>null</td><td>1.003178</td><td>null</td><td>null</td><td>-0.92965</td><td>null</td><td>-1.621122</td><td>1.520507</td><td>null</td><td>-0.532552</td><td>-0.482004</td><td>-0.171579</td><td>-0.164008</td><td>-0.194068</td><td>-0.257875</td><td>-1.623473</td><td>-1.959616</td><td>-0.748592</td><td>0.022282</td><td>-0.561959</td><td>-0.995984</td><td>0.385183</td><td>-0.312552</td><td>null</td><td>null</td><td>-0.552556</td><td>-0.460608</td><td>-0.700707</td><td>-0.770234</td><td>0.103898</td><td>null</td></tr></tbody></table></div>"},"metadata":{}}],"execution_count":5},{"cell_type":"markdown","source":"***x,y로 나누는 것 아직 안함***","metadata":{}},{"cell_type":"code","source":"# === 1) 결측률 확인 (train 기준) ===\n# 대상 컬럼: feature_cols (+ 원하면 lag 포함)\nfeature_cols_in_train = [c for c in feature_cols if c in train_lf.collect_schema().names()]\ninclude_lag = \"responder_6_lag_1\" in train_lf.collect_schema().names()\ncheck_cols = feature_cols_in_train + ([\"responder_6_lag_1\"] if include_lag else [])\n\n# 전체 행 수\nn_rows = train_lf.select(pl.len()).collect().item()\n\n# 각 컬럼별 null 개수 집계 → melt → 결측률 계산\nmissing_rate_df = (\n    train_lf\n    .select([pl.col(c).is_null().sum().alias(c) for c in check_cols])\n    .collect()\n    .melt(variable_name=\"column\", value_name=\"nulls\")\n    .with_columns(\n        pl.lit(n_rows).alias(\"rows\"),\n        (pl.col(\"nulls\") / pl.lit(n_rows)).alias(\"missing_rate\")\n    )\n    .sort(\"missing_rate\", descending=True)\n)\n\n# 상위 몇 개 확인\nprint(\"총 행수:\", n_rows)\nprint(\"컬럼별 결측률 top 20\")\ndisplay(missing_rate_df.head(20))\n\npl.Config.set_tbl_rows(200)  # 최대 200행까지 출력\ndisplay(missing_rate_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-17T12:11:38.762801Z","iopub.execute_input":"2025-09-17T12:11:38.764131Z","iopub.status.idle":"2025-09-17T12:11:49.798255Z","shell.execute_reply.started":"2025-09-17T12:11:38.764085Z","shell.execute_reply":"2025-09-17T12:11:49.797344Z"}},"outputs":[{"name":"stdout","text":"총 행수: 11802114\n컬럼별 결측률 top 20\n","output_type":"stream"},{"name":"stderr","text":"/tmp/ipykernel_36/2593423922.py:15: DeprecationWarning: `DataFrame.melt` is deprecated. Use `unpivot` instead, with `index` instead of `id_vars` and `on` instead of `value_vars`\n  .melt(variable_name=\"column\", value_name=\"nulls\")\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"shape: (20, 4)\n┌───────────────────┬──────────┬──────────┬──────────────┐\n│ column            ┆ nulls    ┆ rows     ┆ missing_rate │\n│ ---               ┆ ---      ┆ ---      ┆ ---          │\n│ str               ┆ u32      ┆ i32      ┆ f64          │\n╞═══════════════════╪══════════╪══════════╪══════════════╡\n│ responder_6_lag_1 ┆ 11802106 ┆ 11802114 ┆ 0.999999     │\n│ feature_21        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ feature_26        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ feature_27        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ feature_31        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ …                 ┆ …        ┆ …        ┆ …            │\n│ feature_44        ┆ 435922   ┆ 11802114 ┆ 0.036936     │\n│ feature_52        ┆ 388024   ┆ 11802114 ┆ 0.032877     │\n│ feature_55        ┆ 388024   ┆ 11802114 ┆ 0.032877     │\n│ feature_15        ┆ 333462   ┆ 11802114 ┆ 0.028254     │\n│ feature_45        ┆ 306677   ┆ 11802114 ┆ 0.025985     │\n└───────────────────┴──────────┴──────────┴──────────────┘","text/html":"<div><style>\n.dataframe > thead > tr,\n.dataframe > tbody > tr {\n  text-align: right;\n  white-space: pre-wrap;\n}\n</style>\n<small>shape: (20, 4)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>column</th><th>nulls</th><th>rows</th><th>missing_rate</th></tr><tr><td>str</td><td>u32</td><td>i32</td><td>f64</td></tr></thead><tbody><tr><td>&quot;responder_6_lag_1&quot;</td><td>11802106</td><td>11802114</td><td>0.999999</td></tr><tr><td>&quot;feature_21&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&quot;feature_26&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&quot;feature_27&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&quot;feature_31&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>&quot;feature_44&quot;</td><td>435922</td><td>11802114</td><td>0.036936</td></tr><tr><td>&quot;feature_52&quot;</td><td>388024</td><td>11802114</td><td>0.032877</td></tr><tr><td>&quot;feature_55&quot;</td><td>388024</td><td>11802114</td><td>0.032877</td></tr><tr><td>&quot;feature_15&quot;</td><td>333462</td><td>11802114</td><td>0.028254</td></tr><tr><td>&quot;feature_45&quot;</td><td>306677</td><td>11802114</td><td>0.025985</td></tr></tbody></table></div>"},"metadata":{}}],"execution_count":6},{"cell_type":"code","source":"# null 비율 확인하기\n\npl.Config.set_tbl_rows(200)  # 최대 200행까지 출력\ndisplay(missing_rate_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-17T12:13:24.982917Z","iopub.execute_input":"2025-09-17T12:13:24.983329Z","iopub.status.idle":"2025-09-17T12:13:24.996762Z","shell.execute_reply.started":"2025-09-17T12:13:24.983298Z","shell.execute_reply":"2025-09-17T12:13:24.995515Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"shape: (80, 4)\n┌───────────────────┬──────────┬──────────┬──────────────┐\n│ column            ┆ nulls    ┆ rows     ┆ missing_rate │\n│ ---               ┆ ---      ┆ ---      ┆ ---          │\n│ str               ┆ u32      ┆ i32      ┆ f64          │\n╞═══════════════════╪══════════╪══════════╪══════════════╡\n│ responder_6_lag_1 ┆ 11802106 ┆ 11802114 ┆ 0.999999     │\n│ feature_21        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ feature_26        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ feature_27        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ feature_31        ┆ 8212377  ┆ 11802114 ┆ 0.695839     │\n│ feature_00        ┆ 3182052  ┆ 11802114 ┆ 0.269617     │\n│ feature_01        ┆ 3182052  ┆ 11802114 ┆ 0.269617     │\n│ feature_02        ┆ 3182052  ┆ 11802114 ┆ 0.269617     │\n│ feature_03        ┆ 3182052  ┆ 11802114 ┆ 0.269617     │\n│ feature_04        ┆ 3182052  ┆ 11802114 ┆ 0.269617     │\n│ feature_39        ┆ 1818907  ┆ 11802114 ┆ 0.154117     │\n│ feature_42        ┆ 1818907  ┆ 11802114 ┆ 0.154117     │\n│ feature_50        ┆ 1772574  ┆ 11802114 ┆ 0.150191     │\n│ feature_53        ┆ 1772574  ┆ 11802114 ┆ 0.150191     │\n│ feature_41        ┆ 435922   ┆ 11802114 ┆ 0.036936     │\n│ feature_44        ┆ 435922   ┆ 11802114 ┆ 0.036936     │\n│ feature_52        ┆ 388024   ┆ 11802114 ┆ 0.032877     │\n│ feature_55        ┆ 388024   ┆ 11802114 ┆ 0.032877     │\n│ feature_15        ┆ 333462   ┆ 11802114 ┆ 0.028254     │\n│ feature_45        ┆ 306677   ┆ 11802114 ┆ 0.025985     │\n│ feature_46        ┆ 306677   ┆ 11802114 ┆ 0.025985     │\n│ feature_65        ┆ 306677   ┆ 11802114 ┆ 0.025985     │\n│ feature_66        ┆ 306677   ┆ 11802114 ┆ 0.025985     │\n│ feature_62        ┆ 288291   ┆ 11802114 ┆ 0.024427     │\n│ feature_64        ┆ 235171   ┆ 11802114 ┆ 0.019926     │\n│ feature_63        ┆ 225417   ┆ 11802114 ┆ 0.0191       │\n│ feature_73        ┆ 131538   ┆ 11802114 ┆ 0.011145     │\n│ feature_74        ┆ 131538   ┆ 11802114 ┆ 0.011145     │\n│ feature_32        ┆ 131527   ┆ 11802114 ┆ 0.011144     │\n│ feature_33        ┆ 131527   ┆ 11802114 ┆ 0.011144     │\n│ feature_58        ┆ 131522   ┆ 11802114 ┆ 0.011144     │\n│ feature_40        ┆ 67559    ┆ 11802114 ┆ 0.005724     │\n│ feature_43        ┆ 67559    ┆ 11802114 ┆ 0.005724     │\n│ feature_17        ┆ 55853    ┆ 11802114 ┆ 0.004732     │\n│ feature_08        ┆ 19527    ┆ 11802114 ┆ 0.001655     │\n│ feature_51        ┆ 13805    ┆ 11802114 ┆ 0.00117      │\n│ feature_54        ┆ 13805    ┆ 11802114 ┆ 0.00117      │\n│ feature_37        ┆ 849      ┆ 11802114 ┆ 0.000072     │\n│ feature_75        ┆ 303      ┆ 11802114 ┆ 0.000026     │\n│ feature_76        ┆ 303      ┆ 11802114 ┆ 0.000026     │\n│ feature_16        ┆ 250      ┆ 11802114 ┆ 0.000021     │\n│ feature_18        ┆ 219      ┆ 11802114 ┆ 0.000019     │\n│ feature_19        ┆ 219      ┆ 11802114 ┆ 0.000019     │\n│ feature_56        ┆ 219      ┆ 11802114 ┆ 0.000019     │\n│ feature_57        ┆ 219      ┆ 11802114 ┆ 0.000019     │\n│ feature_47        ┆ 87       ┆ 11802114 ┆ 0.000007     │\n│ feature_05        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_06        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_07        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_09        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_10        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_11        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_12        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_13        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_14        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_20        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_22        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_23        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_24        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_25        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_28        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_29        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_30        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_34        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_35        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_36        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_38        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_48        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_49        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_59        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_60        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_61        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_67        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_68        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_69        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_70        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_71        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_72        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_77        ┆ 0        ┆ 11802114 ┆ 0.0          │\n│ feature_78        ┆ 0        ┆ 11802114 ┆ 0.0          │\n└───────────────────┴──────────┴──────────┴──────────────┘","text/html":"<div><style>\n.dataframe > thead > tr,\n.dataframe > tbody > tr {\n  text-align: right;\n  white-space: pre-wrap;\n}\n</style>\n<small>shape: (80, 4)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>column</th><th>nulls</th><th>rows</th><th>missing_rate</th></tr><tr><td>str</td><td>u32</td><td>i32</td><td>f64</td></tr></thead><tbody><tr><td>&quot;responder_6_lag_1&quot;</td><td>11802106</td><td>11802114</td><td>0.999999</td></tr><tr><td>&quot;feature_21&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&quot;feature_26&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&quot;feature_27&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&quot;feature_31&quot;</td><td>8212377</td><td>11802114</td><td>0.695839</td></tr><tr><td>&quot;feature_00&quot;</td><td>3182052</td><td>11802114</td><td>0.269617</td></tr><tr><td>&quot;feature_01&quot;</td><td>3182052</td><td>11802114</td><td>0.269617</td></tr><tr><td>&quot;feature_02&quot;</td><td>3182052</td><td>11802114</td><td>0.269617</td></tr><tr><td>&quot;feature_03&quot;</td><td>3182052</td><td>11802114</td><td>0.269617</td></tr><tr><td>&quot;feature_04&quot;</td><td>3182052</td><td>11802114</td><td>0.269617</td></tr><tr><td>&quot;feature_39&quot;</td><td>1818907</td><td>11802114</td><td>0.154117</td></tr><tr><td>&quot;feature_42&quot;</td><td>1818907</td><td>11802114</td><td>0.154117</td></tr><tr><td>&quot;feature_50&quot;</td><td>1772574</td><td>11802114</td><td>0.150191</td></tr><tr><td>&quot;feature_53&quot;</td><td>1772574</td><td>11802114</td><td>0.150191</td></tr><tr><td>&quot;feature_41&quot;</td><td>435922</td><td>11802114</td><td>0.036936</td></tr><tr><td>&quot;feature_44&quot;</td><td>435922</td><td>11802114</td><td>0.036936</td></tr><tr><td>&quot;feature_52&quot;</td><td>388024</td><td>11802114</td><td>0.032877</td></tr><tr><td>&quot;feature_55&quot;</td><td>388024</td><td>11802114</td><td>0.032877</td></tr><tr><td>&quot;feature_15&quot;</td><td>333462</td><td>11802114</td><td>0.028254</td></tr><tr><td>&quot;feature_45&quot;</td><td>306677</td><td>11802114</td><td>0.025985</td></tr><tr><td>&quot;feature_46&quot;</td><td>306677</td><td>11802114</td><td>0.025985</td></tr><tr><td>&quot;feature_65&quot;</td><td>306677</td><td>11802114</td><td>0.025985</td></tr><tr><td>&quot;feature_66&quot;</td><td>306677</td><td>11802114</td><td>0.025985</td></tr><tr><td>&quot;feature_62&quot;</td><td>288291</td><td>11802114</td><td>0.024427</td></tr><tr><td>&quot;feature_64&quot;</td><td>235171</td><td>11802114</td><td>0.019926</td></tr><tr><td>&quot;feature_63&quot;</td><td>225417</td><td>11802114</td><td>0.0191</td></tr><tr><td>&quot;feature_73&quot;</td><td>131538</td><td>11802114</td><td>0.011145</td></tr><tr><td>&quot;feature_74&quot;</td><td>131538</td><td>11802114</td><td>0.011145</td></tr><tr><td>&quot;feature_32&quot;</td><td>131527</td><td>11802114</td><td>0.011144</td></tr><tr><td>&quot;feature_33&quot;</td><td>131527</td><td>11802114</td><td>0.011144</td></tr><tr><td>&quot;feature_58&quot;</td><td>131522</td><td>11802114</td><td>0.011144</td></tr><tr><td>&quot;feature_40&quot;</td><td>67559</td><td>11802114</td><td>0.005724</td></tr><tr><td>&quot;feature_43&quot;</td><td>67559</td><td>11802114</td><td>0.005724</td></tr><tr><td>&quot;feature_17&quot;</td><td>55853</td><td>11802114</td><td>0.004732</td></tr><tr><td>&quot;feature_08&quot;</td><td>19527</td><td>11802114</td><td>0.001655</td></tr><tr><td>&quot;feature_51&quot;</td><td>13805</td><td>11802114</td><td>0.00117</td></tr><tr><td>&quot;feature_54&quot;</td><td>13805</td><td>11802114</td><td>0.00117</td></tr><tr><td>&quot;feature_37&quot;</td><td>849</td><td>11802114</td><td>0.000072</td></tr><tr><td>&quot;feature_75&quot;</td><td>303</td><td>11802114</td><td>0.000026</td></tr><tr><td>&quot;feature_76&quot;</td><td>303</td><td>11802114</td><td>0.000026</td></tr><tr><td>&quot;feature_16&quot;</td><td>250</td><td>11802114</td><td>0.000021</td></tr><tr><td>&quot;feature_18&quot;</td><td>219</td><td>11802114</td><td>0.000019</td></tr><tr><td>&quot;feature_19&quot;</td><td>219</td><td>11802114</td><td>0.000019</td></tr><tr><td>&quot;feature_56&quot;</td><td>219</td><td>11802114</td><td>0.000019</td></tr><tr><td>&quot;feature_57&quot;</td><td>219</td><td>11802114</td><td>0.000019</td></tr><tr><td>&quot;feature_47&quot;</td><td>87</td><td>11802114</td><td>0.000007</td></tr><tr><td>&quot;feature_05&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_06&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_07&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_09&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_10&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_11&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_12&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_13&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_14&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_20&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_22&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_23&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_24&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_25&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_28&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_29&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_30&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_34&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_35&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_36&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_38&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_48&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_49&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_59&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_60&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_61&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_67&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_68&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_69&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_70&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_71&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_72&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_77&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr><tr><td>&quot;feature_78&quot;</td><td>0</td><td>11802114</td><td>0.0</td></tr></tbody></table></div>"},"metadata":{}}],"execution_count":8},{"cell_type":"markdown","source":"- 선형관계 봐봄 -> 처참...","metadata":{}},{"cell_type":"code","source":"# ==== RFECV로 피처 선택 (LightGBM) ====\nimport numpy as np\nimport polars as pl\nimport pandas as pd\nfrom sklearn.model_selection import GroupKFold\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.feature_selection import RFECV\nfrom sklearn.metrics import make_scorer, mean_squared_error\nimport lightgbm as lgb\n\n# 0) 사용 피처 정의: feature_* + (lag 있으면 포함)\nschema = train_lf.collect_schema().names()\nbase_keep = [\"date_id\",\"time_id\",\"symbol_id\",\"weight\",\"partition_id\"]\ntarget = \"responder_6\"\nlag_feats = [c for c in schema if c.startswith(\"responder_6_lag_\")]\nFEATURES = sorted([c for c in schema if c.startswith(\"feature_\")]) + lag_feats\n\n# 1) Pandas로 물질화 (메모리 아끼려 float32)\ncols_needed = base_keep + [target] + FEATURES\ntrain_pd = train_lf.select(cols_needed).collect().to_pandas()\ntest_pd  = test_lf.select([c for c in cols_needed if c in test_lf.collect_schema().names()]).collect().to_pandas()\n\nfor c in FEATURES + [target, \"weight\"]:\n    if c in train_pd.columns:\n        if pd.api.types.is_integer_dtype(train_pd[c]):\n            train_pd[c] = train_pd[c].astype(\"float32\")\n        if c in test_pd.columns:\n            if pd.api.types.is_integer_dtype(test_pd[c]):\n                test_pd[c] = test_pd[c].astype(\"float32\")\n\n# 2) X / y / groups / sample_weight\nX_train = train_pd[FEATURES]\ny_train = train_pd[target].astype(\"float32\")\ngroups  = train_pd[\"date_id\"].to_numpy()         # 날짜 단위로 폴드 분리\nsw      = train_pd[\"weight\"].fillna(1.0).to_numpy()\n\n# 3) 평가지표 (RMSE ↓)  → RFECV는 \"높을수록 좋은 점수\"가 필요해서 음수로 변환\nneg_rmse = make_scorer(lambda yt, yp: -np.sqrt(mean_squared_error(yt, yp)), greater_is_better=True)\n\n# 4) LightGBM + RFECV 파이프라인\nest = lgb.LGBMRegressor(\n    n_estimators=400,\n    learning_rate=0.05,\n    max_depth=-1,\n    num_leaves=64,\n    subsample=0.8,\n    colsample_bytree=0.8,\n    random_state=42,\n    n_jobs=-1,\n)\n\npipe = Pipeline([\n    (\"imputer\", SimpleImputer(strategy=\"median\")),          # 결측치 대체\n    (\"selector\", RFECV(\n        estimator=est,\n        step=0.2,                       # 20%씩 제거 → 속도↑ (더 촘촘히 하려면 0.1)\n        min_features_to_select=20,      # 최소 남길 개수 (원하면 조정)\n        cv=GroupKFold(n_splits=5),\n        scoring=neg_rmse,\n        n_jobs=-1,\n        verbose=0,\n    ))\n])\n\n# 5) 학습 (가중치/그룹 반영)\npipe.fit(X_train, y_train, selector__groups=groups, selector__estimator__sample_weight=sw)\n\n# 6) 선택된 피처 목록\nselector = pipe.named_steps[\"selector\"]\nsupport_mask = selector.support_\nselected_features = [f for f, keep in zip(FEATURES, support_mask) if keep]\n\nprint(f\"[RFECV] 선택된 피처 수: {len(selected_features)} / {len(FEATURES)}\")\nprint(\"예시 20개:\", selected_features[:20])\n\n# 7) 변환된 학습/테스트 세트 만들기 (같은 전처리/선택 적용)\n#    주의: 파이프라인에 imputer가 들어있기 때문에 transform을 통과시켜야 함.\nX_train_sel = pipe[:-1].transform(X_train)                  # imputer까지 적용\nX_train_sel = X_train_sel[:, support_mask]                  # 선택된 피처만\n# 테스트에도 동일 적용 (컬럼 정렬 보장)\nX_test = test_pd.reindex(columns=FEATURES, fill_value=np.nan)\nX_test_sel = pipe[:-1].transform(X_test)\nX_test_sel = X_test_sel[:, support_mask]\n\ny_train_vec = y_train.to_numpy().astype(\"float32\")\ny_test_vec  = test_pd[target].to_numpy().astype(\"float32\") if target in test_pd.columns else None\ntest_weight = test_pd[\"weight\"].fillna(1.0).to_numpy()     if \"weight\" in test_pd.columns else None\n\n# 8) 최종 산출물 정리\nprint(\"X_train_sel shape:\", X_train_sel.shape)\nprint(\"X_test_sel  shape:\", X_test_sel.shape if X_test_sel is not None else None)\n\n# (선택) 선택 피처 이름을 파일로 저장\nimport json, os\nwith open(\"selected_features_by_rfecv.json\", \"w\", encoding=\"utf-8\") as f:\n    json.dump(selected_features, f, ensure_ascii=False, indent=2)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-17T13:21:08.107779Z","iopub.execute_input":"2025-09-17T13:21:08.10821Z","execution_failed":"2025-09-17T13:22:36.069Z"}},"outputs":[],"execution_count":null}]}