{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.18","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpu1vmV38","dataSources":[{"sourceId":105399,"databundleVersionId":12733338,"sourceType":"competition"},{"sourceId":12535270,"sourceType":"datasetVersion","datasetId":7902293}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# %load_ext cudf.pandas\n\n# RAPIDS cuDF 25.02 cuML 25.02 -> add to UTILITY SCRIPT ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:23:06.809446Z","iopub.execute_input":"2025-07-23T17:23:06.810020Z","iopub.status.idle":"2025-07-23T17:23:06.819650Z","shell.execute_reply.started":"2025-07-23T17:23:06.809989Z","shell.execute_reply":"2025-07-23T17:23:06.815154Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:23:06.822170Z","iopub.execute_input":"2025-07-23T17:23:06.824371Z","iopub.status.idle":"2025-07-23T17:23:06.839151Z","shell.execute_reply.started":"2025-07-23T17:23:06.824343Z","shell.execute_reply":"2025-07-23T17:23:06.832973Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def iBlend(path_to_ds, file_short_names, sls):\n\n    def tida(sls):\n        \n        def read_subm(sls,i):\n            tnm = sls[\"subm\"][i][\"name\"]\n            FiN = sls[\"path\"] + tnm + \".csv\"\n            df = pd.read_csv(FiN).rename(columns={'target':tnm, sls[\"target\"]:tnm})\n            del df[\"ranker_id\"]\n            return df\n        \n        dfs_subm = [read_subm(sls,i) for i in range(len(sls[\"subm\"]))]\n        \n        df_subms = pd.merge(dfs_subm[0],  dfs_subm[1], on=['Id'])  \n        for i in range(2, len(sls[\"subm\"])): \n            df_subms = pd.merge(df_subms, dfs_subm[i], on=['Id'])\n            \n        cols = [col for col in df_subms.columns if col != \"Id\"]\n        short_name_cols = [c.replace(sls[\"prefix\"], '') for c in cols]\n        corrects = [wt for wt in sls[\"subwts\"]]\n        weights = [subm['weight'] for subm in sls[\"subm\"]]\n        \n        def alls(x, cs=cols):\n            tes = {c: x[c] for c in cs}.items()\n            subms_sorted = [\n              t[0].replace(sls[\"prefix\"], '')\n              for t in sorted(tes,key=lambda k:k[1],reverse=True if sls[\"sort\"]=='desc' else False)]\n            return subms_sorted\n        \n        def correct(x, cs=cols, w=weights, cw=corrects):\n            ic = [x['alls'].index(c) for c in short_name_cols]\n            cS = [x[cols[j]] * (w[j] + cw[ic[j]]) for j in range(len(cols))]\n            return sum(cS)\n        \n        df_subms['alls']        = df_subms.apply(lambda x: alls   (x), axis=1)\n        df_subms[sls[\"target\"]] = df_subms.apply(lambda x: correct(x), axis=1)\n        \n        schema_rename = { old_nc:new_shnc for old_nc, new_shnc in zip(cols, short_name_cols) }\n        \n        df_subms = df_subms.rename(columns=schema_rename)\n        df_subms = df_subms.rename(columns={sls[\"target\"]:\"ensemble\"})\n        \n        df_subms.insert(loc=1, column=' _ ', value=['   '] * sls[\"q_rows\"])\n        \n        df_subms[' _ '] = df_subms[' _ '].astype(str)\n        pd.set_option('display.max_rows',100)\n        pd.set_option('display.float_format', '{:.2f}'.format)\n        vcols = ['Id'] + [' _ '] + short_name_cols + [' _ '] + ['alls'] + [' _ '] + ['ensemble']\n        df_subms = df_subms[vcols]\n        display(df_subms.head(7))\n        pd.set_option('display.float_format', '{:.0f}'.format)\n        df_subms = df_subms.rename(columns={\"ensemble\":sls[\"target\"]})\n        return df_subms\n        \n\n    sample_subm = pd.read_csv(path_to_ds + file_short_names[1] + \".csv\")\n\n    \n    def ensemble_tida(sls,submission=sample_subm):   \n        sls['sort'] = 'desc'\n        dfs = tida(sls)\n        dfD = dfs[['Id', sls['target']]]\n        dfD.to_csv(f'tida_desc.csv', index=False)\n        sls['sort'] = 'asc'\n        dfs = tida(sls)\n        dfA = dfs[['Id', sls['target']]]\n        dfA.to_csv(f'tida_asc.csv',  index=False)\n        target,d,a = sls['target'],sls['desc'],sls['asc']\n        submission[target] = round((dfD[target] * d + a * dfA[target]),0)\n        submission[target] = submission[sls['target']].round().astype(int)\n        return submission\n\n    \n    submission = ensemble_tida(sls)\n\n    \n    return submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:23:06.840907Z","iopub.execute_input":"2025-07-23T17:23:06.841130Z","iopub.status.idle":"2025-07-23T17:23:06.862691Z","shell.execute_reply.started":"2025-07-23T17:23:06.841109Z","shell.execute_reply":"2025-07-23T17:23:06.856103Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Archiv\n\n# path_to_ds ='/kaggle/input/20-juli-2025-flightrank/submission '\n\n# file_short_names = ['0.42163','0.43916','0.47635','0.48388']\n\n# params_v5 = {\n#       'path'  : path_to_ds,                                 \n#       'sort'  : \"dynamic\",\n#       'target': \"selected\",\n#       'q_rows': 6_897_776,\n#       'prefix': \"subm_\",\n#       'desc'  : 0.50,\n#       'asc'   : 0.50,\n#       'subwts': [+0.11, +0.04, -0.04, -0.11],                          # LB = 0.48379,  v.5\n#       'subm'  : [\n#         { 'name':file_short_names[0],'weight':0.05, },\n#         { 'name':file_short_names[1],'weight':0.08, },\n#         { 'name':file_short_names[2],'weight':0.13, },\n#         { 'name':file_short_names[3],'weight':0.74, },\n#       ]\n#     }\n\n# params_v6 = {\n#       'path'  : path_to_ds,                                 \n#       'sort'  : \"dynamic\",\n#       'target': \"selected\",\n#       'q_rows': 6_897_776,\n#       'prefix': \"subm_\",\n#       'desc'  : 0.30,\n#       'asc'   : 0.70,\n#       'subwts': [+0.21, -0.07, -0.07, -0.07],                          # LB = 0.48443,  v.6\n#       'subm'  : [\n#         { 'name':file_short_names[0],'weight':0.10, },\n#         { 'name':file_short_names[1],'weight':0.10, },\n#         { 'name':file_short_names[2],'weight':0.10, },\n#         { 'name':file_short_names[3],'weight':0.70, },\n#       ]\n#     }\n\n# params_v7 = {\n#       'path'  : path_to_ds,                                 \n#       'sort'  : \"dynamic\",\n#       'target': \"selected\",\n#       'q_rows': 6_897_776,\n#       'prefix': \"subm_\",\n#       'desc'  : 0.30,\n#       'asc'   : 0.70,\n#       'subwts': [+0.21, -0.03, -0.07, -0.11],                          # LB = 0.48462,  v.7\n#       'subm'  : [\n#         { 'name':file_short_names[0],'weight':0.10, },\n#         { 'name':file_short_names[1],'weight':0.10, },\n#         { 'name':file_short_names[2],'weight':0.10, },\n#         { 'name':file_short_names[3],'weight':0.70, },\n#       ]\n#     }\n\n# params_v8 = {\n#       'path'  : path_to_ds,                                 \n#       'sort'  : \"dynamic\",\n#       'target': \"selected\",\n#       'q_rows': 6_897_776,\n#       'prefix': \"subm_\",\n#       'desc'  : 0.30,\n#       'asc'   : 0.70,\n#       'subwts': [+0.11, -0.01, -0.03, -0.07],                          # LB = 0.48397\n#       'subm'  : [\n#         { 'name':file_short_names[0],'weight':0.10, },\n#         { 'name':file_short_names[1],'weight':0.10, },\n#         { 'name':file_short_names[2],'weight':0.10, },\n#         { 'name':file_short_names[3],'weight':0.70, },\n#       ]\n#     }\n\n# params_v9 = {\n#       'path'  : path_to_ds,                                 \n#       'sort'  : \"dynamic\",\n#       'target': \"selected\",\n#       'q_rows': 6_897_776,\n#       'prefix': \"subm_\",\n#       'desc'  : 0.30,\n#       'asc'   : 0.70,\n#       'subwts': [+0.21, -0.02, -0.07, -0.12],                          # LB = 0.48517,  v.10\n#       'subm'  : [\n#         { 'name':file_short_names[0],'weight':0.05, },\n#         { 'name':file_short_names[1],'weight':0.08, },\n#         { 'name':file_short_names[2],'weight':0.13, },\n#         { 'name':file_short_names[3],'weight':0.74, },\n#       ]\n#     }","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:23:06.864491Z","iopub.execute_input":"2025-07-23T17:23:06.864726Z","iopub.status.idle":"2025-07-23T17:23:06.882271Z","shell.execute_reply.started":"2025-07-23T17:23:06.864703Z","shell.execute_reply":"2025-07-23T17:23:06.878769Z"},"_kg_hide-input":true,"_kg_hide-output":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"file_short_names = ['0.47635','0.48388','0.48397','0.48425']\n\npath_to_ds ='/kaggle/input/20-juli-2025-flightrank/submission '\n\n\nparams_v12 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.30,\n      'asc'   : 0.70,\n      'subwts': [+0.33, -0.11, -0.11, -0.11],                          # LB = 0.48507,  v.12\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.25, },\n        { 'name':file_short_names[1],'weight':0.25, },\n        { 'name':file_short_names[2],'weight':0.25, },\n        { 'name':file_short_names[3],'weight':0.25, },\n      ]\n    }\n\nparams_v13 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.30,\n      'asc'   : 0.70,\n      'subwts': [+0.33, -0.04, -0.11, -0.18],                          # LB = 0.48452,  v.13\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.25, },\n        { 'name':file_short_names[1],'weight':0.25, },\n        { 'name':file_short_names[2],'weight':0.25, },\n        { 'name':file_short_names[3],'weight':0.25, },\n      ]\n    }\n\nparams_v14 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.20,\n      'asc'   : 0.80,\n      'subwts': [+0.21, -0.02, -0.07, -0.12],                          # LB = 0.48526,  v.14\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.30, },\n        { 'name':file_short_names[1],'weight':0.30, },\n        { 'name':file_short_names[2],'weight':0.30, },\n        { 'name':file_short_names[3],'weight':0.10, },\n      ]\n    }\n\nparams_v11 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.30,\n      'asc'   : 0.70,\n      'subwts': [+0.21, -0.02, -0.07, -0.12],                          # LB = 0.48590,  v.11\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.30, },\n        { 'name':file_short_names[1],'weight':0.30, },\n        { 'name':file_short_names[2],'weight':0.30, },\n        { 'name':file_short_names[3],'weight':0.10, },\n      ]\n    }\n\nparams_v15 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.40,\n      'asc'   : 0.60,\n      'subwts': [+0.21, -0.02, -0.07, -0.12],                          # LB = 0.48608,  v.15\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.30, },\n        { 'name':file_short_names[1],'weight':0.30, },\n        { 'name':file_short_names[2],'weight':0.30, },\n        { 'name':file_short_names[3],'weight':0.10, },\n      ]\n    }\n\nparams_v17 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.45,\n      'asc'   : 0.55,\n      'subwts': [+0.21, -0.02, -0.07, -0.12],                          # LB = 0.48544,  v.17\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.30, },\n        { 'name':file_short_names[1],'weight':0.30, },\n        { 'name':file_short_names[2],'weight':0.30, },\n        { 'name':file_short_names[3],'weight':0.10, },\n      ]\n    }\n\nparams_v18 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.45,\n      'asc'   : 0.55,\n      'subwts': [+0.21, -0.02, -0.07, -0.12],                          # LB = 0.48572,  v.18\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.27, },\n        { 'name':file_short_names[1],'weight':0.30, },\n        { 'name':file_short_names[2],'weight':0.30, },\n        { 'name':file_short_names[3],'weight':0.13, },\n      ]\n    }\n\nparams_v19 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.40,\n      'asc'   : 0.60,\n      'subwts': [+0.21, -0.02, -0.07, -0.12],                          # LB = 0.48572,      v.19\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.27, },\n        { 'name':file_short_names[1],'weight':0.33, },\n        { 'name':file_short_names[2],'weight':0.33, },\n        { 'name':file_short_names[3],'weight':0.07, },\n      ]\n    }\n\nparams_v20 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.40,\n      'asc'   : 0.60,\n      'subwts': [+0.17, -0.02, -0.05, -0.10],                          # LB = 0.48581,      v.20\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.27, },\n        { 'name':file_short_names[1],'weight':0.33, },\n        { 'name':file_short_names[2],'weight':0.33, },\n        { 'name':file_short_names[3],'weight':0.07, },\n      ]\n    }\n\nparams_v21 = {\n      'path'  : path_to_ds,                                 \n      'sort'  : \"dynamic\",\n      'target': \"selected\",\n      'q_rows': 6_897_776,\n      'prefix': \"subm_\",\n      'desc'  : 0.40,\n      'asc'   : 0.60,\n      'subwts': [+0.20, -0.02, -0.07, -0.11],                          # LB = ?,            v.21\n      'subm'  : [\n        { 'name':file_short_names[0],'weight':0.29, },\n        { 'name':file_short_names[1],'weight':0.30, },\n        { 'name':file_short_names[2],'weight':0.30, },\n        { 'name':file_short_names[3],'weight':0.11, },\n      ]\n    }","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:23:06.901654Z","iopub.execute_input":"2025-07-23T17:23:06.902374Z","iopub.status.idle":"2025-07-23T17:23:06.933490Z","shell.execute_reply.started":"2025-07-23T17:23:06.902349Z","shell.execute_reply":"2025-07-23T17:23:06.927391Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nparams = params_v11  #  LB=0.48590\nparams = params_v12  #  LB=0.48507\nparams = params_v13  #  LB=0.48452\nparams = params_v14  #  LB=0.48590\nparams = params_v15  #  LB=0.48608  < \nparams = params_v17  #  LB=0.48544\nparams = params_v18  #  LB=0.48572\nparams = params_v19  #  LB=0.48572\nparams = params_v20  #  LB=0.48581\n\nparams = params_v21  #\n\n\ndf = iBlend ( path_to_ds, file_short_names, params )\n\ndf.to_csv('submission_tida.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:23:06.935069Z","iopub.execute_input":"2025-07-23T17:23:06.935304Z","iopub.status.idle":"2025-07-23T17:33:52.721012Z","shell.execute_reply.started":"2025-07-23T17:23:06.935282Z","shell.execute_reply":"2025-07-23T17:33:52.716223Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df1 = pd.read_csv(\"submission_tida.csv\")\n\ndf2 = pd.read_csv(\"/kaggle/input/20-juli-2025-flightrank/submission 0.43916.csv\")\ndf3 = pd.read_csv(\"/kaggle/input/20-juli-2025-flightrank/submission 0.42163.csv\")\ndf4 = pd.read_csv(\"/kaggle/input/20-juli-2025-flightrank/submission 0.41226.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:33:52.721717Z","iopub.execute_input":"2025-07-23T17:33:52.721925Z","iopub.status.idle":"2025-07-23T17:34:14.863859Z","shell.execute_reply.started":"2025-07-23T17:33:52.721903Z","shell.execute_reply":"2025-07-23T17:34:14.857910Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### [Simple Ensemble](https://www.kaggle.com/code/ducknew/simple-ensemble) by [ducknew](https://www.kaggle.com/code/ducknew/simple-ensemble)","metadata":{}},{"cell_type":"code","source":"dfs = [\n    df1,df2,df3,df4\n]\n\ndef rank2score(sr, eps=1e-6):\n    n = sr.max()\n    return 1.0 - (sr - 1) / (n + eps)\n\nscore_frames = []\nfor i, df in enumerate(dfs):\n    tmp = df[['Id', 'ranker_id', 'selected']].copy()\n    tmp['score'] = tmp.groupby('ranker_id')['selected'].transform(rank2score)\n    score_frames.append(tmp[['Id', 'ranker_id', 'score']].rename(columns={'score': f'score_{i}'}))\n\nmerged = score_frames[0]\nfor i in range(1, 4):\n    merged = merged.merge(score_frames[i], on=['Id', 'ranker_id'], how='left')\n\nweights = [0.997, 0.001, 0.001, 0.001]\nscore_cols = [f'score_{i}' for i in range(4)]\nw = pd.Series(weights, index=score_cols)\nmerged['score_mean'] = (merged[score_cols] * w).sum(axis=1) / w.sum()\n\ndef score2rank(s):\n    return s.rank(method='first', ascending=False).astype(int)\n\nmerged['selected'] = merged.groupby('ranker_id')['score_mean'].transform(score2rank)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:34:14.866342Z","iopub.execute_input":"2025-07-23T17:34:14.866822Z","iopub.status.idle":"2025-07-23T17:35:45.036267Z","shell.execute_reply.started":"2025-07-23T17:34:14.866797Z","shell.execute_reply":"2025-07-23T17:35:45.032231Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"out = merged[['Id', 'ranker_id', 'selected']]\n\nout.to_csv(\"submission.csv\", index=False, float_format='%.0f')\n\nout","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T17:35:45.038162Z","iopub.execute_input":"2025-07-23T17:35:45.038379Z","iopub.status.idle":"2025-07-23T17:35:57.164689Z","shell.execute_reply.started":"2025-07-23T17:35:45.038359Z","shell.execute_reply":"2025-07-23T17:35:57.160468Z"}},"outputs":[],"execution_count":null}]}