{"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":"# Person Click EDA and feature enginnering (at the end)\n\nCredit where credit is due: [See Chris's Notebook](https://www.kaggle.com/code/cdeotte/game-room-click-eda/notebook), thx @cdeotte for the idea!\n\nIn this notebook, I will **only pay attention to person_click** event name and put boolean filter to see when the user clicked while talking to the character !\n\nYou can use all the boolean filter as a condition like [dataset.event_name == 'person_click'] to count the clicks on/off the character.\n\nHope this notebook helps you find more ideas, Have fun kaggling !\n\n*hide table of content to see plots on their full width!*\n","metadata":{}},{"cell_type":"code","source":"import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport xgboost as xgbe\nfrom PIL import Image\nfrom sklearn.ensemble import IsolationForest\n\nsns.set()\npd.set_option('display.max_column', 200)\n\n\ndtypes={'session_id':np.int64, \n'elapsed_time':np.int32,\n    'event_name':'category',\n    'name':'category',\n    'level':np.uint8,\n    'page':'category',\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'}","metadata":{"id":"HXmstHaMCnHf","_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-02-26T17:21:21.206331Z","iopub.execute_input":"2023-02-26T17:21:21.206777Z","iopub.status.idle":"2023-02-26T17:21:22.658206Z","shell.execute_reply.started":"2023-02-26T17:21:21.206733Z","shell.execute_reply":"2023-02-26T17:21:22.656745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sessions =  pd.read_csv(\"/kaggle/input/predict-student-performance-from-game-play/train.csv\", dtype = dtypes)\n\ndf_final = pd.DataFrame(df_sessions.groupby(['session_id','level_group'])['index'].count()).drop(columns = 'index')","metadata":{"id":"pZZmnO5JCoxi","_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-02-26T17:21:22.660702Z","iopub.execute_input":"2023-02-26T17:21:22.661078Z","iopub.status.idle":"2023-02-26T17:22:31.077179Z","shell.execute_reply.started":"2023-02-26T17:21:22.661041Z","shell.execute_reply":"2023-02-26T17:22:31.076072Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_room_person_click(room, filter1 = True, filter2 = True, filter3 = True, num_filters = 0):\n    \n    if num_filters ==0:\n      df = df_sessions.loc[(df_sessions.event_name=='person_click')\n                    &(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())]\n\n      red_df = df_sessions.loc[(df_sessions.event_name=='none')]\n\n    if num_filters == 1:\n      df = df_sessions.loc[(df_sessions.event_name=='person_click')\n                    &(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())& ~filter1]\n\n      red_df = df_sessions.loc[(df_sessions.event_name=='person_click')\n                    &(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())& filter1]\n\n    if num_filters == 2:\n      df = df_sessions.loc[(df_sessions.event_name=='person_click')\n                    &(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())& ~filter1 & ~filter2]\n\n      red_df = df_sessions.loc[(df_sessions.event_name=='person_click')\n                    &(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())& (filter1 | filter2)]\n\n    if num_filters == 3:\n      df = df_sessions.loc[(df_sessions.event_name=='person_click')\n                    &(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())& ~filter1 & ~filter2 & ~filter3]\n\n      red_df = df_sessions.loc[(df_sessions.event_name=='person_click')\n                    &(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())& (filter1 | filter2 | filter3)]\n\n\n\n    x_min,y_min = df[['room_coor_x','room_coor_y']].min().values\n    x_max,y_max = df[['room_coor_x','room_coor_y']].max().values\n    if len(df)!=0:\n        ITEMS = df.fqid.unique()\n        plt.figure(figsize=(17,17))\n        plt.scatter(df.room_coor_x,df.room_coor_y,s=0.1)\n        plt.scatter(red_df.room_coor_x,red_df.room_coor_y,s=0.1, color ='red')\n        for i in ITEMS:\n            mns = df.loc[df.fqid==i,['room_coor_x','room_coor_y']].mean().values\n            plt.text(mns[0],mns[1],i,fontsize=26)\n        plt.title(room)\n        plt.xlim((x_min,x_max))\n        plt.ylim((y_min,y_max))\n        plt.gca().set_aspect('equal')\n        plt.gca().yaxis.tick_right()\n        plt.show()","metadata":{"id":"I6T-VGCFjdYD","_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-02-26T17:27:30.595861Z","iopub.execute_input":"2023-02-26T17:27:30.597019Z","iopub.status.idle":"2023-02-26T17:27:30.613202Z","shell.execute_reply.started":"2023-02-26T17:27:30.596970Z","shell.execute_reply":"2023-02-26T17:27:30.612136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#tunic.historicalsociety.closet\ngramps_closet_filter = ((df_sessions.room_coor_x > -470) & (df_sessions.room_coor_x < -350) & (df_sessions.room_coor_y > -50) & (df_sessions.room_coor_y < 120))\n\n#tunic.historicalsociety.basement\ngramps_basement_filter = ((df_sessions.room_coor_x > -50) & (df_sessions.room_coor_x < 100) & (df_sessions.room_coor_y > -200) & (df_sessions.room_coor_y < -50))\n\n#tunic.historicalsociety.entry\nboss_entry_filter = ((df_sessions.room_coor_x > 250) & (df_sessions.room_coor_x < 400) & (df_sessions.room_coor_y > 0) & (df_sessions.room_coor_y < 180))\nwells_entry_filter = ((df_sessions.room_coor_x > 50) & (df_sessions.room_coor_x < 200) & (df_sessions.room_coor_y > 0) & (df_sessions.room_coor_y < 180))\n\n#tunic.historicalsociety.collection\n#tunic.historicalsociety.collection_flag\ngramps_tunic_filter = ((df_sessions.room_coor_x > -200) & (df_sessions.room_coor_x < -90) & (df_sessions.room_coor_y > -75) & (df_sessions.room_coor_y < 180))\n\n#tunic.capitol_0.hall\nboss_capitol_filter = ((df_sessions.room_coor_x > 200) & (df_sessions.room_coor_x < 300) & (df_sessions.room_coor_y > -100) & (df_sessions.room_coor_y < 100))\n\n#tunic.historicalsociety.closet_dirty\ngramps_closet_dirty_filter =  ((df_sessions.room_coor_x > -800) & (df_sessions.room_coor_x < -700) & (df_sessions.room_coor_y > -150) & (df_sessions.room_coor_y < 00))\n\n#tunic.historicalsociety.frontdesk\narchivist_filter2 =  ((df_sessions.room_coor_x > -130) & (df_sessions.room_coor_x < 50) & (df_sessions.room_coor_y > 0) & (df_sessions.room_coor_y < 150))\n\n#tunic.humanecology.frontdesk\ntunic_girl_filter = ((df_sessions.room_coor_x > -320) & (df_sessions.room_coor_x < -180) & (df_sessions.room_coor_y > -220) & (df_sessions.room_coor_y < 65))\n\n#tunic.drycleaner.frontdesk\nworker_laudry_filter = ((df_sessions.room_coor_x > -180) & (df_sessions.room_coor_x < -40) & (df_sessions.room_coor_y > -50) & (df_sessions.room_coor_y < 120))\n\n#tunic.library.frontdesk\nworker_library_filter = ((df_sessions.room_coor_x > -450) & (df_sessions.room_coor_x < -350) & (df_sessions.room_coor_y > -20) & (df_sessions.room_coor_y < 260))\n\n#tunic.capitol_1.hall\n#tunic.capitol_2.hall\nboss_capitol1_filter = ((df_sessions.room_coor_x > 200) & (df_sessions.room_coor_x < 280) & (df_sessions.room_coor_y > -100) & (df_sessions.room_coor_y < 100))\n\n#tunic.historicalsociety.cage\nteddy_filter =((df_sessions.room_coor_x > -10) & (df_sessions.room_coor_x < 100) & (df_sessions.room_coor_y > -200) & (df_sessions.room_coor_y < -100))\nglasses_filter = ((df_sessions.room_coor_x > -750) & (df_sessions.room_coor_x < -650) & (df_sessions.room_coor_y > -275) & (df_sessions.room_coor_y < -225))\n\n#tunic.wildlife.center\nwells_filter = ((df_sessions.room_coor_x > -850) & (df_sessions.room_coor_x < -720) & (df_sessions.room_coor_y > -700) & (df_sessions.room_coor_y < -400))\nexpert_filter = ((df_sessions.room_coor_x > 650) & (df_sessions.room_coor_x < 750) & (df_sessions.room_coor_y > -610) & (df_sessions.room_coor_y < -300))\n\n#tunic.flaghouse.entry\nflag_girl_filter = ((df_sessions.room_coor_x > 200) & (df_sessions.room_coor_x < 300) & (df_sessions.room_coor_y > -30) & (df_sessions.room_coor_y < 125))\n\nROOMS_PERSON = ['tunic.historicalsociety.closet','tunic.historicalsociety.basement','tunic.historicalsociety.entry','tunic.historicalsociety.entry','tunic.historicalsociety.collection','tunic.historicalsociety.collection_flag','tunic.capitol_0.hall',\n                'tunic.historicalsociety.closet_dirty','tunic.historicalsociety.frontdesk','tunic.humanecology.frontdesk',\n                'tunic.drycleaner.frontdesk','tunic.library.frontdesk','tunic.capitol_1.hall','tunic.capitol_2.hall',\n                'tunic.historicalsociety.cage','tunic.historicalsociety.cage','tunic.wildlife.center','tunic.wildlife.center',\n                'tunic.flaghouse.entry']\n\nFILTERS_ROOMS_PERSON = [gramps_closet_filter,gramps_basement_filter,boss_entry_filter,wells_entry_filter,gramps_tunic_filter,gramps_tunic_filter,\n                        boss_capitol_filter,gramps_closet_dirty_filter,archivist_filter2,tunic_girl_filter,worker_laudry_filter,\n                        worker_library_filter,boss_capitol1_filter,boss_capitol1_filter,teddy_filter,glasses_filter,wells_filter,expert_filter\n                        ,flag_girl_filter]\n\nFILTERS_ROOMS_PERSON_STR = [\"gramps_closet_filter\",\"gramps_basement_filter\",\"boss_entry_filter\",\"wells_entry_filter\",\"gramps_tunic_filter1\",\"gramps_tunic_filter2\",\n                        \"boss_capitol_filter\",\"gramps_closet_dirty_filter\",\"archivist_filter2\",\"tunic_girl_filter\",\"worker_laudry_filter\",\n                        \"worker_library_filter\",\"boss_capitol1_filter1\",\"boss_capitol1_filter2\",\"teddy_filter\",\"glasses_filter\",\"wells_filter\",\"expert_filter\"\n                        ,\"flag_girl_filter\"]\n\ndd = {}\nPATH = '/kaggle/input/kaggle-game-images/'\ndd['tunic.historicalsociety.closet'] = Image.open(PATH+'closet.png')\ndd['tunic.historicalsociety.basement'] = Image.open(PATH+'basement.png')\ndd['tunic.historicalsociety.entry'] = Image.open(PATH+'entry.png')\ndd['tunic.historicalsociety.collection'] = Image.open(PATH+'collection.png')\ndd['tunic.historicalsociety.stacks'] = Image.open(PATH+'stacks.png')\ndd['tunic.kohlcenter.halloffame'] = Image.open(PATH+'halloffame.png')\ndd['tunic.capitol_0.hall'] = Image.open(PATH+'capitol_hall.png')\ndd['tunic.historicalsociety.closet_dirty'] = Image.open(PATH+'dirty_closet.png')\ndd['tunic.historicalsociety.frontdesk'] = Image.open(PATH+'frontdesk.png')\ndd['tunic.humanecology.frontdesk'] = Image.open(PATH+'humanecology.png')\ndd['tunic.drycleaner.frontdesk'] = Image.open(PATH+'drycleaner.png')\ndd['tunic.library.frontdesk'] = Image.open(PATH+'library.png')\ndd['tunic.library.microfiche'] = Image.open(PATH+'microfiche.png')\ndd['tunic.capitol_1.hall'] = Image.open(PATH+'capitol_hall.png')\ndd['tunic.historicalsociety.cage'] = Image.open(PATH+'cage.png')\ndd['tunic.historicalsociety.collection_flag'] = Image.open(PATH+'collection_flag.png')\ndd['tunic.wildlife.center'] = Image.open(PATH+'wildlife.png')\ndd['tunic.flaghouse.entry'] = Image.open(PATH+'flaghouse.png')\ndd['tunic.capitol_2.hall'] = Image.open(PATH+'capitol_hall.png')","metadata":{"execution":{"iopub.status.busy":"2023-02-26T17:24:46.146208Z","iopub.execute_input":"2023-02-26T17:24:46.146640Z","iopub.status.idle":"2023-02-26T17:24:48.115247Z","shell.execute_reply.started":"2023-02-26T17:24:46.146606Z","shell.execute_reply":"2023-02-26T17:24:48.113856Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# PLOTS ","metadata":{"id":"py5178ns-3t3"}},{"cell_type":"code","source":"for room, filter, filtername in zip(ROOMS_PERSON,FILTERS_ROOMS_PERSON,FILTERS_ROOMS_PERSON_STR):\n    plot_room_person_click(room, filter, num_filters= 1)\n    if room in dd:\n        plt.figure(figsize=(17,17))\n        plt.imshow(dd[room])\n        plt.axis('off')\n        plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-26T17:27:34.269914Z","iopub.execute_input":"2023-02-26T17:27:34.270332Z","iopub.status.idle":"2023-02-26T17:28:04.824857Z","shell.execute_reply.started":"2023-02-26T17:27:34.270295Z","shell.execute_reply":"2023-02-26T17:28:04.823571Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# FEATURES","metadata":{"id":"qTaKjdU3-_jU"}},{"cell_type":"code","source":"#if you see room fqid or filter appear twice its fully intentionnal if you look at the variable assignation, see here:\n#There are rooms who share same filter and filters who share the same room, they are all sorted\nlen(ROOMS_PERSON) == len(FILTERS_ROOMS_PERSON) == len(FILTERS_ROOMS_PERSON_STR)","metadata":{"id":"TUY1hOZWCrVl","outputId":"4cc4fa02-81c9-426c-c715-d0134ad09bab","execution":{"iopub.status.busy":"2023-02-26T17:22:46.210270Z","iopub.execute_input":"2023-02-26T17:22:46.211114Z","iopub.status.idle":"2023-02-26T17:22:46.217942Z","shell.execute_reply.started":"2023-02-26T17:22:46.211068Z","shell.execute_reply":"2023-02-26T17:22:46.216821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for room, filter,filter_name in zip(ROOMS_PERSON,FILTERS_ROOMS_PERSON,FILTERS_ROOMS_PERSON_STR):\n  tmp = df_sessions.loc[(df_sessions.event_name=='person_click')&(df_sessions.room_fqid==room)& (df_sessions.fqid.notna())& filter]\n  df_final[f'clicks_on_{filter_name}'] = tmp.groupby(['session_id','level_group']).size()\n\ndf_final = df_final.fillna(0)\ndf_final.head()","metadata":{"id":"koHJQ54zC7UV","execution":{"iopub.status.busy":"2023-02-26T17:22:46.219608Z","iopub.execute_input":"2023-02-26T17:22:46.220049Z","iopub.status.idle":"2023-02-26T17:22:50.155030Z","shell.execute_reply.started":"2023-02-26T17:22:46.220014Z","shell.execute_reply":"2023-02-26T17:22:50.153686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Let me know if those feature helped your model at all !","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}