{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":67356,"databundleVersionId":8006601,"sourceType":"competition"},{"sourceId":9085054,"sourceType":"datasetVersion","datasetId":5481644}],"dockerImageVersionId":30746,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### To calculate Mean Average Precision for a submission file, upload the submission file to the notebook's data and make sure the filename on line 1 is correct.\n\n### Please post your results to this discussion thread ->  https://www.kaggle.com/competitions/leash-BELKA/discussion/523779\n\n#### *Update 24.08.04* Added MAP calculations for Public and Private sets","metadata":{}},{"cell_type":"code","source":"SUBMISSION_FILENAME = '../input/leash-BELKA/sample_submission.csv'\n\nimport numpy as np\nimport pandas as pd\nfrom sklearn.metrics import average_precision_score\n\nfrom collections import defaultdict\n\nkey = pd.read_csv('/kaggle/input/belka-solution-key/solution_with_groups.csv')\nsub = pd.read_csv(SUBMISSION_FILENAME)\nsub_key = pd.merge(sub, key, on = 'id')\n\nscores = []\npublic_scores = []\nprivate_scores = []\n    \nprecision_dict = defaultdict(list)\n\nfor protein in sub_key['protein_name'].unique():\n    for group in sub_key['split_group'].unique():\n        rows = (sub_key['protein_name'] == protein) & (sub_key['split_group'] == group)\n        y_true = sub_key['binds_y'][rows]\n        y_pred = sub_key['binds_x'][rows]\n        precision = average_precision_score(y_true, y_pred)\n        precision_dict[protein].append(precision)\n        scores.append(precision)\n        \n        rows_public = (sub_key['protein_name'] == protein) & (sub_key['split_group'] == group) & (sub_key['Usage'] == 'Public')\n        if any(rows_public):\n            y_true = sub_key['binds_y'][rows_public]\n            y_pred = sub_key['binds_x'][rows_public]\n            precision = average_precision_score(y_true, y_pred)\n            public_scores.append(precision)\n\n        rows_private = (sub_key['protein_name'] == protein) & (sub_key['split_group'] == group) &  (sub_key['Usage'] == 'Private')\n        if any(rows_private):\n            y_true = sub_key['binds_y'][rows_private]\n            y_pred = sub_key['binds_x'][rows_private]\n            precision = average_precision_score(y_true, y_pred)\n            private_scores.append(precision)\n\nprint(\"Overall MAP: \", round(np.mean(scores), 4))\nprint(\"Public MAP: \", round(np.mean(public_scores), 4))\nprint(\"Private MAP: \", round(np.mean(private_scores), 4))\npd.DataFrame.from_dict(precision_dict, orient = 'index', columns = sub_key['split_group'].unique())","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-08-05T03:54:16.211635Z","iopub.execute_input":"2024-08-05T03:54:16.212022Z","iopub.status.idle":"2024-08-05T03:54:16.252659Z","shell.execute_reply.started":"2024-08-05T03:54:16.211982Z","shell.execute_reply":"2024-08-05T03:54:16.251371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}