{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.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":45533,"databundleVersionId":5533903,"sourceType":"competition"}],"dockerImageVersionId":30380,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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)\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","_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-17T02:25:15.062955Z","iopub.execute_input":"2024-02-17T02:25:15.063634Z","iopub.status.idle":"2024-02-17T02:25:15.107611Z","shell.execute_reply.started":"2024-02-17T02:25:15.063535Z","shell.execute_reply":"2024-02-17T02:25:15.106895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Welcome to kentaro code!!! \n\nI'm the beginer datascientist. \n\nIf you look out miss of my code ,please tell me to teach. ","metadata":{}},{"cell_type":"markdown","source":"# **Object** \nI predict whether answer the question of session.","metadata":{}},{"cell_type":"markdown","source":"# **Overview of this code** \n1. First, I process the data to create model. \n2. create model \n    a. This contest is classification problem. Therefore,I use LGBM(decidetree). \n    b. To increse to model-level, I use GroupKfold. \n3. If I finished creating model, I will select best-model by calculating model's score. \n4. Last, I predict testdata. \n\n※This contest data is big-size!! Therefore, I often delete data in hiden block. Because RAMmemory is destroyed. ","metadata":{}},{"cell_type":"markdown","source":"# **import data**","metadata":{}},{"cell_type":"markdown","source":"object-data delete...\n\nI can't process it...","metadata":{}},{"cell_type":"code","source":"use_cols = [\"session_id\",\"elapsed_time\",\"event_name\",\"name\",\"room_coor_x\",\"room_coor_y\",\"screen_coor_x\",\"screen_coor_y\",\"hover_duration\",\"level\",\"level_group\"]\ndtypes = {\"session_id\":\"int64\",\"elapsed_time\":\"int32\",\"event_name\":\"object\",\"name\":\"object\",\"room_coor_x\":\"float32\",\"room_coor_y\":\"float32\",\"screen_coor_x\":\"float32\",\"screen_coor_y\":\"float32\",\"hover_duration\":\"float32\",\"level\":\"int8\",\"level_group\":\"object\"}","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:25:15.117852Z","iopub.execute_input":"2024-02-17T02:25:15.118447Z","iopub.status.idle":"2024-02-17T02:25:15.123839Z","shell.execute_reply.started":"2024-02-17T02:25:15.118414Z","shell.execute_reply":"2024-02-17T02:25:15.122625Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(\"/kaggle/input/predict-student-performance-from-game-play/train.csv\",usecols = use_cols,dtype=dtypes)","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:25:15.127859Z","iopub.execute_input":"2024-02-17T02:25:15.128260Z","iopub.status.idle":"2024-02-17T02:26:45.517626Z","shell.execute_reply.started":"2024-02-17T02:25:15.128229Z","shell.execute_reply":"2024-02-17T02:26:45.516484Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del use_cols","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:26:45.519544Z","iopub.execute_input":"2024-02-17T02:26:45.519867Z","iopub.status.idle":"2024-02-17T02:26:45.524653Z","shell.execute_reply.started":"2024-02-17T02:26:45.519842Z","shell.execute_reply":"2024-02-17T02:26:45.523480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.head()","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-02-17T02:26:45.526309Z","iopub.execute_input":"2024-02-17T02:26:45.526698Z","iopub.status.idle":"2024-02-17T02:26:45.565375Z","shell.execute_reply.started":"2024-02-17T02:26:45.526664Z","shell.execute_reply":"2024-02-17T02:26:45.564430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.info()","metadata":{"_kg_hide-input":false,"_kg_hide-output":false,"execution":{"iopub.status.busy":"2024-02-17T02:26:45.567410Z","iopub.execute_input":"2024-02-17T02:26:45.567751Z","iopub.status.idle":"2024-02-17T02:26:45.595415Z","shell.execute_reply.started":"2024-02-17T02:26:45.567724Z","shell.execute_reply":"2024-02-17T02:26:45.594494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:26:45.596860Z","iopub.execute_input":"2024-02-17T02:26:45.597395Z","iopub.status.idle":"2024-02-17T02:26:48.369731Z","shell.execute_reply.started":"2024-02-17T02:26:45.597363Z","shell.execute_reply":"2024-02-17T02:26:48.368526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Check column** ","metadata":{}},{"cell_type":"markdown","source":"**fill nulldata**","metadata":{}},{"cell_type":"code","source":"##page\n##df_train[\"page\"].fillna(-1,inplace=True)\n\n##room_coor\ndf_train[\"room_coor_x\"].fillna(0,inplace=True)\ndf_train[\"room_coor_y\"].fillna(0,inplace=True)\n\n##screen_coor\ndf_train[\"screen_coor_x\"].fillna(0,inplace=True)\ndf_train[\"screen_coor_y\"].fillna(0,inplace=True)\n\n##hover_duration\ndf_train[\"hover_duration\"].fillna(0,inplace=True)","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:26:48.371222Z","iopub.execute_input":"2024-02-17T02:26:48.371536Z","iopub.status.idle":"2024-02-17T02:26:48.583967Z","shell.execute_reply.started":"2024-02-17T02:26:48.371513Z","shell.execute_reply":"2024-02-17T02:26:48.583105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\nplt.style.use(\"ggplot\")\n\ndf = pd.DataFrame()","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-02-17T02:26:48.584909Z","iopub.execute_input":"2024-02-17T02:26:48.585349Z","iopub.status.idle":"2024-02-17T02:26:48.593591Z","shell.execute_reply.started":"2024-02-17T02:26:48.585322Z","shell.execute_reply":"2024-02-17T02:26:48.591942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**elapsed time**\n\nhow much time has passed (in milliseconds) between the start of the session and when the event was recorded.\n\nセッションが始まってからイベントが登録されるまでどのくらいの時間がかかるか。(ms)\n\nIn other words, from the difference between the maximum and minimum values of elapsed time, elapsed time for each session can be printed.\n\nつまり、経過時間の最小値と最大値の差から各セッションにかかった時間を出力することが出来る。\n\nAnd each question is caluculated mean of it.\n\nまた、各問題でかかった時間は上で経過時間の平均で求めることが出来る。","metadata":{}},{"cell_type":"code","source":"elapsed_time_group = df_train.groupby([\"session_id\",\"level_group\"])[\"elapsed_time\"].agg([\"max\",\"min\",\"count\",\"sum\"])\n\nelapsed_time_group = elapsed_time_group.reset_index()\nelapsed_time_group[\"elapsed_time_diff\"] = elapsed_time_group[\"max\"] - elapsed_time_group[\"min\"]\nelapsed_time_group[\"elapsed_time_mean\"] = elapsed_time_group[\"elapsed_time_diff\"] / elapsed_time_group[\"count\"]\nelapsed_time_group = elapsed_time_group.rename(columns={\"sum\":\"elapsed_time_sum\"})\n\ndel elapsed_time_group[\"max\"]\ndel elapsed_time_group[\"min\"]\ndel elapsed_time_group[\"count\"]\n\n#print(elapsed_time_group[\"elapsed_time_diff\"].describe())\n#print(\"\\n\")\n#print(elapsed_time_group[\"elapsed_time_mean\"].describe())\n#plt.boxplot(elapsed_time_group[\"elapsed_time_mean\"])\n#plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:26:48.595722Z","iopub.execute_input":"2024-02-17T02:26:48.596167Z","iopub.status.idle":"2024-02-17T02:26:51.872048Z","shell.execute_reply.started":"2024-02-17T02:26:48.596104Z","shell.execute_reply":"2024-02-17T02:26:51.871380Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.concat([df,elapsed_time_group],axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:26:51.875440Z","iopub.execute_input":"2024-02-17T02:26:51.877523Z","iopub.status.idle":"2024-02-17T02:26:51.882464Z","shell.execute_reply.started":"2024-02-17T02:26:51.877468Z","shell.execute_reply":"2024-02-17T02:26:51.881617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del elapsed_time_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:26:51.885532Z","iopub.execute_input":"2024-02-17T02:26:51.885925Z","iopub.status.idle":"2024-02-17T02:26:51.897700Z","shell.execute_reply.started":"2024-02-17T02:26:51.885895Z","shell.execute_reply":"2024-02-17T02:26:51.896879Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**event_name**\n\nthe name of the event type\n\nI process this data by using LabelEncording to chage to int.","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\nle = LabelEncoder()","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-02-17T02:26:51.900719Z","iopub.execute_input":"2024-02-17T02:26:51.902490Z","iopub.status.idle":"2024-02-17T02:26:52.650239Z","shell.execute_reply.started":"2024-02-17T02:26:51.902438Z","shell.execute_reply":"2024-02-17T02:26:52.649203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train[\"event_name\"] = le.fit_transform(df_train[\"event_name\"])\n\nevent_name_group = df_train.groupby([\"session_id\",\"level_group\"])[\"event_name\"].agg(\"mean\")\nevent_name_group = event_name_group.reset_index()\nevent_name_group = event_name_group.rename(columns={\"event_name\":\"event_name_mean\"})\n#plt.boxplot(event_name_group[\"event_name_mean\"])\n#plt.show()\n\ndf = pd.merge(df,event_name_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel event_name_group","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-02-17T02:26:52.651513Z","iopub.execute_input":"2024-02-17T02:26:52.651795Z","iopub.status.idle":"2024-02-17T02:27:00.640568Z","shell.execute_reply.started":"2024-02-17T02:26:52.651761Z","shell.execute_reply":"2024-02-17T02:27:00.639835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**name**\n\nthe event name (e.g. identifies whether a notebook_click is opening or closing the notebook)","metadata":{}},{"cell_type":"code","source":"df_train[\"name\"] = le.fit_transform(df_train[\"name\"])\n\nname_group = df_train.groupby([\"session_id\",\"level_group\"])[\"name\"].agg([\"mean\",\"std\"])\nname_group = name_group.reset_index()\nname_group = name_group.rename(columns={\"mean\":\"name_mean\",\"std\":\"name_std\"})\n\n#plt.boxplot(name_group[\"name_mean\"])\n#plt.show()\n\ndf = pd.merge(df,name_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel name_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:00.641620Z","iopub.execute_input":"2024-02-17T02:27:00.642451Z","iopub.status.idle":"2024-02-17T02:27:09.239067Z","shell.execute_reply.started":"2024-02-17T02:27:00.642424Z","shell.execute_reply":"2024-02-17T02:27:09.238344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**page**\n\nthe page number of the event (only for notebook-related events)\n\n\"only for notebook-related events\"is importance!!!\n\nfillna -1 to NAN!! ","metadata":{}},{"cell_type":"code","source":"#df_train[\"page\"].value_counts().plot.bar()\n\"\"\"df_train[\"page\"] = df_train[\"page\"].fillna(-1)\ndf_train[\"page\"] = df_train[\"page\"].astype(int)\n\npage_group = df_train.groupby([\"session_id\",\"level_group\"])[\"page\"].agg(\"std\")\npage_group = page_group.reset_index()\npage_group = page_group.rename(columns={\"page\":\"page_std\"})\n\n#plt.boxplot(page_group[\"page_mean\"])\n#plt.show()\n\ndf = pd.merge(df,page_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel page_group\"\"\"","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:09.240167Z","iopub.execute_input":"2024-02-17T02:27:09.240953Z","iopub.status.idle":"2024-02-17T02:27:09.246235Z","shell.execute_reply.started":"2024-02-17T02:27:09.240928Z","shell.execute_reply":"2024-02-17T02:27:09.245366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**room_coor_x**\n\nthe coordinates of the click in reference to the in-game room (**only for click events**)\n\nisnull().sum() of room_coor_x and room_coor_y is same.","metadata":{}},{"cell_type":"code","source":"df_train[\"room_coor_x\"].fillna(0,inplace=True)\n\nroom_x_group = df_train.groupby([\"session_id\",\"level_group\"])[\"room_coor_x\"].agg([\"mean\",\"std\",\"max\",\"min\"])\nroom_x_group = room_x_group.reset_index()\nroom_x_group = room_x_group.rename(columns={\"mean\":\"room_x_mean\",\"std\":\"room_x_std\",\"max\":\"room_x_max\",\"min\":\"room_x_min\"})\n\n#plt.boxplot(room_x_group[\"room_x_mean\"])\n#plt.show()\n\ndf = pd.merge(df,room_x_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel room_x_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:09.247291Z","iopub.execute_input":"2024-02-17T02:27:09.247577Z","iopub.status.idle":"2024-02-17T02:27:12.632192Z","shell.execute_reply.started":"2024-02-17T02:27:09.247552Z","shell.execute_reply":"2024-02-17T02:27:12.631023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train[\"room_coor_y\"].fillna(0,inplace=True)\n\nroom_y_group = df_train.groupby([\"session_id\",\"level_group\"])[\"room_coor_y\"].agg([\"mean\",\"max\",\"min\"])\nroom_y_group = room_y_group.reset_index()\nroom_y_group = room_y_group.rename(columns={\"mean\":\"room_y_mean\",\"max\":\"room_y_max\",\"min\":\"room_y_min\"})\n\n#plt.boxplot(room_y_group[\"room_y_mean\"])\n#plt.show()\n\ndf = pd.merge(df,room_y_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel room_y_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:12.633566Z","iopub.execute_input":"2024-02-17T02:27:12.633860Z","iopub.status.idle":"2024-02-17T02:27:15.739386Z","shell.execute_reply.started":"2024-02-17T02:27:12.633836Z","shell.execute_reply":"2024-02-17T02:27:15.737953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**screen_coor_x,y**\n\nthe coordinates of the click in reference to the player’s screen (**only for click events**)\n\nisnull().sum() of screen_coor_x and screen_coor_y is same.","metadata":{}},{"cell_type":"code","source":"#df_train[\"screen_coor_x\"].plot(kind=\"box\")\ndf_train[\"screen_coor_x\"].fillna(0,inplace=True)\n\nscreen_x_group = df_train.groupby([\"session_id\",\"level_group\"])[\"screen_coor_x\"].agg([\"mean\",\"std\"])\nscreen_x_group = screen_x_group.reset_index()\nscreen_x_group = screen_x_group.rename(columns={\"mean\":\"screen_x_mean\",\"std\":\"screen_x_std\"})\n\n#plt.boxplot(screen_x_group[\"screen_x_mean\"])\n#plt.show()\n\ndf = pd.merge(df,screen_x_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel screen_x_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:15.740538Z","iopub.execute_input":"2024-02-17T02:27:15.740801Z","iopub.status.idle":"2024-02-17T02:27:18.688129Z","shell.execute_reply.started":"2024-02-17T02:27:15.740777Z","shell.execute_reply":"2024-02-17T02:27:18.686826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train[\"screen_coor_y\"].fillna(0,inplace=True)\n\nscreen_y_group = df_train.groupby([\"session_id\",\"level_group\"])[\"screen_coor_y\"].agg([\"mean\",\"std\",\"sum\"])\nscreen_y_group = screen_y_group.reset_index()\nscreen_y_group = screen_y_group.rename(columns={\"mean\":\"screen_y_mean\",\"std\":\"screen_y_std\",\"sum\":\"screen_y_sum\"})\n\n#plt.boxplot(screen_y_group[\"screen_y_mean\"])\n#plt.show()\n\ndf = pd.merge(df,screen_y_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel screen_y_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:18.689951Z","iopub.execute_input":"2024-02-17T02:27:18.690271Z","iopub.status.idle":"2024-02-17T02:27:21.871854Z","shell.execute_reply.started":"2024-02-17T02:27:18.690245Z","shell.execute_reply":"2024-02-17T02:27:21.870654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**hover_duration**\n\nhow long (in milliseconds) the hover happened for (**only for hover events**)","metadata":{}},{"cell_type":"code","source":"#df_train[\"hover_duration\"].plot(kind=\"line\")\n#print(df_train[\"hover_duration\"].describe())\ndf_train[\"hover_duration\"].fillna(0,inplace=True)\n\nhover_group = df_train.groupby([\"session_id\",\"level_group\"])[\"hover_duration\"].agg(\"std\")\nhover_group = hover_group.reset_index()\nhover_group = hover_group.rename(columns={\"hover_duration\":\"hover_duration_std\"})\n#plt.boxplot(hover_group[\"hover_duration_mean\"])\n#plt.show()\n\ndf = pd.merge(df,hover_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel hover_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:21.873128Z","iopub.execute_input":"2024-02-17T02:27:21.873396Z","iopub.status.idle":"2024-02-17T02:27:24.580815Z","shell.execute_reply.started":"2024-02-17T02:27:21.873373Z","shell.execute_reply":"2024-02-17T02:27:24.580021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"levels_group = df_train.groupby([\"session_id\",\"level_group\"])[\"level\"].agg(\"mean\")\nlevels_group = levels_group.reset_index()\nlevels_group = levels_group.rename(columns={\"level\":\"level_mean\"})\n\ndf = pd.merge(df,levels_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel levels_group","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:24.581974Z","iopub.execute_input":"2024-02-17T02:27:24.582897Z","iopub.status.idle":"2024-02-17T02:27:27.268500Z","shell.execute_reply.started":"2024-02-17T02:27:24.582834Z","shell.execute_reply":"2024-02-17T02:27:27.267813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"fs_group = df_train.groupby([\"session_id\",\"level_group\"])[\"fullscreen\"].agg(\"mean\")\nfs_group = fs_group.reset_index()\nfs_group = fs_group.rename(columns={\"fullscreen\":\"fs_mean\"})\n\ndf = pd.merge(df,fs_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel fs_group\"\"\"","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.269639Z","iopub.execute_input":"2024-02-17T02:27:27.270718Z","iopub.status.idle":"2024-02-17T02:27:27.276306Z","shell.execute_reply.started":"2024-02-17T02:27:27.270663Z","shell.execute_reply":"2024-02-17T02:27:27.275558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"music_group = df_train.groupby([\"session_id\",\"level_group\"])[\"music\"].agg(\"mean\")\nmusic_group = music_group.reset_index()\nmusic_group = music_group.rename(columns={\"music\":\"music_mean\"})\n\ndf = pd.merge(df,music_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel music_group\"\"\"","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.277449Z","iopub.execute_input":"2024-02-17T02:27:27.278239Z","iopub.status.idle":"2024-02-17T02:27:27.291592Z","shell.execute_reply.started":"2024-02-17T02:27:27.278212Z","shell.execute_reply":"2024-02-17T02:27:27.290490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"hq_group = df_train.groupby([\"session_id\",\"level_group\"])[\"hq\"].agg(\"mean\")\nhq_group = hq_group.reset_index()\nhq_group = hq_group.rename(columns={\"hq\":\"hq_mean\"})\n\ndf = pd.merge(df,hq_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\ndel hq_group\"\"\"","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.292746Z","iopub.execute_input":"2024-02-17T02:27:27.293012Z","iopub.status.idle":"2024-02-17T02:27:27.302952Z","shell.execute_reply.started":"2024-02-17T02:27:27.292989Z","shell.execute_reply":"2024-02-17T02:27:27.301976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**level_group**\n\nwhich group of levels - and group of questions - this row belongs to (0-4, 5-12, 13-22)","metadata":{}},{"cell_type":"markdown","source":"# **Standardization**\n\n","metadata":{}},{"cell_type":"code","source":"column_list = [\"elapsed_time_diff\",\"elapsed_time_mean\",\"elapsed_time_sum\",\"event_name_mean\",\"name_mean\",\"name_std\",\"room_x_mean\",\"room_x_std\",\"room_x_max\",\"room_x_min\",\"room_y_mean\",\"room_y_max\",\"room_y_min\",\"screen_x_mean\",\"screen_x_std\",\"screen_y_mean\",\"screen_y_std\",\"screen_y_sum\",\"hover_duration_std\",\"level_mean\"]","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.304382Z","iopub.execute_input":"2024-02-17T02:27:27.304697Z","iopub.status.idle":"2024-02-17T02:27:27.315995Z","shell.execute_reply.started":"2024-02-17T02:27:27.304669Z","shell.execute_reply":"2024-02-17T02:27:27.314713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.317516Z","iopub.execute_input":"2024-02-17T02:27:27.317847Z","iopub.status.idle":"2024-02-17T02:27:27.346412Z","shell.execute_reply.started":"2024-02-17T02:27:27.317815Z","shell.execute_reply":"2024-02-17T02:27:27.345424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\nsc = StandardScaler()\nsc.fit(df[column_list])\ndf_sc = pd.DataFrame(sc.transform(df[column_list]),columns=column_list)\ndf.update(df_sc)","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.347391Z","iopub.execute_input":"2024-02-17T02:27:27.347894Z","iopub.status.idle":"2024-02-17T02:27:27.388183Z","shell.execute_reply.started":"2024-02-17T02:27:27.347868Z","shell.execute_reply":"2024-02-17T02:27:27.386759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = df.reset_index()\ndf = df.set_index(\"session_id\")\ndf = df.drop([\"index\"],axis=1)\ndf.head()","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-02-17T02:27:27.389896Z","iopub.execute_input":"2024-02-17T02:27:27.390211Z","iopub.status.idle":"2024-02-17T02:27:27.423073Z","shell.execute_reply.started":"2024-02-17T02:27:27.390185Z","shell.execute_reply":"2024-02-17T02:27:27.421839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Processing so far**","metadata":{}},{"cell_type":"markdown","source":"futuristic,Using to process test-data. therefore I write processing so far.","metadata":{}},{"cell_type":"code","source":"def feature_engineer(data):\n\n    \n    df_test = pd.DataFrame()\n    \n    data[\"page\"].fillna(-1,inplace=True)\n\n    data[\"room_coor_x\"].fillna(0,inplace=True)\n    data[\"room_coor_y\"].fillna(0,inplace=True)\n\n    data[\"screen_coor_x\"].fillna(0,inplace=True)\n    data[\"screen_coor_y\"].fillna(0,inplace=True)\n\n    data[\"hover_duration\"].fillna(0,inplace=True)\n\n    elapsed_time_group = data.groupby([\"session_id\",\"level_group\"])[\"elapsed_time\"].agg([\"max\",\"min\",\"count\",\"sum\"])\n\n    elapsed_time_group = elapsed_time_group.reset_index()\n    elapsed_time_group[\"elapsed_time_diff\"] = elapsed_time_group[\"max\"] - elapsed_time_group[\"min\"]\n    elapsed_time_group[\"elapsed_time_mean\"] = elapsed_time_group[\"elapsed_time_diff\"] / elapsed_time_group[\"count\"]\n    elapsed_time_group = elapsed_time_group.rename(columns={\"sum\":\"elapsed_time_sum\"})\n    \n    del elapsed_time_group[\"max\"] \n    del elapsed_time_group[\"min\"]\n    del elapsed_time_group[\"count\"]\n    \n    df_test = pd.concat([df_test,elapsed_time_group],axis=1)\n    \n    data[\"event_name\"] = le.fit_transform(data[\"event_name\"])\n    data[\"name\"] = le.fit_transform(data[\"name\"])\n\n    event_name_group = data.groupby([\"session_id\",\"level_group\"])[\"event_name\"].agg(\"mean\")\n    event_name_group = event_name_group.reset_index()\n    event_name_group = event_name_group.rename(columns={\"event_name\":\"event_name_mean\"})\n\n    df_test = pd.merge(df_test,event_name_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del event_name_group\n    \n    name_group = data.groupby([\"session_id\",\"level_group\"])[\"name\"].agg([\"mean\",\"std\"])\n    name_group = name_group.reset_index()\n    name_group = name_group.rename(columns={\"mean\":\"name_mean\",\"std\":\"name_std\"})\n\n    df_test = pd.merge(df_test,name_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del name_group\n    \n    data[\"page\"] = data[\"page\"].fillna(-1)\n    data[\"page\"] = data[\"page\"].astype(int)\n\n    page_group = data.groupby([\"session_id\",\"level_group\"])[\"page\"].agg(\"std\")\n    page_group = page_group.reset_index()\n    page_group = page_group.rename(columns={\"page\":\"page_std\"})\n\n    df_test = pd.merge(df_test,page_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del page_group\n\n    room_x_group = data.groupby([\"session_id\",\"level_group\"])[\"room_coor_x\"].agg([\"mean\",\"std\",\"max\",\"min\"])\n    room_x_group = room_x_group.reset_index()\n    room_x_group = room_x_group.rename(columns={\"mean\":\"room_x_mean\",\"std\":\"room_x_std\",\"max\":\"room_x_max\",\"min\":\"room_x_min\"})\n\n    df_test = pd.merge(df_test,room_x_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del room_x_group\n\n    room_y_group = data.groupby([\"session_id\",\"level_group\"])[\"room_coor_y\"].agg([\"mean\",\"max\",\"min\"])\n    room_y_group = room_y_group.reset_index()\n    room_y_group = room_y_group.rename(columns={\"mean\":\"room_y_mean\",\"max\":\"room_y_max\",\"min\":\"room_y_min\"})\n\n    df_test = pd.merge(df_test,room_y_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del room_y_group\n\n    screen_x_group = data.groupby([\"session_id\",\"level_group\"])[\"screen_coor_x\"].agg([\"mean\",\"std\"])\n    screen_x_group = screen_x_group.reset_index()\n    screen_x_group = screen_x_group.rename(columns={\"mean\":\"screen_x_mean\",\"std\":\"screen_x_std\"})\n\n    df_test = pd.merge(df_test,screen_x_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del screen_x_group\n\n    screen_y_group = data.groupby([\"session_id\",\"level_group\"])[\"screen_coor_y\"].agg([\"mean\",\"std\",\"sum\"])\n    screen_y_group = screen_y_group.reset_index()\n    screen_y_group = screen_y_group.rename(columns={\"mean\":\"screen_y_mean\",\"std\":\"screen_y_std\",\"sum\":\"screen_y_sum\"})\n\n    df_test = pd.merge(df_test,screen_y_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del screen_y_group\n\n    hover_group = data.groupby([\"session_id\",\"level_group\"])[\"hover_duration\"].agg(\"std\")\n    hover_group = hover_group.reset_index()\n    hover_group = hover_group.rename(columns={\"hover_duration\":\"hover_duration_std\"})\n\n    df_test = pd.merge(df_test,hover_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del hover_group\n    \n    levels_group = data.groupby([\"session_id\",\"level_group\"])[\"level\"].agg(\"mean\")\n    levels_group = levels_group.reset_index()\n    levels_group = levels_group.rename(columns={\"level\":\"level_mean\"})\n\n    df_test = pd.merge(df_test,levels_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del levels_group\n    \n    \"\"\"fs_group = data.groupby([\"session_id\",\"level_group\"])[\"fullscreen\"].agg(\"mean\")\n    fs_group = fs_group.reset_index()\n    fs_group = fs_group.rename(columns={\"fullscreen\":\"fs_mean\"})\n\n    df_test = pd.merge(df_test,fs_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del fs_group\n    \n    music_group = data.groupby([\"session_id\",\"level_group\"])[\"music\"].agg(\"mean\")\n    music_group = music_group.reset_index()\n    music_group = music_group.rename(columns={\"music\":\"music_mean\"})\n\n    df_test = pd.merge(df_test,music_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del music_group\n    \n    hq_group = data.groupby([\"session_id\",\"level_group\"])[\"hq\"].agg(\"mean\")\n    hq_group = hq_group.reset_index()\n    hq_group = hq_group.rename(columns={\"hq\":\"hq_mean\"})\n\n    df_test = pd.merge(df_test,hq_group,on=[\"session_id\",\"level_group\"],how=\"outer\")\n\n    del hq_group\"\"\"\n\n    sc.fit(df_test[column_list])\n    df_sc = pd.DataFrame(sc.transform(df_test[column_list]),columns=column_list)\n    df_test.update(df_sc)\n    \n    df_test = df_test.reset_index()\n    df_test = df_test.set_index(\"session_id\")\n    df_test = df_test.drop([\"index\"],axis=1)\n    \n    return df_test","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-17T02:27:27.428061Z","iopub.execute_input":"2024-02-17T02:27:27.428439Z","iopub.status.idle":"2024-02-17T02:27:27.451781Z","shell.execute_reply.started":"2024-02-17T02:27:27.428415Z","shell.execute_reply":"2024-02-17T02:27:27.450794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# # **train_label edit**","metadata":{}},{"cell_type":"code","source":"df_train_label = pd.read_csv(\"/kaggle/input/predict-student-performance-from-game-play/train_labels.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.452764Z","iopub.execute_input":"2024-02-17T02:27:27.453524Z","iopub.status.idle":"2024-02-17T02:27:27.839866Z","shell.execute_reply.started":"2024-02-17T02:27:27.453494Z","shell.execute_reply":"2024-02-17T02:27:27.839111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_label[\"session\"] = df_train_label[\"session_id\"].str.split(\"_\",expand = True)[0]\ndf_train_label[\"session\"] = df_train_label[\"session\"].astype(int)\ndf_train_label['q'] = df_train_label.session_id.apply(lambda x: int(x.split('_')[-1][1:]) )","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:27.840843Z","iopub.execute_input":"2024-02-17T02:27:27.841844Z","iopub.status.idle":"2024-02-17T02:27:29.200182Z","shell.execute_reply.started":"2024-02-17T02:27:27.841793Z","shell.execute_reply":"2024-02-17T02:27:29.198609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_label.head()","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-02-17T02:27:29.202077Z","iopub.execute_input":"2024-02-17T02:27:29.202994Z","iopub.status.idle":"2024-02-17T02:27:29.212517Z","shell.execute_reply.started":"2024-02-17T02:27:29.202944Z","shell.execute_reply":"2024-02-17T02:27:29.211794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#  **training**","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import KFold, GroupKFold\nfrom lightgbm.sklearn import LGBMRegressor\nfrom sklearn.metrics import f1_score","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:29.213801Z","iopub.execute_input":"2024-02-17T02:27:29.214279Z","iopub.status.idle":"2024-02-17T02:27:30.248586Z","shell.execute_reply.started":"2024-02-17T02:27:29.214249Z","shell.execute_reply":"2024-02-17T02:27:30.246897Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"FEATURES = [c for c in df.columns if c != 'level_group']\nprint(FEATURES)\nALL_USERS = df.index.unique()\nprint(ALL_USERS)","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:27:30.249912Z","iopub.execute_input":"2024-02-17T02:27:30.250253Z","iopub.status.idle":"2024-02-17T02:27:30.259978Z","shell.execute_reply.started":"2024-02-17T02:27:30.250201Z","shell.execute_reply":"2024-02-17T02:27:30.259050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N_FOLDS = 10\n\ngkf = GroupKFold(n_splits=N_FOLDS)\noof = pd.DataFrame(data=np.zeros((len(ALL_USERS),18)), index=ALL_USERS)\nmodels = {}\n\n# COMPUTE CV SCORE WITH N GROUP K FOLD\nfor i, (train_index, test_index) in enumerate(gkf.split(X=df, groups=df.index)):\n    print('#'*25)\n    print('### Fold',i+1)\n    print('#'*25)\n    \n    # ITERATE THRU QUESTIONS 1 THRU 18\n    for t in range(1,19):\n        \n        # USE THIS TRAIN DATA WITH THESE QUESTIONS\n        if t<=3: grp = \"0-4\"\n        elif t<=13: grp = \"5-12\"\n        elif t<=22: grp = \"13-22\"\n            \n        # TRAIN DATA\n        train_x = df.iloc[train_index]\n        train_x = train_x.loc[train_x.level_group == grp]\n        train_users = train_x.index.values\n        train_y = df_train_label.loc[df_train_label.q==t].set_index('session').loc[train_users]\n        \n        # VALID DATA\n        valid_x = df.iloc[test_index]\n        valid_x = valid_x.loc[valid_x.level_group == grp]\n        valid_users = valid_x.index.values\n        valid_y = df_train_label.loc[df_train_label.q==t].set_index('session').loc[valid_users]\n        \n        # TRAIN MODEL\n        model = LGBMRegressor(learning_rate=0.027, \\\n                    num_leaves=15, \\\n                    n_estimators=200, \\\n                    min_child_samples=20, \\\n                    boosting_type='gbdt',\n                    subsample_for_bin=1000,\n                    max_depth=10,\n                    colsample_bytree=0.8)\n        model.fit(train_x[FEATURES].astype('float32'), train_y['correct'])\n        \n        # SAVE MODEL, PREDICT VALID OOF\n        models[f'{i}_{grp}_{t}'] = model\n        oof.loc[valid_users, t-1] = model.predict(valid_x[FEATURES])\n        \n    print()","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-17T02:27:30.261180Z","iopub.execute_input":"2024-02-17T02:27:30.261555Z","iopub.status.idle":"2024-02-17T02:29:10.701733Z","shell.execute_reply.started":"2024-02-17T02:27:30.261531Z","shell.execute_reply":"2024-02-17T02:29:10.701059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"list_1 = {}\nfor i, feat in enumerate(FEATURES):\n    list_1[feat] = model.feature_importances_[i]\nlist_1 = sorted(list_1.items(), key=lambda x:x[1])\nlist_1 = dict(list_1)\n\nplt.figure(figsize=(15, 9))\nplt.legend(fontsize=10)\nplt.tick_params(labelsize=10)\nplt.barh(list(range(len(list_1))), list_1.values(), tick_label=list(list_1.keys()))","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:29:10.705102Z","iopub.execute_input":"2024-02-17T02:29:10.706855Z","iopub.status.idle":"2024-02-17T02:29:10.982232Z","shell.execute_reply.started":"2024-02-17T02:29:10.706810Z","shell.execute_reply":"2024-02-17T02:29:10.980804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# PUT TRUE LABELS INTO DATAFRAME WITH 18 COLUMNS\ntrue = oof.copy()\nfor k in range(18):\n    # GET TRUE LABELS\n    tmp = df_train_label.loc[df_train_label.q == k+1].set_index('session').loc[ALL_USERS]\n    true[k] = tmp.correct.values","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:29:10.983403Z","iopub.execute_input":"2024-02-17T02:29:10.983754Z","iopub.status.idle":"2024-02-17T02:29:11.082158Z","shell.execute_reply.started":"2024-02-17T02:29:10.983729Z","shell.execute_reply":"2024-02-17T02:29:11.080834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# FIND BEST THRESHOLD TO CONVERT PROBS INTO 1s AND 0s\nscores = []; thresholds = []\nbest_score = 0; best_threshold = 0\n\nfor threshold in np.arange(0.4,0.81,0.01):\n    print(f'{threshold:.02f}, ',end='')\n    preds = (oof.values.reshape((-1))>threshold).astype('int')\n    m = f1_score(true.values.reshape((-1)), preds, average='macro')   \n    scores.append(m)\n    thresholds.append(threshold)\n    if m>best_score:\n        best_score = m\n        best_threshold = threshold","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:29:11.083683Z","iopub.execute_input":"2024-02-17T02:29:11.084080Z","iopub.status.idle":"2024-02-17T02:29:15.425687Z","shell.execute_reply.started":"2024-02-17T02:29:11.084055Z","shell.execute_reply":"2024-02-17T02:29:15.424596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# PLOT THRESHOLD VS. F1_SCORE\nplt.figure(figsize=(20,5))\nplt.plot(thresholds,scores,'-o',color='blue')\nplt.scatter([best_threshold], [best_score], color='blue', s=300, alpha=1)\nplt.xlabel('Threshold',size=14)\nplt.ylabel('Validation F1 Score',size=14)\nplt.title(f'Threshold vs. F1_Score with Best F1_Score = {best_score:.4f} at Best Threshold = {best_threshold:.3}',size=18)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:29:15.426868Z","iopub.execute_input":"2024-02-17T02:29:15.427155Z","iopub.status.idle":"2024-02-17T02:29:15.614117Z","shell.execute_reply.started":"2024-02-17T02:29:15.427116Z","shell.execute_reply":"2024-02-17T02:29:15.612543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IMPORT KAGGLE API\nimport jo_wilder\nenv = jo_wilder.make_env()\niter_test = env.iter_test()\n\n# CLEAR MEMORY\nimport gc\ndel df_train_label, df_train,df, oof, true\n_ = gc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:29:15.615437Z","iopub.execute_input":"2024-02-17T02:29:15.615743Z","iopub.status.idle":"2024-02-17T02:29:15.837058Z","shell.execute_reply.started":"2024-02-17T02:29:15.615716Z","shell.execute_reply":"2024-02-17T02:29:15.835913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(qid, grp, test):\n    val = 0\n    for fold in range(N_FOLDS): ##10\n        val += models[f'{fold}_{grp}_{qid}'].predict(test[FEATURES])[0] ##fold->grp_number ,grp->level , qid->question_number\n    return val > best_threshold*N_FOLDS","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:29:15.838452Z","iopub.execute_input":"2024-02-17T02:29:15.838904Z","iopub.status.idle":"2024-02-17T02:29:15.844003Z","shell.execute_reply.started":"2024-02-17T02:29:15.838880Z","shell.execute_reply":"2024-02-17T02:29:15.842938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for (test, sample_submission) in iter_test:\n    \n    # FEATURE ENGINEER TEST DATA\n    df = feature_engineer(test)\n    \n    # INFER TEST DATA\n    grp = test.level_group.values[0]\n    sample_submission['qid'] = sample_submission['session_id'].apply(lambda x: x.split('_')[1][1:]).astype(int)\n    sample_submission['correct'] = sample_submission['qid'].apply(lambda x: predict(x, grp, df)).astype(int)\n    del sample_submission['qid']\n    \n    env.predict(sample_submission)","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:29:15.845652Z","iopub.execute_input":"2024-02-17T02:29:15.845964Z","iopub.status.idle":"2024-02-17T02:29:17.329005Z","shell.execute_reply.started":"2024-02-17T02:29:15.845937Z","shell.execute_reply":"2024-02-17T02:29:17.328051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission.set_index(\"session_id\",inplace=True)","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:31:41.377451Z","iopub.execute_input":"2024-02-17T02:31:41.377840Z","iopub.status.idle":"2024-02-17T02:31:41.382968Z","shell.execute_reply.started":"2024-02-17T02:31:41.377807Z","shell.execute_reply":"2024-02-17T02:31:41.382134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission.to_csv(\"/kaggle/submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-02-17T02:32:23.754425Z","iopub.execute_input":"2024-02-17T02:32:23.754770Z","iopub.status.idle":"2024-02-17T02:32:23.760373Z","shell.execute_reply.started":"2024-02-17T02:32:23.754740Z","shell.execute_reply":"2024-02-17T02:32:23.759562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}