{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"- lgb & cb merge","metadata":{}},{"cell_type":"code","source":"!pip install /kaggle/input/lleaves/lleaves-0.2.6-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:31:39.720137Z","iopub.execute_input":"2023-06-24T06:31:39.721357Z","iopub.status.idle":"2023-06-24T06:32:15.292864Z","shell.execute_reply.started":"2023-06-24T06:31:39.721310Z","shell.execute_reply":"2023-06-24T06:32:15.291668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import lleaves","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:32:15.295622Z","iopub.execute_input":"2023-06-24T06:32:15.296008Z","iopub.status.idle":"2023-06-24T06:32:15.714428Z","shell.execute_reply.started":"2023-06-24T06:32:15.295967Z","shell.execute_reply":"2023-06-24T06:32:15.713079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from pathlib import Path\nimport pandas as pd\nimport polars as pl\nimport numpy as np\nimport os\nimport yaml\nfrom catboost import CatBoostClassifier, Pool\nimport lightgbm as lgb\nimport warnings\nimport jo_wilder\nwarnings.filterwarnings('ignore')","metadata":{"papermill":{"duration":0.023295,"end_time":"2022-06-03T21:13:10.412151","exception":false,"start_time":"2022-06-03T21:13:10.388856","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-24T06:32:15.715873Z","iopub.execute_input":"2023-06-24T06:32:15.716486Z","iopub.status.idle":"2023-06-24T06:32:18.398053Z","shell.execute_reply.started":"2023-06-24T06:32:15.716449Z","shell.execute_reply":"2023-06-24T06:32:18.396943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import catboost as cb\ncb.__version__","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:32:18.401810Z","iopub.execute_input":"2023-06-24T06:32:18.402246Z","iopub.status.idle":"2023-06-24T06:32:18.410939Z","shell.execute_reply.started":"2023-06-24T06:32:18.402209Z","shell.execute_reply":"2023-06-24T06:32:18.409976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data + Make Master","metadata":{}},{"cell_type":"code","source":"%%time\n\n# config\nbase_data_path = '/kaggle/input/psp-lgb-202306191208'\nlgb_model_path_1 = '/kaggle/input/psp-lgb-202306191208'\ncb_model_path_1 = '/kaggle/input/psp-cb-202306191210'\n#base_model_path = '/kaggle/input/psp-cb-'\n\nbest_threshold = 0.64\nfold_num = 10\n\n# use masters\nevent_master = pl.read_csv(base_data_path + '/'+ \"event_master.csv\")\nevent_important_master = pl.read_csv(base_data_path + '/'+ \"event_important_master.csv\")\nevent_semi_important_master = pl.read_csv(base_data_path + '/'+ \"event_semi_important_master.csv\")\nevent_minor_master = pl.read_csv(base_data_path + '/'+ \"event_minor_master.csv\")\nhover_master = pl.read_csv(base_data_path + '/'+ \"hover_master.csv\")\n\ntext_master = pl.read_csv(base_data_path + '/'+ \"text_master.csv\")\nfqid_master = pl.read_csv(base_data_path + '/'+ \"fqid_master.csv\")\nroom_fqid_master = pl.read_csv(base_data_path + '/'+ \"room_fqid_master.csv\")\ntext_fqid_master = pl.read_csv(base_data_path + '/'+ \"text_fqid_master.csv\")\n\n\nimportant_level_fqid_master = pl.read_csv(base_data_path + '/'+ \"important_level_fqid_master.csv\")\nimportant_level_room_master = pl.read_csv(base_data_path + '/'+ \"important_level_room_master.csv\")\nmin_min_text_id_master = pl.read_csv(base_data_path + '/'+ \"min_min_text_id_master.csv\")\nmin_min_fqid_master = pl.read_csv(base_data_path + '/'+ \"min_min_fqid_master.csv\")\n\ntext_master = text_master.with_columns(pl.col('id_text').cast(str))\nfqid_master = fqid_master.with_columns(pl.col('id_fqid').cast(str))\nroom_fqid_master = room_fqid_master.with_columns(pl.col('id_room_fqid').cast(str))\ntext_fqid_master = text_fqid_master.with_columns(pl.col('id_text_fqid').cast(str))","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:32:18.412647Z","iopub.execute_input":"2023-06-24T06:32:18.413307Z","iopub.status.idle":"2023-06-24T06:32:18.660700Z","shell.execute_reply.started":"2023-06-24T06:32:18.413269Z","shell.execute_reply":"2023-06-24T06:32:18.659615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## model assets","metadata":{}},{"cell_type":"code","source":"def make_model_assets(model_path, model_type = 'lgb'):\n    \n    all_feature_list = []\n    feature_dataframe_dict = {}\n    feature_index_dict = {}\n    model_dict = {}\n    \n    oof_index_dict = {}\n    oof_num_dict = {}\n\n    # features\n    with open(model_path + '/' + 'feature_dict.yaml') as yml:\n        use_feature = yaml.safe_load(yml)\n\n    for t in range(1, 19):\n        for f in range(fold_num):            \n            if model_type == 'lgb':\n                llvm_model = lleaves.Model(model_file=model_path + '/' + f'lgb_target_{t}_fold_{f}.txt')\n                llvm_model.compile(cache = model_path +  '/' + f'lgb_target_{t}_fold_{f}.bin')\n                model_dict[f'model_{t}_{f}'] = llvm_model\n            else:\n                model = CatBoostClassifier()\n                model_dict[f'model_{t}_{f}'] = model.load_model(model_path + '/' + f'cb_target_{t}_fold_{f}.cbm')\n                \n    for t in range(1, 19):\n        for f in range(fold_num):\n            feature_dataframe_dict[f'target_{t}_fold_{f}'] = pl.DataFrame(\n                use_feature[f'target_{t}_fold_{f}'], columns = ['feature'])\n            for i in use_feature[f'target_{t}_fold_{f}']:\n                all_feature_list.append(i)\n    all_feature_list = sorted(list(set(all_feature_list)))\n    all_feature_df = pl.DataFrame(all_feature_list, columns = ['feature'])\n            \n    for t in range(1, 19):\n        for f in range(fold_num):\n            feature_index_dict[f'target_{t}_fold_{f}'] = [all_feature_list.index(i) for i in list(feature_dataframe_dict[f'target_{t}_fold_{f}']['feature']) if i in all_feature_list]\n    \n    for t in range(1,19):\n        for f in range(fold_num):\n            feat_df = pd.DataFrame(use_feature[f'target_{t}_fold_{f}'])\n            feat_df.columns = ['feature']\n            oof_num_list = []\n            oof_index_list = []\n            if t == 1:\n                pass\n            else:\n                for t_2 in range(0,t-1):\n                    try:\n                        oof_index_list.append(feat_df[feat_df['feature'] == f'oof_{t_2}'].index.item())\n                        oof_num_list.append(t_2)\n                    except:\n                        pass\n            oof_index_dict[f'target_{t}_fold_{f}'] = oof_index_list\n            oof_num_dict[f'target_{t}_fold_{f}'] = oof_num_list\n            \n    return  model_dict, all_feature_df, feature_index_dict, oof_index_dict, oof_num_dict","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:32:18.663688Z","iopub.execute_input":"2023-06-24T06:32:18.664564Z","iopub.status.idle":"2023-06-24T06:32:18.686234Z","shell.execute_reply.started":"2023-06-24T06:32:18.664509Z","shell.execute_reply":"2023-06-24T06:32:18.684999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nlgb_model_dict, lgb_all_feature_df, lgb_feature_index_dict, lgb_oof_index_dict, lgb_oof_num_dict = make_model_assets(lgb_model_path_1, model_type = 'lgb')\ncb_model_dict, cb_all_feature_df, cb_feature_index_dict, cb_oof_index_dict, cb_oof_num_dict = make_model_assets(cb_model_path_1, model_type = 'cb')","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:32:18.687580Z","iopub.execute_input":"2023-06-24T06:32:18.688605Z","iopub.status.idle":"2023-06-24T06:33:32.343980Z","shell.execute_reply.started":"2023-06-24T06:32:18.688542Z","shell.execute_reply":"2023-06-24T06:33:32.342982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess(train, cutline_time, text_master, fqid_master, room_fqid_master, text_fqid_master, event_important_master):\n    \n    train = train.join(text_master, on = ['text'], how = 'left')\n    train = train.join(fqid_master, on = ['fqid'], how = 'left')\n    train = train.join(room_fqid_master, on = ['room_fqid'], how = 'left')\n    train = train.join(text_fqid_master, on = ['text_fqid'], how = 'left')\n    \n    train = train.with_columns((pl.col('level').cast(str) + '_' +\n                   pl.col('event_name') + '_' + \n                   pl.col('name') + '_' + \n                   pl.col('id_text') + '_' +\n                   pl.col('id_fqid') + '_' + \n                   pl.col('id_room_fqid') + '_' +\n                   pl.col('id_text_fqid')).alias('event_id'))\n        \n    train = train.join(event_important_master, on = ['event_id'], how = 'left')\n    train = train.with_columns(\n        [pl.col('elapsed_time') / 1000 / 60,\n         pl.col('hover_duration') / 1000 / 60\n        ]).with_columns([\n        (pl.col('elapsed_time') - pl.col('elapsed_time').shift(1).over('session_id')\n        ).fill_null(0).alias('diff_elapsed_time'),\n        pl.col('event_int_id').fill_null(strategy = 'forward').over('session_id')\n        ]\n    ).with_columns(\n    (pl.when(pl.col('diff_elapsed_time') > cutline_time\n            ).then(cutline_time).otherwise(pl.col('diff_elapsed_time'))).alias('diff_elapsed_time')).with_columns(\n        (pl.col('diff_elapsed_time').cumsum().over('session_id')).alias('elapsed_time'))\n    \n    return train","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.345278Z","iopub.execute_input":"2023-06-24T06:33:32.346297Z","iopub.status.idle":"2023-06-24T06:33:32.360861Z","shell.execute_reply.started":"2023-06-24T06:33:32.346257Z","shell.execute_reply":"2023-06-24T06:33:32.359799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_basic_features(train):\n    \n    feature_df = train[['session_id']].unique()\n    \n    level_base_df = train.groupby(['session_id', 'level']).agg([\n        pl.col('diff_elapsed_time').sum().alias('sum_level_elapsed_time'),\n        pl.col('diff_elapsed_time').max().alias('max_level_elapsed_time'),\n        pl.col('diff_elapsed_time').mean().alias('mean_level_elapsed_time'),\n        pl.col('diff_elapsed_time').count().fill_null(0).alias('count_level'),\n        pl.col('elapsed_time').min().alias('start_level_elapsed_time'),\n        pl.col('elapsed_time').max().alias('end_level_elapsed_time'),\n        pl.col('index').min().alias('start_level_index'),\n        pl.col('index').max().alias('end_level_index'),\n        ])\n    \n    level_hover_df = train.filter(pl.col('event_name') == 'object_hover').groupby(['session_id', 'level']).agg([\n        pl.col('hover_duration').sum().alias('sum_hover_time'),\n        pl.col('hover_duration').max().alias('max_hover_time'),\n        pl.col('hover_duration').mean().alias('mean_hover_time'),\n        pl.col('hover_duration').count().fill_null(0).alias('count_level_hover'),\n        (pl.col('index').max() - pl.col('index').min()).alias('max_min_hover_index'),\n        ])\n    \n    fqid_base_df = train.groupby(['session_id', 'fqid']).agg([\n        pl.col('diff_elapsed_time').sum().alias('sum_fqid_elapsed_time'),\n        pl.col('diff_elapsed_time').max().alias('max_fqid_elapsed_time'),\n        pl.col('diff_elapsed_time').mean().alias('mean_fqid_elapsed_time'),\n        pl.col('diff_elapsed_time').count().fill_null(0).alias('count_fqid'),\n        ])\n    \n    room_base_df = train.groupby(['session_id', 'room_fqid']).agg([\n        pl.col('diff_elapsed_time').sum().alias('sum_room_elapsed_time'),\n        pl.col('diff_elapsed_time').max().alias('max_room_elapsed_time'),\n        pl.col('diff_elapsed_time').mean().alias('mean_room_elapsed_time'),\n        pl.col('diff_elapsed_time').count().fill_null(0).alias('count_room'),\n        ])\n\n    text_base_df = train.groupby(['session_id', 'text_fqid']).agg([\n        pl.col('diff_elapsed_time').sum().alias('sum_text_elapsed_time'),\n        pl.col('diff_elapsed_time').max().alias('max_text_elapsed_time'),\n        pl.col('diff_elapsed_time').mean().alias('mean_text_elapsed_time'),\n        pl.col('diff_elapsed_time').count().fill_null(0).alias('count_text'),\n        ])\n    \n    map_base_df = train.filter(pl.col('event_name').is_in(['map_click', 'map_hover'])\n            ).groupby(['session_id', 'level']).agg([\n    pl.col('diff_elapsed_time').sum().alias('level_map_sum_elapsed_time')])\n    \n    # level feat\n    feature_df = feature_df.join(level_base_df.pivot('sum_level_elapsed_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_sum_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(level_base_df.pivot('max_level_elapsed_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_max_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(level_base_df.pivot('mean_level_elapsed_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_mean_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(level_base_df.pivot('count_level', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_count_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(level_base_df.pivot('start_level_elapsed_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('start_level_elapsed_time_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(level_base_df.pivot('end_level_elapsed_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('end_level_elapsed_time_')]), on = 'session_id', how = 'left')\n\n    feature_df = feature_df.join(level_base_df.pivot('start_level_index', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('start_level_index_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(level_base_df.pivot('end_level_index', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('end_level_index_')]), on = 'session_id', how = 'left')\n\n    \n    # hover feat\n    feature_df = feature_df.join(level_hover_df.pivot('sum_hover_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_hover_sum_')]), on = 'session_id', how = 'left')\n\n    feature_df = feature_df.join(level_hover_df.pivot('max_hover_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_hover_max_')]), on = 'session_id', how = 'left')\n                                 \n    feature_df = feature_df.join(level_hover_df.pivot('mean_hover_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_hover_mean_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(level_hover_df.pivot('count_level_hover', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_hover_count_')]), on = 'session_id', how = 'left')\n\n    feature_df = feature_df.join(level_hover_df.pivot('max_min_hover_index', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('max_min_hover_index_')]), on = 'session_id', how = 'left')\n\n    \n    # fqid feat\n    feature_df = feature_df.join(fqid_base_df.pivot('sum_fqid_elapsed_time', 'session_id', 'fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('fqid_sum_')]), on = 'session_id', how = 'left')\n\n    feature_df = feature_df.join(fqid_base_df.pivot('max_fqid_elapsed_time', 'session_id', 'fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('fqid_max_')]), on = 'session_id', how = 'left')\n                                \n    feature_df = feature_df.join(fqid_base_df.pivot('mean_fqid_elapsed_time', 'session_id', 'fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('fqid_mean_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(fqid_base_df.pivot('count_fqid', 'session_id', 'fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('fqid_count_')]), on = 'session_id', how = 'left')\n    \n    \n    # room feat\n    feature_df = feature_df.join(room_base_df.pivot('sum_room_elapsed_time', 'session_id', 'room_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('room_sum_')]), on = 'session_id', how = 'left')\n                                 \n    feature_df = feature_df.join(room_base_df.pivot('max_room_elapsed_time', 'session_id', 'room_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('room_max_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(room_base_df.pivot('mean_room_elapsed_time', 'session_id', 'room_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('room_mean_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(room_base_df.pivot('count_room', 'session_id', 'room_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('room_count_')]), on = 'session_id', how = 'left')\n    \n    \n    # text feat\n    feature_df = feature_df.join(text_base_df.pivot('sum_text_elapsed_time', 'session_id', 'text_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('text_sum_')]), on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(text_base_df.pivot('max_text_elapsed_time', 'session_id', 'text_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('text_max_')]), on = 'session_id', how = 'left')\n                                 \n    feature_df = feature_df.join(text_base_df.pivot('mean_text_elapsed_time', 'session_id', 'text_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('text_mean_')]), on = 'session_id', how = 'left')\n\n    feature_df = feature_df.join(text_base_df.pivot('count_text', 'session_id', 'text_fqid').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('text_count_')]), on = 'session_id', how = 'left')\n    \n    # map feat\n    feature_df = feature_df.join(map_base_df.pivot('level_map_sum_elapsed_time', 'session_id', 'level').select([\n        pl.col('session_id'), pl.exclude('session_id').prefix('level_map_sum_elapsed_time_')]), on = 'session_id', how = 'left')\n\n    return feature_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.362528Z","iopub.execute_input":"2023-06-24T06:33:32.363262Z","iopub.status.idle":"2023-06-24T06:33:32.424625Z","shell.execute_reply.started":"2023-06-24T06:33:32.363224Z","shell.execute_reply":"2023-06-24T06:33:32.423608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_features(train, train_important, train_semi_important, hover_df, nb_time_df, navigate_df, text_df, fqid_df,\n                 important_feature_list, semi_important_feature_list, hover_feature_list, \n                 nb_feature_list, navigate_feature_list, text_feature_list, fqid_feature_list,\n                 ):\n    \n    feature_df = train[['session_id']].unique()\n    \n    for feat in important_feature_list:\n        feature_df = feature_df.join(\n            train_important.pivot(feat, 'session_id', 'event_id').select(\n                pl.col('session_id'), \n                pl.exclude('session_id').prefix(f'{feat}_')), on = 'session_id', how = 'left')\n        \n    for feat in text_feature_list:\n        feature_df = feature_df.join(\n            text_df.pivot(feat, 'session_id', 'level_text_fqid').select(\n                pl.col('session_id'), \n                pl.exclude('session_id').prefix(f'text_{feat}_')), on = 'session_id', how = 'left')\n        \n    for feat in fqid_feature_list:\n        feature_df = feature_df.join(\n            fqid_df.pivot(feat, 'session_id', 'level_fqid').select(\n                pl.col('session_id'), \n                pl.exclude('session_id').prefix(f'fqid_{feat}_')), on = 'session_id', how = 'left')\n        \n    for feat in semi_important_feature_list:\n        feature_df = feature_df.join(\n            train_semi_important.pivot(feat, 'session_id', 'event_id').select(\n                pl.col('session_id'), \n                pl.exclude('session_id').prefix(f'{feat}_')), on = 'session_id', how = 'left')\n        \n    for feat in hover_feature_list:\n        feature_df = feature_df.join(\n            hover_df.pivot(feat, 'session_id', 'event_id').select(\n                pl.col('session_id'), \n                pl.exclude('session_id').prefix(f'{feat}_')), on = 'session_id', how = 'left')\n        \n    for feat in nb_feature_list:\n        feature_df = feature_df.join(\n            nb_time_df.pivot(feat, 'session_id', 'event_int_id').select(\n                pl.col('session_id'), \n                pl.exclude('session_id').prefix(f'{feat}_')), on = 'session_id', how = 'left')\n        \n    for feat in navigate_feature_list:\n        feature_df = feature_df.join(\n            navigate_df.pivot(feat, 'session_id', 'event_int_id').select(\n                pl.col('session_id'), \n                pl.exclude('session_id').prefix(f'{feat}_')), on = 'session_id', how = 'left')\n        \n    return feature_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.429484Z","iopub.execute_input":"2023-06-24T06:33:32.430187Z","iopub.status.idle":"2023-06-24T06:33:32.448686Z","shell.execute_reply.started":"2023-06-24T06:33:32.430145Z","shell.execute_reply":"2023-06-24T06:33:32.447329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_important_data(train, event_important_master):\n\n    train_important = train.join(event_important_master[['event_id']], \n                             on = ['event_id'], \n                             how = 'inner').groupby(['session_id', 'event_id']).agg(\n    [\n     # index\n     pl.col('index').count().alias('count'),\n     pl.col('index').min().alias('min_index'),\n     pl.col('index').max().alias('max_index'),\n    (pl.col('index').max() - pl.col('index').min()).alias('between_index'),\n     \n     # elapsed time\n     pl.col('elapsed_time').min().alias('min_elapsed_time'),\n     pl.col('elapsed_time').max().alias('max_elapsed_time'),\n     (pl.col('elapsed_time').max() - pl.col('elapsed_time').min()).alias('between_elapsed_time'),\n        \n     pl.col('diff_elapsed_time').sum().alias('sum_diff_elapsed_time'),\n     pl.col('diff_elapsed_time').max().alias('max_diff_elapsed_time'),\n     pl.col('diff_elapsed_time').min().alias('min_diff_elapsed_time'),\n        \n     pl.col('room_coor_x').mean().alias('mean_room_coor_x'),\n     pl.col('room_coor_y').mean().alias('mean_room_coor_y'),\n        \n    ]).sort(['session_id', 'min_elapsed_time']).with_columns([\n        # calc diff\n        (pl.col('min_elapsed_time') - pl.col('max_elapsed_time').shift(1).over('session_id')\n         ).alias('diff_min-max-elapsed_time'),\n         (pl.col('min_elapsed_time') - pl.col('min_elapsed_time').shift(1).over('session_id')\n         ).alias('diff_min-min-elapsed_time'),\n        \n         (pl.col('min_index') - pl.col('max_index').shift(1).over('session_id')\n         ).alias('diff_min-max-index'),\n         (pl.col('min_index') - pl.col('min_index').shift(1).over('session_id')\n         ).alias('diff_min-min-index')\n         ])\n\n    \n    return train_important","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.449921Z","iopub.execute_input":"2023-06-24T06:33:32.450312Z","iopub.status.idle":"2023-06-24T06:33:32.469162Z","shell.execute_reply.started":"2023-06-24T06:33:32.450277Z","shell.execute_reply":"2023-06-24T06:33:32.467949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_semi_important_data(train, event_semi_important_master):\n\n    train_semi_important = train.join(\n        event_semi_important_master[['event_id']], on = ['event_id'], how = 'inner'\n        ).groupby(['session_id', 'event_id']).agg([\n            pl.col('index').count().alias('count'),\n            pl.col('index').min().alias('min_index'),\n            pl.col('index').max().alias('max_index'),\n            (pl.col('index').max() - pl.col('index').min()).alias('between_index'),\n\n            pl.col('elapsed_time').min().alias('min_elapsed_time'), \n            pl.col('elapsed_time').max().alias('max_elapsed_time'),\n            (pl.col('elapsed_time').max() - pl.col('elapsed_time').min()).alias('between_elapsed_time'),\n\n            pl.col('diff_elapsed_time').sum().alias('sum_diff_elapsed_time'),\n            pl.col('diff_elapsed_time').max().alias('max_diff_elapsed_time'),\n            pl.col('diff_elapsed_time').min().alias('min_diff_elapsed_time'),\n\n            pl.col('room_coor_x').mean().alias('mean_room_coor_x'),\n            pl.col('room_coor_y').mean().alias('mean_room_coor_y'),\n    ])\n    \n    return train_semi_important","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.470862Z","iopub.execute_input":"2023-06-24T06:33:32.472037Z","iopub.status.idle":"2023-06-24T06:33:32.485273Z","shell.execute_reply.started":"2023-06-24T06:33:32.471993Z","shell.execute_reply":"2023-06-24T06:33:32.484056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_imp_level_fqid(train, important_level_fqid_master):\n    \n    feature_df = train[['session_id']].unique()\n    \n    train_imp_fqid = train.join(important_level_fqid_master, on = ['level', 'fqid'], how = 'inner').groupby(\n        ['session_id', 'level', 'fqid']).agg([\n            pl.col('diff_elapsed_time').sum().alias('important_fqid_sum_elapsed_time'),\n            pl.col('diff_elapsed_time').mean().alias('important_fqid_mean_elapsed_time'),\n            pl.col('diff_elapsed_time').count().alias('important_fqid_count'),\n    ]).with_columns([\n        (pl.col('level').cast(str) + '_' + pl.col('fqid')).alias('level_fqid')\n    ])\n    \n    feature_df = feature_df.join(train_imp_fqid.pivot('important_fqid_sum_elapsed_time', 'session_id', 'level_fqid').select(\n        [pl.col('session_id'), pl.exclude('session_id').prefix('important_fqid_sum_elapsed_time_')]), \n                                 on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(train_imp_fqid.pivot('important_fqid_mean_elapsed_time', 'session_id', 'level_fqid').select(\n        [pl.col('session_id'), pl.exclude('session_id').prefix('important_fqid_mean_elapsed_time_')]), \n                                 on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(train_imp_fqid.pivot('important_fqid_count', 'session_id', 'level_fqid').select(\n        [pl.col('session_id'), pl.exclude('session_id').prefix('important_fqid_count_')]), \n                                 on = 'session_id', how = 'left')\n    \n    return feature_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.486748Z","iopub.execute_input":"2023-06-24T06:33:32.487823Z","iopub.status.idle":"2023-06-24T06:33:32.502379Z","shell.execute_reply.started":"2023-06-24T06:33:32.487780Z","shell.execute_reply":"2023-06-24T06:33:32.500974Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_imp_room_fqid(train, important_level_room_master):\n    \n    feature_df = train[['session_id']].unique()\n    \n    train_imp_fqid = train.join(important_level_room_master, on = ['level', 'room_fqid'], how = 'inner').groupby(\n        ['session_id', 'level', 'room_fqid']).agg([\n            pl.col('diff_elapsed_time').sum().alias('important_room_sum_elapsed_time'),\n            pl.col('diff_elapsed_time').mean().alias('important_room_mean_elapsed_time'),\n            pl.col('diff_elapsed_time').count().alias('important_room_count'),\n    ]).with_columns([\n        (pl.col('level').cast(str) + '_' + pl.col('room_fqid')).alias('level_room')\n    ])\n    \n    feature_df = feature_df.join(train_imp_fqid.pivot('important_room_sum_elapsed_time', 'session_id', 'level_room').select(\n        [pl.col('session_id'), pl.exclude('session_id').prefix('important_room_sum_elapsed_time_')]), \n                                 on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(train_imp_fqid.pivot('important_room_mean_elapsed_time', 'session_id', 'level_room').select(\n        [pl.col('session_id'), pl.exclude('session_id').prefix('important_room_mean_elapsed_time_')]), \n                                 on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(train_imp_fqid.pivot('important_room_count', 'session_id', 'level_room').select(\n        [pl.col('session_id'), pl.exclude('session_id').prefix('important_room_count_')]), \n                                 on = 'session_id', how = 'left')\n    \n    return feature_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.504025Z","iopub.execute_input":"2023-06-24T06:33:32.504398Z","iopub.status.idle":"2023-06-24T06:33:32.525342Z","shell.execute_reply.started":"2023-06-24T06:33:32.504365Z","shell.execute_reply":"2023-06-24T06:33:32.524116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_minor_event_feature(train, event_minor_master):\n    \n    feature_df = train[['session_id']].unique()\n    \n    train_minor_event = train.join(\n        event_minor_master[['event_id']], on = 'event_id', how = 'inner').groupby(\n            ['session_id', 'level']).agg(\n            [pl.col('diff_elapsed_time').sum().alias('minor_event_sum_elapsed_time'), \n             pl.col('diff_elapsed_time').count().alias('minor_event_count')])\n    \n    feature_df = feature_df.join(\n        train_minor_event.pivot('minor_event_sum_elapsed_time', 'session_id', 'level').select(\n            [pl.col('session_id'), \n             pl.exclude('session_id').prefix('minor_event_sum_elapsed_time_')]), \n            on = 'session_id', how = 'left')\n    \n    feature_df = feature_df.join(\n        train_minor_event.pivot('minor_event_count', 'session_id', 'level').select(\n            [pl.col('session_id'), \n             pl.exclude('session_id').prefix('minor_event_count_')]), \n            on = 'session_id', how = 'left')\n    \n    return feature_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.527133Z","iopub.execute_input":"2023-06-24T06:33:32.527520Z","iopub.status.idle":"2023-06-24T06:33:32.542966Z","shell.execute_reply.started":"2023-06-24T06:33:32.527484Z","shell.execute_reply":"2023-06-24T06:33:32.541629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_hover_data(train, hover_master):\n    \n    try:\n        hover_df = train.filter(pl.col('hover_duration').is_not_null()).join(\n            hover_master.drop('level'), on = 'event_id', how = 'inner').groupby(['session_id', 'event_id']).agg(\n            [pl.col('hover_duration').count().alias('count_hover_time'),\n             pl.col('hover_duration').sum().alias('sum_hover_time'),\n             pl.col('hover_duration').max().alias('max_hover_time'),\n             pl.col('hover_duration').min().alias('min_hover_time'),\n             pl.col('hover_duration').mean().alias('mean_hover_time'),\n            ])\n        \n    except:\n        hover_df = pl.DataFrame()\n        hover_df = hover_df.with_columns([\n            pl.lit(train.head(1)['session_id'].item()).cast(pl.Int64).alias('session_id'),\n            pl.lit('null').alias('event_id'),\n            pl.lit(0).cast(pl.Float64).alias('count_hover_time'),\n            pl.lit(0).cast(pl.Float64).alias('sum_hover_time'),\n            pl.lit(0).cast(pl.Float64).alias('max_hover_time'),\n            pl.lit(0).cast(pl.Float64).alias('min_hover_time'),\n            pl.lit(0).cast(pl.Float64).alias('mean_hover_time'),\n            ])\n    \n    return hover_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.544748Z","iopub.execute_input":"2023-06-24T06:33:32.545168Z","iopub.status.idle":"2023-06-24T06:33:32.559547Z","shell.execute_reply.started":"2023-06-24T06:33:32.545127Z","shell.execute_reply":"2023-06-24T06:33:32.558357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_nb_data(train):\n    \n    try:\n        nb_time_df = train.filter((pl.col('event_name') == 'notebook_click') & \n             ((pl.col('name') == 'open') | (pl.col('name') == 'close'))\n            ).with_columns([(pl.col('elapsed_time') - pl.col('elapsed_time').shift(1).over('session_id')).alias('nb_time'),\n            ]).filter(pl.col('name') == 'close').groupby(['session_id', 'event_int_id']).agg(\n        [pl.col('nb_time').sum().alias('sum_nb_open_time'),\n         pl.col('nb_time').count().alias('count_nb_open_time')])\n        \n    except:\n        nb_time_df = pl.DataFrame()\n        nb_time_df = nb_time_df.with_columns([\n            pl.lit(train.head(1)['session_id'].item()).cast(pl.Int64).alias('session_id'),\n            pl.lit('null').alias('event_id'),\n            pl.lit(0).cast(pl.Float64).alias('sum_nb_open_time'),\n            pl.lit(0).cast(pl.Float64).alias('count_nb_open_time'),\n            ])\n    return nb_time_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.561322Z","iopub.execute_input":"2023-06-24T06:33:32.561699Z","iopub.status.idle":"2023-06-24T06:33:32.580319Z","shell.execute_reply.started":"2023-06-24T06:33:32.561663Z","shell.execute_reply":"2023-06-24T06:33:32.579065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_navigate_data(train):\n    navigate_df = train.filter(pl.col('event_name') == \"navigate_click\").groupby(\n    ['session_id', 'event_int_id']).agg([\n        pl.col('diff_elapsed_time').sum().alias('sum_navigate_time'),\n        pl.col('diff_elapsed_time').mean().alias('mean_navigate_time'),\n        pl.col('diff_elapsed_time').max().alias('max_navigate_time'),\n        pl.col('diff_elapsed_time').count().alias('count_navigate_time'),])\n    return navigate_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.581789Z","iopub.execute_input":"2023-06-24T06:33:32.582815Z","iopub.status.idle":"2023-06-24T06:33:32.600599Z","shell.execute_reply.started":"2023-06-24T06:33:32.582777Z","shell.execute_reply":"2023-06-24T06:33:32.599531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_diff_data(train, level_group):\n\n    if level_group == '5-12':\n        diff_df = train.filter((pl.col('level_group') == '0-4') & (pl.col('index') < 600)\n                              ).groupby(['session_id']).agg(pl.col('elapsed_time').max().alias('first_last_time'))\n        diff_df = diff_df.join(train.filter((pl.col('level_group') == '5-12') & (pl.col('index') < 1500)\n                        ).groupby(['session_id']).agg(pl.col('elapsed_time').min().alias('second_first_time'))\n                                             , on = 'session_id', how = 'left')\n        diff_df = diff_df.with_columns((pl.col('second_first_time') - pl.col('first_last_time')).alias('first_diff_feature')\n                                   ).select(['session_id', 'first_diff_feature'])\n        \n    elif level_group == '13-22':\n\n        diff_df = train.filter((pl.col('level_group') == '5-12') & (pl.col('index') < 1500)\n                     ).groupby(['session_id']).agg(pl.col('elapsed_time').max().alias('second_last_time'))\n        diff_df = diff_df.join(train.filter((pl.col('level_group') == '13-22') & (pl.col('index') < 3000)\n                    ).groupby(['session_id']).agg(pl.col('elapsed_time').min().alias('third_first_time')),\n                                         on = 'session_id', how = 'left')\n        diff_df = diff_df.with_columns((pl.col('third_first_time') - pl.col('second_last_time')).alias('second_diff_feature')\n                               ).select(['session_id', 'second_diff_feature'])\n        \n    return diff_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.601973Z","iopub.execute_input":"2023-06-24T06:33:32.602842Z","iopub.status.idle":"2023-06-24T06:33:32.618382Z","shell.execute_reply.started":"2023-06-24T06:33:32.602798Z","shell.execute_reply":"2023-06-24T06:33:32.617131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_text_important_data(train, min_min_text_id_master):\n\n    text_df = train.join(min_min_text_id_master, \n               on = ['level', 'text_fqid'], how = 'inner').groupby(['session_id', 'level', 'text_fqid']).agg([\n         pl.col('index').min().alias('min_index'),\n         pl.col('index').max().alias('max_index'),\n         pl.col('elapsed_time').min().alias('min_elapsed_time'),\n         pl.col('elapsed_time').max().alias('max_elapsed_time')]\n    ).sort(['session_id', 'level', 'min_elapsed_time']).with_columns([\n            # calc diff\n            (pl.col('min_elapsed_time') - pl.col('max_elapsed_time').shift(1).over('session_id')\n             ).alias('diff_min-max-elapsed_time'),\n             (pl.col('min_elapsed_time') - pl.col('min_elapsed_time').shift(1).over('session_id')\n             ).alias('diff_min-min-elapsed_time'),\n\n             (pl.col('min_index') - pl.col('max_index').shift(1).over('session_id')\n             ).alias('diff_min-max-index'),\n             (pl.col('min_index') - pl.col('min_index').shift(1).over('session_id')\n             ).alias('diff_min-min-index')\n            ]).filter(pl.col('diff_min-min-elapsed_time').is_not_null()\n                     ).with_columns((pl.col('level').cast(str) + '_' + pl.col('text_fqid')).alias('level_text_fqid'))\n\n    \n    return text_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.619921Z","iopub.execute_input":"2023-06-24T06:33:32.621183Z","iopub.status.idle":"2023-06-24T06:33:32.636495Z","shell.execute_reply.started":"2023-06-24T06:33:32.621140Z","shell.execute_reply":"2023-06-24T06:33:32.635246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_fqid_important_data(train, min_min_fqid_master):\n\n    fqid_df = train.join(min_min_fqid_master, \n               on = ['level', 'fqid'], how = 'inner').groupby(['session_id', 'level', 'fqid']).agg([\n         pl.col('index').min().alias('min_index'),\n         pl.col('index').max().alias('max_index'),\n         pl.col('elapsed_time').min().alias('min_elapsed_time'),\n         pl.col('elapsed_time').max().alias('max_elapsed_time')]\n    ).sort(['session_id', 'level', 'min_elapsed_time']).with_columns([\n            # calc diff\n            (pl.col('min_elapsed_time') - pl.col('max_elapsed_time').shift(1).over('session_id')\n             ).alias('diff_min-max-elapsed_time'),\n             (pl.col('min_elapsed_time') - pl.col('min_elapsed_time').shift(1).over('session_id')\n             ).alias('diff_min-min-elapsed_time'),\n\n             (pl.col('min_index') - pl.col('max_index').shift(1).over('session_id')\n             ).alias('diff_min-max-index'),\n             (pl.col('min_index') - pl.col('min_index').shift(1).over('session_id')\n             ).alias('diff_min-min-index')\n            ]).filter(pl.col('diff_min-min-elapsed_time').is_not_null()\n                     ).with_columns((pl.col('level').cast(str) + '_' + pl.col('fqid')).alias('level_fqid'))\n\n    \n    return fqid_df","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.638082Z","iopub.execute_input":"2023-06-24T06:33:32.638663Z","iopub.status.idle":"2023-06-24T06:33:32.653881Z","shell.execute_reply.started":"2023-06-24T06:33:32.638624Z","shell.execute_reply":"2023-06-24T06:33:32.652906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"important_feature_list = ['count', 'min_index', 'max_index', 'between_index', \n                          'min_elapsed_time', 'max_elapsed_time', 'between_elapsed_time', \n                          'sum_diff_elapsed_time', 'max_diff_elapsed_time', 'min_diff_elapsed_time',\n                          'diff_min-max-index', 'diff_min-min-index',\n                          'diff_min-max-elapsed_time', 'diff_min-min-elapsed_time',\n                          'mean_room_coor_x', 'mean_room_coor_y'\n                         ]\nsemi_important_feature_list = ['count', 'min_index', 'max_index', 'between_index', \n                               'min_elapsed_time', 'max_elapsed_time', 'between_elapsed_time',\n                               'sum_diff_elapsed_time', 'max_diff_elapsed_time', 'min_diff_elapsed_time',\n                               'mean_room_coor_x', 'mean_room_coor_y'\n                              ]\nhover_feature_list = ['count_hover_time', 'sum_hover_time', 'max_hover_time', 'min_hover_time', 'mean_hover_time']\nnb_feature_list = ['sum_nb_open_time', 'count_nb_open_time']\nnavigate_feature_list = ['sum_navigate_time']\nimportant_text_id_list = ['diff_min-max-elapsed_time', 'diff_min-min-elapsed_time', 'diff_min-max-index','diff_min-min-index',]\nimportant_fqid_list = ['diff_min-max-elapsed_time', 'diff_min-min-elapsed_time', 'diff_min-max-index','diff_min-min-index',]","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:33:32.655296Z","iopub.execute_input":"2023-06-24T06:33:32.656228Z","iopub.status.idle":"2023-06-24T06:33:32.674075Z","shell.execute_reply.started":"2023-06-24T06:33:32.656188Z","shell.execute_reply":"2023-06-24T06:33:32.672696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_prediction(feat, t, model_dict, model_type, feature_index_dict, user_oof_dict, oof_index_dict, oof_num_dict):\n    \n    pred = 0\n    \n    for f in range(fold_num):\n        model = model_dict[f'model_{t}_{f}']\n        feat_f = feat[:,feature_index_dict[f'target_{t}_fold_{f}']]\n\n        if t > 1:\n            oof_pred_np = np.array(user_oof_dict[session_id])\n            feat_f[:,oof_index_dict[f'target_{t}_fold_{f}']] = oof_pred_np[oof_num_dict[f'target_{t}_fold_{f}']]\n        if model_type == 'lgb':\n            pred += model.predict(feat_f) / fold_num\n        else:\n            pred += model.predict_proba(Pool(feat_f))[:,1] / fold_num\n        \n    return pred","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:36:28.059617Z","iopub.execute_input":"2023-06-24T06:36:28.060098Z","iopub.status.idle":"2023-06-24T06:36:28.072695Z","shell.execute_reply.started":"2023-06-24T06:36:28.060059Z","shell.execute_reply":"2023-06-24T06:36:28.071665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\nenv = jo_wilder.make_env()\niter_test = env.iter_test()\n\nprevious_test_dict = {}\n\nlgb_user_oof_dict = {}\ncb_user_oof_dict = {}\n\ndebug = False\ncut_time_dict = {'0-4':3, '5-12':10 , '13-22':20,}\n\nfor (test, sample_submission) in iter_test:\n    \n    test = pl.DataFrame(test)\n    level_group = test['level_group'].head(1).item()\n    session_ids = list(test['session_id'].unique())\n    \n    if debug == True:\n        test = test[5] # debug\n    \n    for session_id in session_ids:\n        \n        test = test.filter(pl.col('session_id') == session_id)\n        print(session_id, level_group)\n        \n        if len(lgb_user_oof_dict.get(session_id, [])) == 0:\n            lgb_user_oof_dict[session_id] = []\n            cb_user_oof_dict[session_id] = []\n        \n        if level_group != '0-4':\n            #print('get test')\n            previous_test = previous_test_dict[session_id]\n            test = pl.concat([test, previous_test])\n            \n        if level_group != '13-22':\n            #print('save test')\n            previous_test_dict[session_id] = test\n        \n        # diff features\n        test = test.sort(['elapsed_time'])\n        test = preprocess(test, cut_time_dict[level_group], text_master, fqid_master, room_fqid_master, text_fqid_master, event_important_master)\n        test_important = make_important_data(test, event_important_master)\n        test_semi_important = make_semi_important_data(test, event_semi_important_master)\n        test_hover = make_hover_data(test, hover_master)\n        test_nb = make_nb_data(test)\n        test_navi = make_navigate_data(test)\n        test_text = make_text_important_data(test, min_min_text_id_master)\n        test_fqid = make_fqid_important_data(test, min_min_fqid_master)        \n        feature_df = make_features(test, test_important, test_semi_important, test_hover, test_nb, test_navi, test_text, test_fqid,\n                                   important_feature_list, semi_important_feature_list, hover_feature_list, \n                                   nb_feature_list, navigate_feature_list, important_text_id_list, important_fqid_list)\n        \n        # base features\n        base_feature_df = make_basic_features(test)\n        base_room_feature = make_imp_room_fqid(test, important_level_room_master)\n        base_minor_feature = make_minor_event_feature(test, event_minor_master)\n        \n        feature_df = feature_df.join(base_feature_df, on = 'session_id', how = 'left')\n        feature_df = feature_df.join(base_room_feature, on = 'session_id', how = 'left')\n        feature_df = feature_df.join(base_minor_feature, on = 'session_id', how = 'left')\n        \n        \n        # imp_level_feature(only level 5 over)\n        if level_group != '0-4':\n            imp_feature = make_imp_level_fqid(test, important_level_fqid_master)\n            feature_df = feature_df.join(imp_feature, on = 'session_id', how = 'left')\n        \n        # add diff\n        if level_group == '5-12':\n            diff_1_df = make_diff_data(test, '5-12')\n            feature_df = feature_df.join(diff_1_df, on = 'session_id', how = 'left')\n        elif level_group == '13-22':\n            diff_1_df = make_diff_data(test, '5-12')\n            diff_2_df = make_diff_data(test, '13-22')\n            feature_df = feature_df.join(diff_1_df, on = 'session_id', how = 'left')\n            feature_df = feature_df.join(diff_2_df, on = 'session_id', how = 'left')\n        \n        # predict\n        feature_t_df = feature_df.transpose(include_header = True)\n        feature_t_df.columns = ['feature', 'value']\n        lgb_feat = lgb_all_feature_df.join(feature_t_df, on = 'feature', how = 'left'\n                                          ).fill_null(0)[['value']].transpose().to_numpy()\n        cb_feat = cb_all_feature_df.join(feature_t_df, on = 'feature', how = 'left'\n                                          ).fill_null(0)[['value']].transpose().to_numpy()\n        \n        # predict loop\n        if level_group == '0-4':\n            \n            group_pred = []\n            lgb_oof_pred = []\n            cb_oof_pred = []\n\n            for t in range(1,4):\n                \n                lgb_pred = make_prediction(lgb_feat, t, lgb_model_dict, 'lgb', lgb_feature_index_dict, lgb_user_oof_dict, lgb_oof_index_dict, lgb_oof_num_dict)\n                cb_pred = make_prediction(cb_feat, t, cb_model_dict, 'cb', cb_feature_index_dict, cb_user_oof_dict, cb_oof_index_dict, cb_oof_num_dict)\n                pred = (lgb_pred * 0.5) + (cb_pred * 0.5)\n                #print(session_id, t, lgb_pred, cb_pred, pred)\n                \n                lgb_oof_pred.append(lgb_pred.item())\n                cb_oof_pred.append(cb_pred.item())\n                \n                lgb_user_oof_dict[session_id] = lgb_oof_pred\n                cb_user_oof_dict[session_id] = cb_oof_pred\n                \n                mask = sample_submission.session_id.str.contains(f'{session_id}_q{t}')\n                sample_submission.loc[mask,'correct'] = int(pred.item() > best_threshold)\n    \n    \n        elif level_group == '5-12':\n            \n            group_pred = []\n            \n            for t in range(4,14):\n                \n                lgb_pred = make_prediction(lgb_feat, t, lgb_model_dict, 'lgb', lgb_feature_index_dict, lgb_user_oof_dict, lgb_oof_index_dict, lgb_oof_num_dict)\n                cb_pred = make_prediction(cb_feat, t, cb_model_dict, 'cb', cb_feature_index_dict, cb_user_oof_dict, cb_oof_index_dict, cb_oof_num_dict)\n                pred = (lgb_pred * 0.5) + (cb_pred * 0.5)\n                #print(session_id, t, lgb_pred, cb_pred, pred)\n                \n                lgb_oof_pred.append(lgb_pred.item())\n                cb_oof_pred.append(cb_pred.item())\n                \n                lgb_user_oof_dict[session_id] = lgb_oof_pred\n                cb_user_oof_dict[session_id] = cb_oof_pred\n                \n                mask = sample_submission.session_id.str.contains(f'{session_id}_q{t}')\n                sample_submission.loc[mask,'correct'] = int(pred.item() > best_threshold)\n                    \n                \n        elif level_group == '13-22':\n            \n            group_pred = []\n\n            for t in range(14,19):\n                \n                lgb_pred = make_prediction(lgb_feat, t, lgb_model_dict, 'lgb', lgb_feature_index_dict, lgb_user_oof_dict, lgb_oof_index_dict, lgb_oof_num_dict)\n                cb_pred = make_prediction(cb_feat, t, cb_model_dict, 'cb', cb_feature_index_dict, cb_user_oof_dict, cb_oof_index_dict, cb_oof_num_dict)\n                pred = (lgb_pred * 0.5) + (cb_pred * 0.5)\n                #print(session_id, t, lgb_pred, cb_pred, pred)\n                \n                lgb_oof_pred.append(lgb_pred.item())\n                cb_oof_pred.append(cb_pred.item())\n                \n                lgb_user_oof_dict[session_id] = lgb_oof_pred\n                cb_user_oof_dict[session_id] = cb_oof_pred\n                \n                mask = sample_submission.session_id.str.contains(f'{session_id}_q{t}')\n                sample_submission.loc[mask,'correct'] = int(pred.item() > best_threshold)\n                        \n                        \n    env.predict(sample_submission)","metadata":{"execution":{"iopub.status.busy":"2023-06-24T06:36:29.832075Z","iopub.execute_input":"2023-06-24T06:36:29.832494Z","iopub.status.idle":"2023-06-24T06:36:36.355289Z","shell.execute_reply.started":"2023-06-24T06:36:29.832456Z","shell.execute_reply":"2023-06-24T06:36:36.353958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}