{"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":9801075,"sourceType":"datasetVersion","datasetId":6006872},{"sourceId":9806342,"sourceType":"datasetVersion","datasetId":6010899},{"sourceId":10139918,"sourceType":"datasetVersion","datasetId":6258261},{"sourceId":10139922,"sourceType":"datasetVersion","datasetId":6258265},{"sourceId":10253875,"sourceType":"datasetVersion","datasetId":6297065},{"sourceId":10304887,"sourceType":"datasetVersion","datasetId":6378806},{"sourceId":10351700,"sourceType":"datasetVersion","datasetId":6410107},{"sourceId":203900450,"sourceType":"kernelVersion"},{"sourceId":204479873,"sourceType":"kernelVersion"},{"sourceId":213144305,"sourceType":"kernelVersion"},{"sourceId":215616115,"sourceType":"kernelVersion"}],"dockerImageVersionId":30787,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":80.344101,"end_time":"2024-10-26T03:27:42.952247","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-10-26T03:26:22.608146","version":"2.6.0"},"widgets":{"application/vnd.jupyter.widget-state+json":{"state":{"252dd2de87de42f4becd877fbbafc26b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ff55584ae0ab4f39ae471f314eaad988","placeholder":"​","style":"IPY_MODEL_b8d338c473aa4dc3ba25f37a997a9037","value":" 1/1 [00:00&lt;00:00, 33.79it/s]"}},"48a2731fb59b4ce8ace5b53d6f0e3337":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a8dbc79c7c5a48318466a102c55801bb","placeholder":"​","style":"IPY_MODEL_ebd06aaaa7024a1684ba1b9fe89358cf","value":"100%"}},"56da652f3eeb42aca986e6fd815629dc":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5bb4e0df01c44716afebab25aafe9f5f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_f4e41234b0cc4f3e9313d971f5aadc9f","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_6408698650f74dd699bcc914b850e396","value":1}},"6408698650f74dd699bcc914b850e396":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"9cb493ec04fc4ed391f5ac28cc84500e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_48a2731fb59b4ce8ace5b53d6f0e3337","IPY_MODEL_5bb4e0df01c44716afebab25aafe9f5f","IPY_MODEL_252dd2de87de42f4becd877fbbafc26b"],"layout":"IPY_MODEL_56da652f3eeb42aca986e6fd815629dc"}},"a8dbc79c7c5a48318466a102c55801bb":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b8d338c473aa4dc3ba25f37a997a9037":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ebd06aaaa7024a1684ba1b9fe89358cf":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f4e41234b0cc4f3e9313d971f5aadc9f":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ff55584ae0ab4f39ae471f314eaad988":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}},"version_major":2,"version_minor":0}}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install rtdl_num_embeddings -q --no-index --find-links=/kaggle/input/jane-street-import/rtdl_num_embeddings","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-04T02:56:16.794932Z","iopub.execute_input":"2025-01-04T02:56:16.795279Z","iopub.status.idle":"2025-01-04T02:56:25.603314Z","shell.execute_reply.started":"2025-01-04T02:56:16.795247Z","shell.execute_reply":"2025-01-04T02:56:25.602097Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os, sys, gc\nimport pickle\nimport dill\nimport numpy as np\nimport pandas as pd\nimport polars as pl\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom pytorch_lightning import LightningModule, Trainer\n\nfrom sklearn.metrics import r2_score\nimport torch.optim\n\nfrom torch.utils.data import Dataset, DataLoader, TensorDataset\nfrom sklearn.model_selection import train_test_split\nimport math\nfrom tqdm import tqdm\nfrom collections import OrderedDict\n\nfrom tabm_reference import Model, make_parameter_groups  # 学習時に使ったモジュールかもしれません\n\nimport warnings\nimport joblib\nfrom pytorch_lightning.callbacks import Callback\nimport gc\n\nimport lightgbm as lgb\nfrom lightgbm import Booster\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\n\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\n\n# (Kaggleなどの環境依存パス)\nsys.path.append(\"/kaggle/input/jane-street-real-time-market-data-forecasting\")\n\n############################################\n# CONFIG\n############################################\nclass CONFIG:\n    seed = 42  \n    target_col = \"responder_6\"\n    # 79 base features + 9 lagged => 88 total\n    feature_cols = [f\"feature_{idx:02d}\" for idx in range(79)] + [f\"responder_{idx}_lag_1\" for idx in range(9)]\n    model_paths = [\n        \"/kaggle/input/js-xs-nn-trained-model\",  \n        \"/kaggle/input/js-with-lags-trained-xgb/result.pkl\", \n        \"/kaggle/input/als-e-106-pp0-40-xgb-5fold/result0.pkl\",\n        \"/kaggle/input/als-e-106-pp0-40-xgb-5fold/result1.pkl\",\n        \"/kaggle/input/als-e-106-pp0-40-xgb-5fold/result2.pkl\",\n        \"/kaggle/input/als-e-106-pp0-40-xgb-5fold/result3.pkl\",\n        \"/kaggle/input/als-e-106-pp0-40-xgb-5fold/result4.pkl\"\n    ]\n\n############################################\n# ローカルCV用(一部)\n############################################\nvalid = pl.scan_parquet(\n    \"/kaggle/input/js24-preprocessing-create-lags/validation.parquet/\"\n).collect().to_pandas()\n\n# XGBoost models\nwith open(CONFIG.model_paths[2], \"rb\") as fp:\n    result = pickle.load(fp)\n    xgb_model = result[\"model\"]\nxgb_feature_cols = [\"symbol_id\", \"time_id\"] + CONFIG.feature_cols\n\nwith open(CONFIG.model_paths[4], \"rb\") as fp:\n    result = pickle.load(fp)\n    xgb_model2 = result[\"model\"]\n\nwith open(CONFIG.model_paths[6], \"rb\") as fp:\n    result = pickle.load(fp)\n    xgb_model4 = result[\"model\"]\n\nwith open(CONFIG.model_paths[1], \"rb\") as fp:\n    result = pickle.load(fp)\n    xgb_model5 = result[\"model\"]\n\n\ndef r2_val(y_true, y_pred, sample_weight):\n    \"\"\"\n    Weighted R²\n    \"\"\"\n    r2 = 1 - np.average(\n        (y_pred - y_true)**2, \n        weights=sample_weight\n    ) / (np.average((y_true)**2, weights=sample_weight) + 1e-38)\n    return r2\n\n\n############################################\n# NN: 出力層を線形に修正 + デフォルト引数 + strict=False\n############################################\nclass NN(LightningModule):\n    def __init__(\n        self,\n        input_dim:int=88,\n        hidden_dims:list=None,\n        dropouts:list=None,\n        lr:float=1e-3,\n        weight_decay:float=1e-5\n    ):\n        super().__init__()\n        if hidden_dims is None:\n            hidden_dims=[512,256]\n        if dropouts is None:\n            dropouts=[0.2,0.2]\n        self.save_hyperparameters()\n\n        layers=[]\n        in_dim= input_dim\n        for i,hd in enumerate(hidden_dims):\n            layers.append(nn.BatchNorm1d(in_dim))\n            if i>0:\n                layers.append(nn.SiLU())\n            if i<len(dropouts):\n                layers.append(nn.Dropout(dropouts[i]))\n            layers.append(nn.Linear(in_dim, hd))\n            in_dim=hd\n        \n        # 最終出力 => linear\n        layers.append(nn.Linear(in_dim,1))\n        self.model= nn.Sequential(*layers)\n        self.lr= lr\n        self.weight_decay=weight_decay\n        self.validation_step_outputs=[]\n\n    def forward(self,x):\n        return self.model(x).squeeze(-1)\n\n    def training_step(self,batch):\n        x,y,w= batch\n        y_hat= self(x)\n        loss= F.mse_loss(y_hat,y,reduction='none')*w\n        loss= loss.mean()\n        self.log('train_loss', loss)\n        return loss\n\n    def validation_step(self,batch):\n        x,y,w= batch\n        y_hat= self(x)\n        loss= F.mse_loss(y_hat,y,reduction='none')*w\n        loss= loss.mean()\n        self.log('val_loss',loss)\n        self.validation_step_outputs.append((y_hat,y,w))\n        return loss\n\n    def on_validation_epoch_end(self):\n        if not self.trainer.sanity_checking:\n            y= torch.cat([o[1] for o in self.validation_step_outputs]).cpu().numpy()\n            pred= torch.cat([o[0] for o in self.validation_step_outputs]).cpu().numpy()\n            wts= torch.cat([o[2] for o in self.validation_step_outputs]).cpu().numpy()\n            val_r2= r2_val(y, pred, wts)\n            self.log(\"val_r_square\", val_r2, prog_bar=True)\n        self.validation_step_outputs.clear()\n\n    def configure_optimizers(self):\n        opt= torch.optim.Adam(self.parameters(), lr=self.lr, weight_decay=self.weight_decay)\n        sch= torch.optim.lr_scheduler.ReduceLROnPlateau(opt, mode='min', factor=0.5, patience=5, verbose=True)\n        return {\n            \"optimizer\": opt,\n            \"lr_scheduler\": {\n                \"scheduler\": sch,\n                \"monitor\": \"val_loss\"\n            }\n        }\n\n\n# 5-fold NN models\nN_folds=5\nmodels=[]\nfor fold in range(N_folds):\n    ckpt_path= f\"{CONFIG.model_paths[0]}/nn_{fold}.model\"\n    net= NN.load_from_checkpoint(\n        ckpt_path, \n        strict=False,   # 不一致keyは無視\n        map_location=\"cuda:0\"\n    )\n    net.eval()\n    models.append(net)\n\ndel valid\ngc.collect()\n\n############################################\n# lags_ globally\n############################################\nlags_: pl.DataFrame|None = None\n\n############################################\n# predict_nn_xgb\n############################################\ndef predict_nn_xgb(test: pl.DataFrame, lags: pl.DataFrame|None)-> pl.DataFrame|pd.DataFrame:\n    global lags_\n\n    # 安全策: test is None?\n    if test is None:\n        print(\"[ERR] test is None => returning empty df\")\n        return pl.DataFrame({\"row_id\":[], \"responder_6\":[]})\n\n    # lags_ check\n    if lags is not None:\n        lags_= lags\n\n    # if lags_ is None => either skip or handle\n    if lags_ is None:\n        print(\"[WARN] lags_ is None => skipping join\")\n    else:\n        tmp_lags= lags_.clone().group_by([\"date_id\",\"symbol_id\"], maintain_order=True).last()\n        test= test.join(tmp_lags, on=[\"date_id\",\"symbol_id\"], how=\"left\")\n\n    # 1) check columns\n    missing_cols= [c for c in xgb_feature_cols if c not in test.columns]\n    if missing_cols:\n        print(\"[ERR] missing XGB cols: \", missing_cols)\n        # ここでエラー or スキップ\n        # return pl.DataFrame({\"row_id\": test[\"row_id\"], \"responder_6\": np.zeros(len(test))})\n    preds_xgb= np.zeros(len(test))\n    if len(missing_cols)==0:\n        df_x= test[xgb_feature_cols].to_pandas()\n        preds_xgb += xgb_model.predict(df_x)*0.25\n        preds_xgb += xgb_model2.predict(df_x)*0.25\n        preds_xgb += xgb_model4.predict(df_x)*0.25\n        preds_xgb += xgb_model5.predict(df_x)*0.25\n\n    # 2) NN\n    missing_nn_cols= [c for c in CONFIG.feature_cols if c not in test.columns]\n    if missing_nn_cols:\n        print(\"[ERR] missing NN cols: \", missing_nn_cols)\n        # ここでリターン\n        preds_nn= np.zeros(len(test))\n    else:\n        df_nn= test[CONFIG.feature_cols].to_pandas().fillna(method='ffill').fillna(0)\n        tin= torch.FloatTensor(df_nn.values).to(\"cuda:0\")\n        preds_nn= np.zeros(len(test))\n        with torch.no_grad():\n            for i,m in enumerate(models):\n                m.eval()\n                preds_nn += m(tin).cpu().numpy()/ len(models)\n\n    preds= 0.55* preds_xgb + 0.45* preds_nn\n\n    # output\n    predictions_nn= test.select(\"row_id\").with_columns(\n        pl.Series(\n            name=\"responder_6\",\n            values= np.clip(preds,a_min=-5,a_max=5),\n            dtype=pl.Float64\n        )\n    )\n    return predictions_nn\n\n############################################\n# Additional\n############################################\nfeature_list= [f\"feature_{i:02d}\" for i in range(79) if i!=61]\ntarget_col= \"responder_6\"\nfeature_test= feature_list + [f\"responder_{i}_lag_1\" for i in range(9)]\nfeature_cat= [\"feature_09\",\"feature_10\",\"feature_11\"]\nfeature_cont= [c for c in feature_test if c not in feature_cat]\nbatch_size=8192\n\ndata_stats= joblib.load(\"/kaggle/input/my-own-js/data_stats.pkl\")\nmeans= data_stats['mean']\nstds= data_stats['std']\n\ndef standardize(df, feature_cols, means, stds):\n    return df.with_columns([\n        ((pl.col(col)-means[col]) / stds[col]).alias(col) for col in feature_cols\n    ])\n\ncategory_mappings= {\n    # ... same as before\n}\n\ndef encode_column(df,col,mapping):\n    max_value= max(mapping.values())\n    def encode_category(cat):\n        return mapping.get(cat, max_value+1)\n    return df.with_columns(pl.col(col).map_elements(encode_category).alias(col))\n\nclass R2Loss(nn.Module):\n    def __init__(self):\n        super().__init__()\n    def forward(self,y_pred,y_true):\n        mse_loss= torch.sum((y_pred-y_true)**2)\n        var_y= torch.sum(y_true**2)\n        return mse_loss/(var_y+1e-38)\n\n\n# tabm model\nmodel= NN.load_from_checkpoint('/kaggle/input/my-own-js/tabm_epochepoch03.ckpt', strict=False, map_location=\"cuda:0\")\nmodel.eval()\n\nlags_history=None\ndef predict_tabm(test: pl.DataFrame, lags: pl.DataFrame|None)-> pl.DataFrame|pd.DataFrame:\n    # placeholder\n    # or real code\n    return test.select(\"row_id\").with_columns(\n        pl.lit(0.0).alias(\"responder_6\")\n    )\n\n\ndef load_from_dill(model_name, model_path=None, file_ext='.dill'):\n    model_object=None\n    with open(f\"{model_path}/{model_name}{file_ext}\",\"rb\") as fh:\n        model_object= dill.load(fh)\n    return model_object\n\nrdg= load_from_dill(\"Ridge\",\"/kaggle/input/jsridgev01011635\")\n\ndef predict_ridge(test, lags):\n    if test is None:\n        return pl.DataFrame({\"row_id\":[], \"responder_6\":[]})\n    # columns\n    cols= [f'feature_{i:02d}' for i in range(79)]\n    missing= [c for c in cols if c not in test.columns]\n    if missing:\n        print(\"[ERR] missing ridge cols:\", missing)\n        # fallback\n        return test.select(\"row_id\").with_columns(\n            pl.lit(0.0).alias(\"responder_6\")\n        )\n    df_r= test[cols].to_pandas().fillna(3)\n    preds= rdg.predict(df_r.values)\n    out= test.select(\"row_id\").with_columns(\n        pl.Series(\"responder_6\", preds.ravel())\n    )\n    return out\n\n\ndef predict(test: pl.DataFrame, lags: pl.DataFrame|None)-> pl.DataFrame|pd.DataFrame:\n    pd_nn_xgb= predict_nn_xgb(test, lags).to_pandas()\n    pd_ridge = predict_ridge(test, lags).to_pandas()\n    pd_tabm  = predict_tabm(test, lags).to_pandas()\n\n    pd_nn_xgb.rename(columns={'responder_6':'col_nn_xgb'}, inplace=True)\n    pd_ridge.rename(columns={'responder_6':'col_ridge'}, inplace=True)\n    pd_tabm.rename(columns={'responder_6':'col_tabm'}, inplace=True)\n\n    pds= pd.merge(pd_nn_xgb, pd_ridge, on='row_id', how='outer')\n    pds= pd.merge(pds, pd_tabm, on='row_id', how='outer')\n\n    e_weights= [0.70,0.10,0.20]\n    # fillna(0.0) => fallback\n    pds[\"col_nn_xgb\"]= pds[\"col_nn_xgb\"].fillna(0.0)\n    pds[\"col_ridge\"] = pds[\"col_ridge\"].fillna(0.0)\n    pds[\"col_tabm\"]  = pds[\"col_tabm\"].fillna(0.0)\n\n    pds['responder_6']=(\n        pds['col_nn_xgb']* e_weights[0]+\n        pds['col_ridge'] * e_weights[1]+\n        pds['col_tabm']  * e_weights[2]\n    )\n\n    predictions= test.select('row_id').with_columns(\n        pl.Series('responder_6', pds['responder_6'].to_numpy())\n    )\n    return predictions\n\n\nimport kaggle_evaluation.jane_street_inference_server\ninference_server= kaggle_evaluation.jane_street_inference_server.JSInferenceServer(predict)\n\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    inference_server.serve()\nelse:\n    inference_server.run_local_gateway(\n        (\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        )\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-04T03:20:48.699970Z","iopub.execute_input":"2025-01-04T03:20:48.700341Z","iopub.status.idle":"2025-01-04T03:20:50.262511Z","shell.execute_reply.started":"2025-01-04T03:20:48.700311Z","shell.execute_reply":"2025-01-04T03:20:50.261255Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}