{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":38760,"databundleVersionId":4493939}],"dockerImageVersionId":31286,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import polars as pl\nimport numpy as np\nimport lightgbm as lgb\nfrom pathlib import Path","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T17:44:39.753759Z","iopub.execute_input":"2026-03-04T17:44:39.756124Z","iopub.status.idle":"2026-03-04T17:44:45.487097Z","shell.execute_reply.started":"2026-03-04T17:44:39.756024Z","shell.execute_reply":"2026-03-04T17:44:45.485958Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import 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":"2026-03-04T17:35:37.771732Z","iopub.execute_input":"2026-03-04T17:35:37.772071Z","iopub.status.idle":"2026-03-04T17:35:37.779428Z","shell.execute_reply.started":"2026-03-04T17:35:37.772042Z","shell.execute_reply":"2026-03-04T17:35:37.778455Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_and_optimize(path):\n    type_map = {\"clicks\": 0, \"carts\": 1, \"orders\": 2}\n    \n    return (\n        pl.read_ndjson(path)\n        .explode(\"events\")\n        .unnest(\"events\")\n        .with_columns([\n            pl.col(\"session\").cast(pl.Int32),\n            pl.col(\"aid\").cast(pl.Int32),\n            (pl.col(\"ts\") / 1000).cast(pl.UInt32),\n            pl.col(\"type\").replace(type_map).cast(pl.UInt8)\n        ])\n    )\n\npath = Path(\"/kaggle/input/competitions/otto-recommender-system\")\ntrain = load_and_optimize(path / \"train.jsonl\")\ntest = load_and_optimize(path / \"test.jsonl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T17:45:02.943895Z","iopub.execute_input":"2026-03-04T17:45:02.944557Z","iopub.status.idle":"2026-03-04T17:48:39.139591Z","shell.execute_reply.started":"2026-03-04T17:45:02.944519Z","shell.execute_reply":"2026-03-04T17:48:39.138402Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"item_features = train.group_by(\"aid\").agg(pl.len().alias(\"item_pop\"))\ntrain_subset = train.filter(pl.col(\"type\") == 2).join(item_features, on=\"aid\")\nranker = lgb.LGBMRegressor(n_estimators=100, device=\"cpu\") \nranker.fit(\n    train_subset.select([\"ts\", \"item_pop\"]).to_pandas(),\n    train_subset[\"aid\"].to_pandas()\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T17:49:08.232916Z","iopub.execute_input":"2026-03-04T17:49:08.233330Z","iopub.status.idle":"2026-03-04T17:49:33.656901Z","shell.execute_reply.started":"2026-03-04T17:49:08.233293Z","shell.execute_reply":"2026-03-04T17:49:33.655674Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def generate_submission(test_df, top_20):\n    preds = test_df.group_by(\"session\").agg(pl.col(\"aid\").tail(20).alias(\"history\"))\n    \n    def fill_20(history):\n        history_list = history.to_list() if isinstance(history, pl.Series) else list(history)\n        unique_history = []\n        seen = set()\n        for x in reversed(history_list):\n            if x not in seen:\n                unique_history.append(x)\n                seen.add(x)\n        \n        res = (unique_history + top_20)[:20]\n        return \" \".join(map(str, res))\n\n    preds = preds.with_columns(\n        pl.col(\"history\").map_elements(fill_20, return_dtype=pl.String).alias(\"labels\")\n    )\n    \n    result = []\n    for t in [\"clicks\", \"carts\", \"orders\"]:\n        temp = preds.select([\n            (pl.col(\"session\").cast(pl.String) + f\"_{t}\").alias(\"session_type\"),\n            pl.col(\"labels\")\n        ])\n        result.append(temp)\n    \n    return pl.concat(result)\n\ntop_20_global = (\n    train.group_by(\"aid\")\n    .agg(pl.len().alias(\"cnt\"))\n    .sort(\"cnt\", descending=True)\n    .head(20)[\"aid\"]\n    .to_list()\n)\n\nfinal_sub = generate_submission(test, top_20_global)\nfinal_sub.write_csv(\"submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-04T17:49:45.795977Z","iopub.execute_input":"2026-03-04T17:49:45.796337Z","iopub.status.idle":"2026-03-04T17:53:07.973096Z","shell.execute_reply.started":"2026-03-04T17:49:45.796303Z","shell.execute_reply":"2026-03-04T17:53:07.971736Z"}},"outputs":[],"execution_count":null}]}