{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","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":"gpu","dataSources":[{"sourceId":84493,"databundleVersionId":9871156,"sourceType":"competition"},{"sourceId":216039879,"sourceType":"kernelVersion"}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":4.669361,"end_time":"2024-10-10T13:05:46.686069","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-10-10T13:05:42.016708","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport joblib\nimport polars as pl\nimport xgboost as xgb\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import TimeSeriesSplit\nimport kaggle_evaluation.jane_street_inference_server","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":1.223703,"end_time":"2024-10-10T13:05:45.825911","exception":false,"start_time":"2024-10-10T13:05:44.602208","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:03.709750Z","iopub.execute_input":"2025-01-05T07:02:03.709988Z","iopub.status.idle":"2025-01-05T07:02:05.820870Z","shell.execute_reply.started":"2025-01-05T07:02:03.709961Z","shell.execute_reply":"2025-01-05T07:02:05.819879Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"input_path = '/kaggle/input/jane-street-real-time-market-data-forecasting'\ndef read_selected_data(input_path):\n    selected_files = [f\"partition_id={i}/part-0.parquet\" for i in range(1)]\n    dfs = []\n    for file_name in selected_files:\n        file_path = f'{input_path}/train.parquet/{file_name}'\n        lazy_df = pl.scan_parquet(file_path)\n        df = lazy_df.collect()\n        dfs.append(df)\n    full_df = pl.concat(dfs)\n    return full_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:05.823210Z","iopub.execute_input":"2025-01-05T07:02:05.823719Z","iopub.status.idle":"2025-01-05T07:02:05.829705Z","shell.execute_reply.started":"2025-01-05T07:02:05.823677Z","shell.execute_reply":"2025-01-05T07:02:05.828217Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = read_selected_data(input_path)\ndf = df.fill_null(strategy='forward')\nfeature_names = [f\"feature_{i:02d}\" for i in range(79)]\ntscv = TimeSeriesSplit(n_splits=5)\nfor train_index, val_index in tscv.split(df.to_pandas()):\n    train_dates = df[train_index]['date_id']\n    valid_dates = df[val_index]['date_id']","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":0.015917,"end_time":"2024-10-10T13:05:45.848958","exception":false,"start_time":"2024-10-10T13:05:45.833041","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:05.830975Z","iopub.execute_input":"2025-01-05T07:02:05.831280Z","iopub.status.idle":"2025-01-05T07:02:09.425064Z","shell.execute_reply.started":"2025-01-05T07:02:05.831253Z","shell.execute_reply":"2025-01-05T07:02:09.424377Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_valid = df.filter(pl.col('date_id').is_in(valid_dates)).select(feature_names).to_numpy()\ny_valid = df.filter(pl.col('date_id').is_in(valid_dates)).select('responder_6').to_numpy().ravel()\nw_valid = df.filter(pl.col('date_id').is_in(valid_dates)).select('weight').to_numpy().ravel()\nX_train = df.filter(pl.col('date_id').is_in(train_dates)).select(feature_names).to_numpy()\ny_train = df.filter(pl.col('date_id').is_in(train_dates)).select('responder_6').to_numpy().ravel()\nw_train = df.filter(pl.col('date_id').is_in(train_dates)).select('weight').to_numpy().ravel()\nfeature_columns = [col for col in df.columns if 'feature' in col]\ndf = df.with_columns([\n    pl.col(col).fill_null(0).alias(col) for col in feature_columns\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:08:19.357264Z","iopub.execute_input":"2025-01-05T07:08:19.357648Z","iopub.status.idle":"2025-01-05T07:08:19.842090Z","shell.execute_reply.started":"2025-01-05T07:08:19.357614Z","shell.execute_reply":"2025-01-05T07:08:19.841105Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:08:23.851148Z","iopub.execute_input":"2025-01-05T07:08:23.851959Z","iopub.status.idle":"2025-01-05T07:08:23.871613Z","shell.execute_reply.started":"2025-01-05T07:08:23.851922Z","shell.execute_reply":"2025-01-05T07:08:23.870726Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def r2_xgb(y_true, y_pred, sample_weight=None):\n    if sample_weight is None:\n        sample_weight = np.ones_like(y_true)\n    r2 = 1 - np.average((y_pred - y_true) ** 2, weights=sample_weight) / (np.average((y_true) ** 2, weights=sample_weight) + 1e-38)\n    return -r2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:08:38.219980Z","iopub.execute_input":"2025-01-05T07:08:38.220318Z","iopub.status.idle":"2025-01-05T07:08:38.225197Z","shell.execute_reply.started":"2025-01-05T07:08:38.220285Z","shell.execute_reply":"2025-01-05T07:08:38.224334Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = xgb.XGBRegressor(\n    n_estimators=2000,\n    learning_rate=0.1,\n    max_depth=6,\n    tree_method='hist',\n    objective='reg:squarederror',\n    eval_metric=r2_xgb,\n    disable_default_eval_metric=True,\n    early_stopping_rounds=2\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:08:40.118267Z","iopub.execute_input":"2025-01-05T07:08:40.119115Z","iopub.status.idle":"2025-01-05T07:08:40.123196Z","shell.execute_reply.started":"2025-01-05T07:08:40.119080Z","shell.execute_reply":"2025-01-05T07:08:40.122341Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.fit(\n    X_train, y_train,\n    sample_weight=w_train,\n    eval_set=[(X_valid, y_valid)],\n    sample_weight_eval_set=[w_valid]\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:11:27.266160Z","iopub.execute_input":"2025-01-05T07:11:27.266549Z","iopub.status.idle":"2025-01-05T07:11:49.292629Z","shell.execute_reply.started":"2025-01-05T07:11:27.266515Z","shell.execute_reply":"2025-01-05T07:11:49.291723Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if not os.path.exists(\"./model_save\"):\n    # Create the directory if it does not exist\n    os.mkdir(\"./model_save\")\nmodel.save_model('./model_save/2022110949.json')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_loaded = xgb.XGBRegressor()\nmodel_loaded.load_model('/kaggle/working/model_save/2022110949.json')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:09:03.870701Z","iopub.status.idle":"2025-01-05T07:09:03.870969Z","shell.execute_reply.started":"2025-01-05T07:09:03.870834Z","shell.execute_reply":"2025-01-05T07:09:03.870848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = pl.scan_parquet(\"/kaggle/input/jane-street-real-time-market-data-forecasting/test.parquet/date_id=0/part-0.parquet\")\ntest = test.collect()\ntest = test.to_pandas()\ntest = test[feature_names].values\npredictions = model_loaded.predict(test)\npredictions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:10.172794Z","iopub.status.idle":"2025-01-05T07:02:10.173131Z","shell.execute_reply.started":"2025-01-05T07:02:10.172977Z","shell.execute_reply":"2025-01-05T07:02:10.172995Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = pl.scan_parquet(\"/kaggle/input/jane-street-real-time-market-data-forecasting/test.parquet/date_id=0/part-0.parquet\")\ntest = test.collect()\ntest = test.to_pandas()\n\ntest_df = test[feature_names].values\npredictions = model_loaded.predict(test_df)\n\noutput_df = pd.DataFrame({\"row_id\": test['row_id'], \"responder_6\": predictions})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:10.174160Z","iopub.status.idle":"2025-01-05T07:02:10.174496Z","shell.execute_reply.started":"2025-01-05T07:02:10.174309Z","shell.execute_reply":"2025-01-05T07:02:10.174324Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:10.175617Z","iopub.status.idle":"2025-01-05T07:02:10.175885Z","shell.execute_reply.started":"2025-01-05T07:02:10.175752Z","shell.execute_reply":"2025-01-05T07:02:10.175766Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Global lags storage\nlags_: pl.DataFrame | None = None\ndef predict(test: pl.DataFrame, lags: pl.DataFrame | None) -> pl.DataFrame:\n    global lags_, model_loaded # Declare models as global\n    \n    # Logic for saving or loading lags\n    if lags is not None:\n        lags_ = lags\n    \n    test = test.to_pandas()\n    test_df = test[feature_names].values\n    predictions = model_loaded.predict(test_df)\n\n    output_df = pd.DataFrame({\"row_id\": test['row_id'], \"responder_6\": predictions})\n\n        \n    return pl.from_pandas(output_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:10.176958Z","iopub.status.idle":"2025-01-05T07:02:10.177257Z","shell.execute_reply.started":"2025-01-05T07:02:10.177115Z","shell.execute_reply":"2025-01-05T07:02:10.177131Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Setup the inference server\ninference_server = kaggle_evaluation.jane_street_inference_server.JSInferenceServer(predict)\n\n# Running the inference server\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    inference_server.serve()\nelse:\n    inference_server.run_local_gateway((\n        '/kaggle/input/jane-street-real-time-market-data-forecasting/test.parquet',\n        '/kaggle/input/jane-street-real-time-market-data-forecasting/lags.parquet',\n    ))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-05T07:02:10.178736Z","iopub.status.idle":"2025-01-05T07:02:10.179037Z","shell.execute_reply.started":"2025-01-05T07:02:10.178892Z","shell.execute_reply":"2025-01-05T07:02:10.178908Z"}},"outputs":[],"execution_count":null}]}