{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":38128,"databundleVersionId":4230952,"sourceType":"competition"},{"sourceId":5203361,"sourceType":"datasetVersion","datasetId":3026135},{"sourceId":5216121,"sourceType":"datasetVersion","datasetId":3034460},{"sourceId":6050918,"sourceType":"datasetVersion","datasetId":3408553,"isSourceIdPinned":false},{"sourceId":124580344,"sourceType":"kernelVersion"}],"dockerImageVersionId":30407,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Preparing submissions with ablated models\n\nIt is not possible to run prediction for multiome part of the competition using Kaggle resources. So we will keep that part from Makotu's original submission and will be changing cite part","metadata":{}},{"cell_type":"code","source":"%%bash\nmkdir /root/.kaggle\necho '{\"username\":\"shitovvladimir\",\"key\":\"\"}' > /root/.kaggle/kaggle.json\nchmod 600 /root/.kaggle/kaggle.json","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:16:07.837466Z","iopub.execute_input":"2023-06-29T14:16:07.837913Z","iopub.status.idle":"2023-06-29T14:16:07.867048Z","shell.execute_reply.started":"2023-06-29T14:16:07.837862Z","shell.execute_reply":"2023-06-29T14:16:07.865431Z"},"trusted":true},"outputs":[{"name":"stderr","text":"mkdir: cannot create directory ‘/root/.kaggle’: File exists\n","output_type":"stream"}],"execution_count":3},{"cell_type":"code","source":"import os\nfrom itertools import combinations\nfrom pathlib import Path\nimport subprocess\n\nimport numpy as np\nimport pandas as pd\nfrom tqdm.notebook import tqdm","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:16:11.950228Z","iopub.execute_input":"2023-06-29T14:16:11.950654Z","iopub.status.idle":"2023-06-29T14:16:12.062589Z","shell.execute_reply.started":"2023-06-29T14:16:11.95061Z","shell.execute_reply":"2023-06-29T14:16:12.061341Z"},"trusted":true},"outputs":[],"execution_count":4},{"cell_type":"code","source":"preprocess_path = Path(\"/kaggle/input/open-problems-cite-preprocess/\")\ncite_results_path = Path(\"/kaggle/input/makotu-ablation-cite/\")\nraw_path = Path(\"/kaggle/input/open-problems-multimodal/\")\nretrained_models_results_path = Path(\"/kaggle/input/makotu-retrained-model\")\noutput_path = Path(\"/kaggle/working/\")","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:16:12.257002Z","iopub.execute_input":"2023-06-29T14:16:12.257439Z","iopub.status.idle":"2023-06-29T14:16:12.264307Z","shell.execute_reply.started":"2023-06-29T14:16:12.257397Z","shell.execute_reply":"2023-06-29T14:16:12.263075Z"},"trusted":true},"outputs":[],"execution_count":5},{"cell_type":"code","source":"makotu_submission = pd.read_csv(\"/kaggle/input/open-problems-makotu-submission/submission_makotu.csv\", index_col=0)\neval_ids = pd.read_csv(raw_path / \"evaluation_ids.csv\") ","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:16:12.879943Z","iopub.execute_input":"2023-06-29T14:16:12.880408Z","iopub.status.idle":"2023-06-29T14:19:28.925336Z","shell.execute_reply.started":"2023-06-29T14:16:12.880366Z","shell.execute_reply":"2023-06-29T14:19:28.923956Z"},"trusted":true},"outputs":[],"execution_count":6},{"cell_type":"code","source":"list(retrained_models_results_path.glob(\"*.csv\"))","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:19:28.927217Z","iopub.execute_input":"2023-06-29T14:19:28.927573Z","iopub.status.idle":"2023-06-29T14:19:28.945295Z","shell.execute_reply.started":"2023-06-29T14:19:28.927535Z","shell.execute_reply":"2023-06-29T14:19:28.943887Z"},"trusted":true},"outputs":[{"execution_count":7,"output_type":"execute_result","data":{"text/plain":"[PosixPath('/kaggle/input/makotu-retrained-model/ElasticNet_0.1.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/Ridge_1.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/OneLayerPerceptron_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/XGBRegressor_0.01.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/MakotuCiteModel_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/ThreeLayersPerceptronV2_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/LGBMRegressor_100.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/Lasso_0.1.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/CiteModelMish_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/LinearRegression.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/ThreeLayersPerceptron_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/XGBRegressor_1.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/LGBMRegressor_10.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/FiveLayersPerceptronV2_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/FiveLayersPerceptron_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/OneLayerPerceptronV2_50.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/Ridge_10.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/XGBRegressor_0.1.csv'),\n PosixPath('/kaggle/input/makotu-retrained-model/Ridge_0.1.csv')]"},"metadata":{}}],"execution_count":7},{"cell_type":"code","source":"done_submissions = [\n    \"ElasticNet_0.1.csv\",\n    \"Ridge_1.csv\",\n    \"OneLayerPerceptron_50.csv\",\n    \"MakotuCiteModel_50.csv\",\n    \"ThreeLayersPerceptronV2_50.csv\",\n    \"LGBMRegressor_100.csv\",\n    \"Lasso_0.1.csv\",\n    \"CiteModelMish_50.csv\",\n    \"ThreeLayersPerceptron_50.csv\",\n    \"XGBRegressor_1.csv\",\n    \"LGBMRegressor_10.csv\",\n    \"FiveLayersPerceptronV2_50.csv\",\n    \"FiveLayersPerceptron_50.csv\",\n    \"OneLayerPerceptronV2_50.csv\",\n    \"Ridge_10.csv\",\n    \"XGBRegressor_0.1.csv\",\n    \"Ridge_0.1.csv\",\n]  # ['submission_cite_only_5.csv', 'submission_cite_skip_0.csv']","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:21:07.895167Z","iopub.execute_input":"2023-06-29T14:21:07.895726Z","iopub.status.idle":"2023-06-29T14:21:07.904887Z","shell.execute_reply.started":"2023-06-29T14:21:07.895681Z","shell.execute_reply":"2023-06-29T14:21:07.903091Z"},"trusted":true},"outputs":[],"execution_count":8},{"cell_type":"code","source":"submissions_dir = retrained_models_results_path","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:21:13.612829Z","iopub.execute_input":"2023-06-29T14:21:13.613281Z","iopub.status.idle":"2023-06-29T14:21:13.619851Z","shell.execute_reply.started":"2023-06-29T14:21:13.613242Z","shell.execute_reply":"2023-06-29T14:21:13.618175Z"},"trusted":true},"outputs":[],"execution_count":10},{"cell_type":"code","source":"for file in tqdm(submissions_dir.glob(\"*.csv\")):\n    submission_name = file.name\n    print(\"Working with\", submission_name)\n    \n    if submission_name in done_submissions:\n        print(\"Skipping\")\n        continue\n    \n#         cite_sub = pd.read_csv(submissions_dir / submission_name, index_col=0)\n    cite_sub = pd.read_csv(submissions_dir / submission_name)\n    \n    print(\"Preprocessing\")  \n    # #### first: fix cite output\n\n    test_sub_ids = np.load(preprocess_path / \"cite/test_cite_inputs_idxcol.npz\", allow_pickle=True)\n    test_sub_ids = test_sub_ids[\"index\"]\n    test_raw_ids = np.load(preprocess_path / \"cite/test_cite_raw_inputs_idxcol.npz\", allow_pickle=True)\n    test_raw_ids = test_raw_ids[\"index\"]\n\n    # +\n    test_cite_df = pd.DataFrame(test_sub_ids, columns = ['cell_id'])\n    cite_sub['cell_id'] = test_raw_ids\n    test_cite_df = test_cite_df.merge(cite_sub, on = 'cell_id', how = 'left')\n    test_cite_df.fillna(0, inplace = True)\n    test_cite_df.drop(['cell_id'], axis = 1, inplace = True)\n\n    cite_sub = test_cite_df.copy()\n    \n    submission = pd.concat([eval_ids, makotu_submission], axis=1)\n    submission.set_index(eval_ids.columns.tolist(), inplace=True)\n    submission = submission[\"target\"]  # convert to series\n\n    cite_cols = pd.read_csv(preprocess_path / \"cite/cite_test_cols.csv\") \n    cite_index = pd.read_csv(preprocess_path / \"cite/cite_test_indexs.csv\") \n    cite_index.columns = ['cell_id']\n\n    cite_sub = np.array(cite_sub)\n\n    # \n    cell_dict = dict((k,v) for v,k in enumerate(np.array(cite_index['cell_id'])))\n    assert len(cell_dict)  == len(cite_index['cell_id'])\n\n    gene_dict = dict((k,v) for v,k in enumerate(np.array(cite_cols['gene_id']))) \n    assert len(gene_dict)  == len(cite_cols['gene_id'])\n\n    eval_ids_cell_num = eval_ids.cell_id.apply(lambda x:cell_dict.get(x, -1))\n    eval_ids_gene_num = eval_ids.gene_id.apply(lambda x:gene_dict.get(x, -1))\n\n    valid_cite_rows = (eval_ids_gene_num !=-1) & (eval_ids_cell_num!=-1)\n    \n    print(\"Preparing submission\")\n    submission.iloc[valid_cite_rows] = cite_sub[eval_ids_cell_num[valid_cite_rows].to_numpy(),\n                                            eval_ids_gene_num[valid_cite_rows].to_numpy()]\n\n    # ### make submission\n\n    submission = submission.round(6)\n    submission = pd.DataFrame(submission, columns = ['target'])\n    submission = submission.reset_index()\n\n    submission[['row_id', 'target']].to_csv(output_path / submission_name, index = False)\n    \n    print(\"Uploading solution\")\n    \n    command = [\"kaggle\",\n           \"competitions\",\n           \"submit\",\n           \"-c\", \"open-problems-multimodal\",\n           \"-f\", submission_name,\n           \"-m\", submission_name\n          ]\n\n    subprocess.run(command)\n    \n    # Delete submission to free the memory\n    (output_path / submission_name).unlink()","metadata":{"execution":{"iopub.status.busy":"2023-06-29T14:21:23.195829Z","iopub.execute_input":"2023-06-29T14:21:23.196372Z","iopub.status.idle":"2023-06-29T14:34:49.785269Z","shell.execute_reply.started":"2023-06-29T14:21:23.196328Z","shell.execute_reply":"2023-06-29T14:34:49.782412Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"0it [00:00, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"80b16ae8969d402288362ea4b1407bae"}},"metadata":{}},{"name":"stdout","text":"Working with ElasticNet_0.1.csv\nSkipping\nWorking with Ridge_1.csv\nSkipping\nWorking with OneLayerPerceptron_50.csv\nSkipping\nWorking with XGBRegressor_0.01.csv\nPreprocessing\nPreparing submission\nUploading solution\nWarning: Looks like you're using an outdated API Version, please consider updating (server 1.5.13 / client 1.5.12)\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 1.13G/1.13G [00:40<00:00, 29.9MB/s]\n","output_type":"stream"},{"name":"stdout","text":"Successfully submitted to Open Problems - Multimodal Single-Cell IntegrationWorking with MakotuCiteModel_50.csv\nSkipping\nWorking with ThreeLayersPerceptronV2_50.csv\nSkipping\nWorking with LGBMRegressor_100.csv\nSkipping\nWorking with Lasso_0.1.csv\nSkipping\nWorking with CiteModelMish_50.csv\nSkipping\nWorking with LinearRegression.csv\nPreprocessing\nPreparing submission\nUploading solution\nWarning: Looks like you're using an outdated API Version, please consider updating (server 1.5.13 / client 1.5.12)\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 1.13G/1.13G [00:41<00:00, 29.0MB/s]\n","output_type":"stream"},{"name":"stdout","text":"Successfully submitted to Open Problems - Multimodal Single-Cell IntegrationWorking with ThreeLayersPerceptron_50.csv\nSkipping\nWorking with XGBRegressor_1.csv\nSkipping\nWorking with LGBMRegressor_10.csv\nSkipping\nWorking with FiveLayersPerceptronV2_50.csv\nSkipping\nWorking with FiveLayersPerceptron_50.csv\nSkipping\nWorking with OneLayerPerceptronV2_50.csv\nSkipping\nWorking with Ridge_10.csv\nSkipping\nWorking with XGBRegressor_0.1.csv\nSkipping\nWorking with Ridge_0.1.csv\nSkipping\n","output_type":"stream"}],"execution_count":11},{"cell_type":"markdown","source":"Put 0s to cite part to evaluate the quality of Multiome submission","metadata":{}},{"cell_type":"code","source":"cite_index","metadata":{"execution":{"iopub.status.busy":"2023-06-15T14:43:33.065804Z","iopub.execute_input":"2023-06-15T14:43:33.06623Z","iopub.status.idle":"2023-06-15T14:43:33.096375Z","shell.execute_reply.started":"2023-06-15T14:43:33.066199Z","shell.execute_reply":"2023-06-15T14:43:33.095206Z"},"trusted":true},"outputs":[{"execution_count":21,"output_type":"execute_result","data":{"text/plain":"            cell_id\n0      c2150f55becb\n1      65b7edf8a4da\n2      c1b26cb1057b\n3      917168fa6f83\n4      2b29feeca86d\n...             ...\n48658  a9b4d99f1f50\n48659  0e2c1d0782af\n48660  a3cbc5aa0ec3\n48661  75b350243add\n48662  ad5a949989b2\n\n[48663 rows x 1 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>cell_id</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>c2150f55becb</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>65b7edf8a4da</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>c1b26cb1057b</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>917168fa6f83</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2b29feeca86d</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>48658</th>\n      <td>a9b4d99f1f50</td>\n    </tr>\n    <tr>\n      <th>48659</th>\n      <td>0e2c1d0782af</td>\n    </tr>\n    <tr>\n      <th>48660</th>\n      <td>a3cbc5aa0ec3</td>\n    </tr>\n    <tr>\n      <th>48661</th>\n      <td>75b350243add</td>\n    </tr>\n    <tr>\n      <th>48662</th>\n      <td>ad5a949989b2</td>\n    </tr>\n  </tbody>\n</table>\n<p>48663 rows × 1 columns</p>\n</div>"},"metadata":{}}],"execution_count":21},{"cell_type":"code","source":"submission_name = \"multiome_only.csv\"\n\nprint(\"Preprocessing\")  \n\nsubmission = pd.concat([eval_ids, makotu_submission], axis=1)\nsubmission.set_index(eval_ids.columns.tolist(), inplace=True)\nsubmission = submission[\"target\"]  # convert to series\n\ncite_cols = pd.read_csv(preprocess_path / \"cite/cite_test_cols.csv\") \ncite_index = pd.read_csv(preprocess_path / \"cite/cite_test_indexs.csv\") \ncite_index.columns = ['cell_id']\n\ncell_dict = dict((k,v) for v,k in enumerate(np.array(cite_index['cell_id'])))\nassert len(cell_dict)  == len(cite_index['cell_id'])\n\ngene_dict = dict((k,v) for v,k in enumerate(np.array(cite_cols['gene_id']))) \nassert len(gene_dict)  == len(cite_cols['gene_id'])\n\neval_ids_cell_num = eval_ids.cell_id.apply(lambda x:cell_dict.get(x, -1))\neval_ids_gene_num = eval_ids.gene_id.apply(lambda x:gene_dict.get(x, -1))\n\nvalid_cite_rows = (eval_ids_gene_num !=-1) & (eval_ids_cell_num!=-1)\n\nprint(\"Preparing submission\")\nsubmission.iloc[valid_cite_rows] = 0\n\nsubmission = submission.round(6)\nsubmission = pd.DataFrame(submission, columns = ['target'])\nsubmission = submission.reset_index()\n\nsubmission[['row_id', 'target']].to_csv(output_path / submission_name, index = False)\n\nprint(\"Uploading solution\")\n\ncommand = [\"kaggle\",\n       \"competitions\",\n       \"submit\",\n       \"-c\", \"open-problems-multimodal\",\n       \"-f\", submission_name,\n       \"-m\", submission_name\n      ]\n\nsubprocess.run(command)\n\n# Delete submission to free the memory\n(output_path / submission_name).unlink()","metadata":{"execution":{"iopub.status.busy":"2023-04-06T12:26:52.409911Z","iopub.execute_input":"2023-04-06T12:26:52.41043Z","iopub.status.idle":"2023-04-06T12:31:37.525273Z","shell.execute_reply.started":"2023-04-06T12:26:52.410367Z","shell.execute_reply":"2023-04-06T12:31:37.523622Z"},"trusted":true},"outputs":[{"name":"stdout","text":"Preprocessing\nPreparing submission\nUploading solution\nWarning: Looks like you're using an outdated API Version, please consider updating (server 1.5.13 / client 1.5.12)\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 1.10G/1.10G [00:40<00:00, 29.0MB/s]\n","output_type":"stream"},{"name":"stdout","text":"Successfully submitted to Open Problems - Multimodal Single-Cell Integration","output_type":"stream"}],"execution_count":5},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null}]}