{"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":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport tensorflow as tf\nimport joblib\n\nprint(\"Tensorflow version:\", tf.__version__)\n\nimport jo_wilder_310\n\nenv = jo_wilder_310.make_env()\niter_test = env.iter_test()\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-08-03T09:28:47.548327Z","iopub.execute_input":"2023-08-03T09:28:47.548728Z","iopub.status.idle":"2023-08-03T09:28:55.900789Z","shell.execute_reply.started":"2023-08-03T09:28:47.548704Z","shell.execute_reply":"2023-08-03T09:28:55.899844Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = {}\n\nfor dirname, _ , filenames in os.walk(\"/kaggle/input/nn-models-normalised/\"):\n    for filename in filenames:\n        if filename.endswith(\".keras\"):\n            models[filename.split('.')[0]] = tf.keras.models.load_model(os.path.join(dirname, filename), compile=True)\n\nprint(models)\n\nscalers = {}\n\nfor dirname, _ , filenames in os.walk(\"/kaggle/input/scalers/\"):\n    for filename in filenames:\n        if filename.endswith(\".save\"):\n            scalers[filename.split('.')[0]] = joblib.load(os.path.join(dirname, filename))\n\nprint(scalers)","metadata":{"execution":{"iopub.status.busy":"2023-08-03T09:28:55.902536Z","iopub.execute_input":"2023-08-03T09:28:55.903175Z","iopub.status.idle":"2023-08-03T09:28:57.823739Z","shell.execute_reply.started":"2023-08-03T09:28:55.903152Z","shell.execute_reply":"2023-08-03T09:28:57.823025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"event_types = ['checkpoint', 'cutscene_click', 'map_click', 'map_hover', \n               'navigate_click', 'notebook_click', 'notification_click', \n               'object_click', 'object_hover', 'observation_click', 'person_click']\n\ndef pre_processing(train):\n    # fill empty numerical values with mean value, and add a dummy column indicating it was NaN\n    for column in ['elapsed_time', 'level', 'page', 'room_coor_x', 'room_coor_y', 'screen_coor_x', 'screen_coor_y',\n                   'hover_duration']:\n        train[column].fillna(train[column].mean(), inplace=True)\n\n    train = train.sort_values(by=['session_id', 'elapsed_time'])\n    train['Time Spent Per Action'] = train.groupby('session_id')['elapsed_time'].diff().fillna(0)\n\n    return train\n\ndef create_features(train):\n    extra_features = []\n\n    # for num in ['Time Spent Per Action', 'level', 'page', 'room_coor_x', 'room_coor_y', 'screen_coor_x',\n    #             'screen_coor_y', 'hover_duration']:\n    #     tmp = train.groupby(['session_id', 'level_group'])[num].agg('mean')\n    #     tmp.name = tmp.name + '_mean'\n    #     extra_features.append(tmp)\n\n    # Make columns for event types, getting their count for a session_id and level_group\n    for event in event_types:\n        tmp = train.groupby(['session_id', 'level_group'])['event_name'].apply(lambda x: (x == event).sum())\n        tmp.name = event + '_sum'\n        tmp = tmp.fillna(0)\n        extra_features.append(tmp)\n\n    # Make columns for following numerical values, getting their mean for a session_id and level_group\n    for num in ['event_name', 'name', 'fqid', 'room_fqid', 'text_fqid']:\n        tmp = train.groupby(['session_id', 'level_group'])[num].agg('nunique')\n        tmp.name = tmp.name + '_nunique'\n        extra_features.append(tmp)\n\n    # Make columns for elapsed time. getting their max for a session_id and level_group\n    tmp = train.groupby(['session_id', 'level_group']).apply(\n        lambda x: x[[\"level_group\", \"elapsed_time\"]][\"elapsed_time\"].max())\n    tmp.name = \"elapsed_time_per_level_group\"\n    tmp = tmp.fillna(0)\n    extra_features.append(tmp)\n\n    train = pd.concat(extra_features, axis=1)\n    \n    for col in train.columns:\n        scaler = scalers[f\"scaler_{col}\"]\n        train[col] = scaler.transform(train[col].to_numpy().reshape(-1, 1))\n        \n    train = train.reset_index()\n    train = train.set_index('session_id')\n\n    return train\n\n\ndef overall(train):\n    # train = pre_processing(train)\n    train = create_features(train)\n    return train  ","metadata":{"execution":{"iopub.status.busy":"2023-08-03T09:28:57.824814Z","iopub.execute_input":"2023-08-03T09:28:57.825184Z","iopub.status.idle":"2023-08-03T09:28:57.834639Z","shell.execute_reply.started":"2023-08-03T09:28:57.825162Z","shell.execute_reply":"2023-08-03T09:28:57.834062Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"limits = {'0-4':(1,4), '5-12':(4,14), '13-22':(14,19)}\n\nfor i, (test, sample_submission) in enumerate(iter_test):    \n    test_df = overall(test)\n    grp = test_df.level_group.values[0]\n    a,b = limits[grp]\n    for t in range(a,b):\n        model = models[f'nn_{t}']\n        test_ds = test_df.loc[:, test_df.columns != 'level_group']\n        predictions = model.predict(test_ds, verbose=0)\n        mask = sample_submission.session_id.str.contains(f'q{t}')\n        n_predictions = (predictions > 0).astype(int)\n        answer = n_predictions.flatten()[0]\n        sample_submission.loc[mask,'correct'] = answer\n    env.predict(sample_submission)","metadata":{"execution":{"iopub.status.busy":"2023-08-03T09:28:57.835524Z","iopub.execute_input":"2023-08-03T09:28:57.835905Z","iopub.status.idle":"2023-08-03T09:29:02.026914Z","shell.execute_reply.started":"2023-08-03T09:28:57.835883Z","shell.execute_reply":"2023-08-03T09:29:02.026091Z"},"trusted":true},"execution_count":null,"outputs":[]}]}