{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":39763,"databundleVersionId":11756775,"sourceType":"competition"},{"sourceId":11345390,"sourceType":"datasetVersion","datasetId":7097240},{"sourceId":11618926,"sourceType":"datasetVersion","datasetId":7288921}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Ensemble of best individual dataset models\n|    | exp_id   | exp_sub                                                                                                                              | dataset      |   LB Score |\n|---:|:---------|:-------------------------------------------------------------------------------------------------------------------------------------|:-------------|-----------:|\n|  0 | exp_27   | /kaggle/input/waveform-inversion-exps/exp_27/inversionnet_curvefault_a_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv | CurveFault_A |      319.4 |\n|  1 | exp_26   | /kaggle/input/waveform-inversion-exps/exp_26/inversionnet_curvefault_a_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv | CurveFault_A |      338.8 |\n|  2 | exp_11   | /kaggle/input/waveform-inversion-exps/exp_11/inversionnet_cfa_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | CurveFault_A |      340.2 |\n|  3 | exp_15   | /kaggle/input/waveform-inversion-exps/exp_15/inversionnet_cfa_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | CurveFault_A |      378.7 |\n|  4 | exp_34   | /kaggle/input/waveform-inversion-exps/exp_34/inversionnet_curvefault_b_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv | CurveFault_B |      272   |\n|  5 | exp_21   | /kaggle/input/waveform-inversion-exps/exp_21/inversionnet_curvefault_b_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv | CurveFault_B |      279.4 |\n|  6 | exp_9    | /kaggle/input/waveform-inversion-exps/exp_9/inversionnet_cfb_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | CurveFault_B |      285.8 |\n|  7 | exp_19   | /kaggle/input/waveform-inversion-exps/exp_19/inversionnet_cfb_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | CurveFault_B |      288.5 |\n|  8 | exp_35   | /kaggle/input/waveform-inversion-exps/exp_35/inversionnet_curvevel_a_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv   | CurveVel_A   |      304.8 |\n|  9 | exp_4    | /kaggle/input/waveform-inversion-exps/exp_4/inversionnet_cva_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | CurveVel_A   |      308.4 |\n| 10 | exp_31   | /kaggle/input/waveform-inversion-exps/exp_31/inversionnet_curvevel_a_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv   | CurveVel_A   |      310.4 |\n| 11 | exp_14   | /kaggle/input/waveform-inversion-exps/exp_14/inversionnet_cva_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | CurveVel_A   |      324.6 |\n| 12 | exp_39   | /kaggle/input/waveform-inversion-exps/exp_39/inversionnet_curvevel_b_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv   | CurveVel_B   |      258.3 |\n| 13 | exp_13   | /kaggle/input/waveform-inversion-exps/exp_13/inversionnet_cvb_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | CurveVel_B   |      269.1 |\n| 14 | exp_16   | /kaggle/input/waveform-inversion-exps/exp_16/inversionnet_cvb_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | CurveVel_B   |      272.6 |\n| 15 | exp_28   | /kaggle/input/waveform-inversion-exps/exp_28/inversionnet_curvevel_b_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv   | CurveVel_B   |      278.8 |\n| 16 | exp_32   | /kaggle/input/waveform-inversion-exps/exp_32/inversionnet_flatfault_a_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv  | FlatFault_A  |      328.3 |\n| 17 | exp_12   | /kaggle/input/waveform-inversion-exps/exp_12/inversionnet_ffa_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | FlatFault_A  |      364.5 |\n| 18 | exp_6    | /kaggle/input/waveform-inversion-exps/exp_6/inversionnet_ffa_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | FlatFault_A  |      366.2 |\n| 19 | exp_38   | /kaggle/input/waveform-inversion-exps/exp_38/inversionnet_flatfault_a_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv  | FlatFault_A  |      390.2 |\n| 20 | exp_36   | /kaggle/input/waveform-inversion-exps/exp_36/inversionnet_flatfault_b_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv  | FlatFault_B  |      249.7 |\n| 21 | exp_37   | /kaggle/input/waveform-inversion-exps/exp_37/inversionnet_flatfault_b_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv  | FlatFault_B  |      259.1 |\n| 22 | exp_2    | /kaggle/input/waveform-inversion-exps/exp_2/inversionnet_ffb_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | FlatFault_B  |      261   |\n| 23 | exp_20   | /kaggle/input/waveform-inversion-exps/exp_20/inversionnet_ffb_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | FlatFault_B  |      262.8 |\n| 24 | exp_1    | /kaggle/input/waveform-inversion-exps/exp_1/inversionnet_fva_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | FlatVel_A    |      379.3 |\n| 25 | exp_8    | /kaggle/input/waveform-inversion-exps/exp_8/inversionnet_fva_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | FlatVel_A    |      387.9 |\n| 26 | exp_25   | /kaggle/input/waveform-inversion-exps/exp_25/inversionnet_flatvel_a_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv    | FlatVel_A    |      459.7 |\n| 27 | exp_24   | /kaggle/input/waveform-inversion-exps/exp_24/inversionnet_flatvel_a_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv    | FlatVel_A    |      474.8 |\n| 28 | exp_7    | /kaggle/input/waveform-inversion-exps/exp_7/inversionnet_fvb_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | FlatVel_B    |      348.1 |\n| 29 | exp_17   | /kaggle/input/waveform-inversion-exps/exp_17/inversionnet_fvb_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | FlatVel_B    |      359   |\n| 30 | exp_30   | /kaggle/input/waveform-inversion-exps/exp_30/inversionnet_flatvel_b_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv    | FlatVel_B    |      399   |\n| 31 | exp_23   | /kaggle/input/waveform-inversion-exps/exp_23/inversionnet_flatvel_b_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv    | FlatVel_B    |      461.2 |\n| 32 | exp_33   | /kaggle/input/waveform-inversion-exps/exp_33/inversionnet_style_a_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv      | Style_A      |      381.5 |\n| 33 | exp_18   | /kaggle/input/waveform-inversion-exps/exp_18/inversionnet_sta_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | Style_A      |      391.5 |\n| 34 | exp_40   | /kaggle/input/waveform-inversion-exps/exp_40/inversionnet_style_a_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv      | Style_A      |      391.7 |\n| 35 | exp_5    | /kaggle/input/waveform-inversion-exps/exp_5/inversionnet_sta_l1_new_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv           | Style_A      |      408.7 |\n| 36 | exp_3    | /kaggle/input/waveform-inversion-exps/exp_3/inversionnet_stb_l2_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv               | Style_B      |      405.1 |\n| 37 | exp_22   | /kaggle/input/waveform-inversion-exps/exp_22/inversionnet_style_b_l1_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv      | Style_B      |      414.2 |\n| 38 | exp_29   | /kaggle/input/waveform-inversion-exps/exp_29/inversionnet_style_b_l2_480_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv      | Style_B      |      418.7 |\n| 39 | exp_10   | /kaggle/input/waveform-inversion-exps/exp_10/inversionnet_stb_l1_bs-1024_k-1.0_ss-1.0_st-1_nl-bn_um-None_submission.csv              | Style_B      |      429.7 |","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nfrom glob import glob\nexps = glob(f\"/kaggle/input/waveform-inversion-exps/**/*\")\ndatasets = ['CurveFault_A', 'CurveFault_B', 'CurveVel_A', 'CurveVel_B', 'FlatFault_A', 'FlatFault_B', 'FlatVel_A', 'FlatVel_B', 'Style_A', 'Style_B']\nshort_datasets = {'cfa':'CurveFault_A', 'cfb':'CurveFault_B', 'cva':'CurveVel_A', 'cvb':'CurveVel_B', 'ffa':'FlatFault_A', 'ffb':'FlatFault_B', 'fva':'FlatVel_A', 'fvb':'FlatVel_B', 'sta':'Style_A', 'stb':'Style_B'}\ndatasets_map = {x.lower(): x for x in datasets}\nlb_scores = [\n  {\"name\": \"exp_40\", \"lb\": 391.7},\n  {\"name\": \"exp_39\", \"lb\": 258.3},\n  {\"name\": \"exp_38\", \"lb\": 390.2},\n  {\"name\": \"exp_37\", \"lb\": 259.1},\n  {\"name\": \"exp_36\", \"lb\": 249.7},\n  {\"name\": \"exp_35\", \"lb\": 304.8},\n  {\"name\": \"exp_34\", \"lb\": 272.0},\n  {\"name\": \"exp_33\", \"lb\": 381.5},\n  {\"name\": \"exp_32\", \"lb\": 328.3},\n  {\"name\": \"exp_31\", \"lb\": 310.4},\n  {\"name\": \"exp_30\", \"lb\": 399.0},\n  {\"name\": \"exp_29\", \"lb\": 418.7},\n  {\"name\": \"exp_28\", \"lb\": 278.8},\n  {\"name\": \"exp_27\", \"lb\": 319.4},\n  {\"name\": \"exp_26\", \"lb\": 338.8},\n  {\"name\": \"exp_25\", \"lb\": 459.7},\n  {\"name\": \"exp_24\", \"lb\": 474.8},\n  {\"name\": \"exp_23\", \"lb\": 461.2},\n  {\"name\": \"exp_22\", \"lb\": 414.2},\n  {\"name\": \"exp_21\", \"lb\": 279.4},\n  {\"name\": \"exp_20\", \"lb\": 262.8},\n  {\"name\": \"exp_19\", \"lb\": 288.5},\n  {\"name\": \"exp_18\", \"lb\": 391.5},\n  {\"name\": \"exp_17\", \"lb\": 359.0},\n  {\"name\": \"exp_16\", \"lb\": 272.6},\n  {\"name\": \"exp_15\", \"lb\": 378.7},\n  {\"name\": \"exp_14\", \"lb\": 324.6},\n  {\"name\": \"exp_13\", \"lb\": 269.1},\n  {\"name\": \"exp_12\", \"lb\": 364.5},\n  {\"name\": \"exp_11\", \"lb\": 340.2},\n  {\"name\": \"exp_10\", \"lb\": 429.7},\n  {\"name\": \"exp_9\", \"lb\": 285.8},\n  {\"name\": \"exp_8\", \"lb\": 387.9},\n  {\"name\": \"exp_7\", \"lb\": 348.1},\n  {\"name\": \"exp_6\", \"lb\": 366.2},\n  {\"name\": \"exp_5\", \"lb\": 408.7},\n  {\"name\": \"exp_4\", \"lb\": 308.4},\n  {\"name\": \"exp_3\", \"lb\": 405.1},\n  {\"name\": \"exp_2\", \"lb\": 261.0},\n  {\"name\": \"exp_1\", \"lb\": 379.3}\n]\nlb_scores_hash = {x['name']: x['lb'] for x in lb_scores}\ndef get_dataset(exp):\n    exp_name = exp.split(\"/\")[-1].split(\"_\")[1:4]\n    dataset = exp_name[0]\n    if \"l1\" in exp_name[2] or \"l2\" in exp_name[2]:\n        dataset = '_'.join(exp_name[0:2])\n    if dataset in datasets_map:\n        dataset = datasets_map[dataset]\n    elif dataset in short_datasets:\n        dataset = short_datasets[dataset]\n    return dataset\nexp_df = pd.DataFrame([{\"exp_id\": exp.split(\"/\")[4], \"exp_sub\": exp, \"dataset\": get_dataset(exp), \"LB Score\": lb_scores_hash[exp.split(\"/\")[4]]} for exp in exps]).sort_values(['dataset','LB Score']).reset_index(drop=True)\nexp_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-30T01:31:08.837946Z","iopub.execute_input":"2025-04-30T01:31:08.838344Z","iopub.status.idle":"2025-04-30T01:31:08.922803Z","shell.execute_reply.started":"2025-04-30T01:31:08.838314Z","shell.execute_reply":"2025-04-30T01:31:08.921840Z"},"_kg_hide-input":true,"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selected_exps = [ 27, 21, 31, 39, 6, 37, 24, 23, 18, 3]\nbest_exp_df = exp_df[exp_df['exp_id'].isin([f'exp_{eid}' for eid in selected_exps])].reset_index(drop=True)\nbest_exp_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-30T01:31:12.059761Z","iopub.execute_input":"2025-04-30T01:31:12.060073Z","iopub.status.idle":"2025-04-30T01:31:12.074842Z","shell.execute_reply.started":"2025-04-30T01:31:12.060049Z","shell.execute_reply":"2025-04-30T01:31:12.073670Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_cat = pd.read_csv(\"/kaggle/input/waveform-inversion-test-2-datasets/submission_categories.csv\")\nsub_cat","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-30T01:31:57.437733Z","iopub.execute_input":"2025-04-30T01:31:57.438129Z","iopub.status.idle":"2025-04-30T01:31:57.513193Z","shell.execute_reply.started":"2025-04-30T01:31:57.438064Z","shell.execute_reply":"2025-04-30T01:31:57.512379Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset_2_test_ids = dict(sub_cat.groupby(['dataset'])['id'].agg(list))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-30T01:32:01.335710Z","iopub.execute_input":"2025-04-30T01:32:01.336053Z","iopub.status.idle":"2025-04-30T01:32:01.362131Z","shell.execute_reply.started":"2025-04-30T01:32:01.336022Z","shell.execute_reply":"2025-04-30T01:32:01.360707Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm import tqdm\nexp_dfs = {}\nfor i, row in tqdm(best_exp_df.iterrows(), total=best_exp_df.shape[0]):\n    dataset = row['dataset']\n    print(\"Loading\", row['exp_sub'])\n    df = pd.read_csv(row['exp_sub'])\n    test_ids = dataset_2_test_ids[dataset]\n    df['oid'] = df['oid_ypos'].apply(lambda x: x.split(\"_\")[0])\n    df = df[df['oid'].isin(test_ids)].drop(columns=['oid'])\n    exp_dfs[dataset] = df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-30T01:32:02.673682Z","iopub.execute_input":"2025-04-30T01:32:02.674029Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\ncomp_sub = pd.read_csv(\"/kaggle/input/waveform-inversion/sample_submission.csv\")\noid_ypos_2_index = {v:k for k,v in dict(comp_sub['oid_ypos']).items()}\ncomp_sub","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\nsub = pd.concat([df for dataset,df in exp_dfs.items()], ignore_index=False)\nsub['index'] = sub['oid_ypos'].apply(lambda x: oid_ypos_2_index[x])\nsub = sub.set_index(\"index\").sort_index()\nsub","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub.shape, comp_sub.shape","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\nsub.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}