{"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)\nfrom sklearn.model_selection import StratifiedKFold\nimport tensorflow as tf\n\nprint(\"Tensorflow version:\", tf.__version__)\n\nimport jo_wilder_310\n\nenv = jo_wilder_310.make_env()\niter_test = env.iter_test()\n\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-01T13:54:33.565177Z","iopub.execute_input":"2023-08-01T13:54:33.565778Z","iopub.status.idle":"2023-08-01T13:54:43.495669Z","shell.execute_reply.started":"2023-08-01T13:54:33.565745Z","shell.execute_reply":"2023-08-01T13:54:43.494706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtypes={\n    'elapsed_time':np.int32,\n    'event_name':'category',\n    'name':'category',\n    'level':np.uint8,\n    'room_coor_x':np.float32,\n    'room_coor_y':np.float32,\n    'screen_coor_x':np.float32,\n    'screen_coor_y':np.float32,\n    'hover_duration':np.float32,\n    'text':'category',\n    'fqid':'category',\n    'room_fqid':'category',\n    'text_fqid':'category',\n    'fullscreen':'category',\n    'hq':'category',\n    'music':'category',\n    'level_group':'category'}\n\nevent_types = ['navigate_click','person_click','cutscene_click','object_click',\n          'map_hover','notification_click','map_click','observation_click',\n          'checkpoint']\n\ndef create_features(train):\n    extra_features = []\n\n    # Make columns for following numerical values, getting their mean for a session_id and level_group\n    # for num in ['Time Spent Per Action', 'level','page','room_coor_x', 'room_coor_y', 'screen_coor_x', 'screen_coor_y', 'hover_duration']:\n    #     tmp = train.groupby(['session_id', 'level_group'])[num].agg('std')\n    #     tmp.name = tmp.name + '_std'\n    #     extra_features.append(tmp)\n    \n    for num in ['Time Spent Per Action', 'room_coor_x', 'room_coor_y', 'screen_coor_x', '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        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 each event type elapsed time. getting their mean for a session_id and level_group\n    tmp = train.groupby(['session_id', 'level_group']).apply(lambda x: x[[\"level_group\", \"elapsed_time\"]][\"elapsed_time\"].max())\n    tmp.name = \"elapsed_time_per_level_group\"\n    extra_features.append(tmp)\n\n    train = pd.concat(extra_features, axis=1)\n    train = train.fillna(0)\n    train = train.reset_index()\n    train = train.set_index('session_id')\n\n    return train\n\ndef outlier_capping(x, upper, lower):\n    if x > upper:\n        return upper\n    if x < lower:\n        return lower\n    else:\n        return x\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', '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    outliers = ['Time Spent Per Action', 'hover_duration']\n    for outlier in outliers:\n        q1, q3 = np.percentile(train[outlier], [25, 75])\n        iqr = q3 - q1\n        upper_boundary = q3 + iqr * 1.5\n        lower_boundary = q1 - iqr * 1.5\n        train[outlier] = train[outlier].apply(lambda x: outlier_capping(x, upper_boundary, lower_boundary))\n    \n    return train\n","metadata":{"execution":{"iopub.status.busy":"2023-08-01T13:54:43.497338Z","iopub.execute_input":"2023-08-01T13:54:43.498191Z","iopub.status.idle":"2023-08-01T13:54:43.517006Z","shell.execute_reply.started":"2023-08-01T13:54:43.498159Z","shell.execute_reply":"2023-08-01T13:54:43.516012Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = {}\n\nfor dirname, _ , filenames in os.walk(\"/kaggle/input/d/danielyu01/nn-models/\"):\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)","metadata":{"execution":{"iopub.status.busy":"2023-08-01T13:54:43.518472Z","iopub.execute_input":"2023-08-01T13:54:43.518837Z","iopub.status.idle":"2023-08-01T13:54:45.295946Z","shell.execute_reply.started":"2023-08-01T13:54:43.518809Z","shell.execute_reply":"2023-08-01T13:54:45.295185Z"},"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 (test, sample_submission) in iter_test:\n    test_df = pre_processing(test)        \n    test_df = create_features(test_df)\n    #test_df[\"Time Spent Per Action\"] = 0\n    grp = '0-4'\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)\n        mask = sample_submission.session_id.str.contains(f'q{t}')\n        n_predictions = (predictions > 0.63).astype(int)\n        answer = n_predictions.flatten()[0]\n        sample_submission.loc[mask,'correct'] = answer\n        \n    env.predict(sample_submission)","metadata":{"execution":{"iopub.status.busy":"2023-08-01T13:54:45.297857Z","iopub.execute_input":"2023-08-01T13:54:45.298453Z","iopub.status.idle":"2023-08-01T13:54:46.387012Z","shell.execute_reply.started":"2023-08-01T13:54:45.298423Z","shell.execute_reply":"2023-08-01T13:54:46.385474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! head submission.csv","metadata":{"execution":{"iopub.status.busy":"2023-08-01T13:54:46.38804Z","iopub.status.idle":"2023-08-01T13:54:46.389085Z","shell.execute_reply.started":"2023-08-01T13:54:46.38887Z","shell.execute_reply":"2023-08-01T13:54:46.388892Z"},"trusted":true},"execution_count":null,"outputs":[]}]}