{"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)\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-03-17T05:38:04.492360Z","iopub.execute_input":"2023-03-17T05:38:04.492738Z","iopub.status.idle":"2023-03-17T05:38:04.532124Z","shell.execute_reply.started":"2023-03-17T05:38:04.492686Z","shell.execute_reply":"2023-03-17T05:38:04.531012Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cudf as pd #Change1\nimport numpy as np\nfrom sklearn.model_selection import KFold, GroupKFold\nfrom xgboost import XGBClassifier\nfrom sklearn.metrics import f1_score\nimport matplotlib.pyplot as plt\nfrom tqdm.notebook import tqdm\nfrom collections import defaultdict\nimport warnings\nfrom itertools import combinations\nimport gc\nimport pickle\n\nprint('We will use RAPIDS version',pd.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:04.534388Z","iopub.execute_input":"2023-03-17T05:38:04.535148Z","iopub.status.idle":"2023-03-17T05:38:10.987017Z","shell.execute_reply.started":"2023-03-17T05:38:04.535110Z","shell.execute_reply":"2023-03-17T05:38:10.985490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train.csv')\ntargets = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train_labels.csv')","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:10.989192Z","iopub.execute_input":"2023-03-17T05:38:10.990469Z","iopub.status.idle":"2023-03-17T05:38:39.798983Z","shell.execute_reply.started":"2023-03-17T05:38:10.990423Z","shell.execute_reply":"2023-03-17T05:38:39.797618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"targets['session'] = pd.to_numeric( targets.session_id.str.split('_').list.get(0) ) #Change2\ntargets['q'] = pd.to_numeric( targets.session_id.str.split('_q').list.get(1) ) #Change3","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:39.802283Z","iopub.execute_input":"2023-03-17T05:38:39.802695Z","iopub.status.idle":"2023-03-17T05:38:39.844602Z","shell.execute_reply.started":"2023-03-17T05:38:39.802653Z","shell.execute_reply":"2023-03-17T05:38:39.843511Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 转为普通pandas\ntrainp = train.to_pandas()\ntrainp['time_diff'] = (trainp['elapsed_time'] - trainp.groupby(['session_id','level_group'])['elapsed_time'].shift(1)).clip(0,1e7)  # 前一个时间差\ntrain = pd.DataFrame(trainp)\ntrain.loc[train['time_diff']<0] = 0","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:39.845954Z","iopub.execute_input":"2023-03-17T05:38:39.846514Z","iopub.status.idle":"2023-03-17T05:38:53.283251Z","shell.execute_reply.started":"2023-03-17T05:38:39.846472Z","shell.execute_reply":"2023-03-17T05:38:53.282071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 每个session对应3个level group\n# 每个level group做的feas不一样\ntrain1 = train[train[\"level_group\"]=='0-4']\ntrain2 = train[train[\"level_group\"]=='5-12']\ntrain3 = train[train[\"level_group\"]=='13-22']","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:53.289276Z","iopub.execute_input":"2023-03-17T05:38:53.292361Z","iopub.status.idle":"2023-03-17T05:38:53.480672Z","shell.execute_reply.started":"2023-03-17T05:38:53.292260Z","shell.execute_reply":"2023-03-17T05:38:53.479428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CATS = ['event_name','name','fqid','room_fqid','text_fqid']\nNUMS = ['page', 'room_coor_x','room_coor_y','screen_coor_x','screen_coor_y','hover_duration','time_diff']\n\nEVENTS = ['cutscene_click', 'person_click', 'navigate_click',\n       'observation_click', 'notification_click', 'object_click',\n       'object_hover', 'map_hover', 'map_click', 'checkpoint',\n       'notebook_click']\nNAMES = ['basic', 'undefined', 'close', 'open', 'prev', 'next']","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:53.485683Z","iopub.execute_input":"2023-03-17T05:38:53.488738Z","iopub.status.idle":"2023-03-17T05:38:53.497265Z","shell.execute_reply.started":"2023-03-17T05:38:53.488692Z","shell.execute_reply":"2023-03-17T05:38:53.496134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def feature_engineer(x, grp):\n    x['elapsed_time'] = x['elapsed_time'] / 1000\n    x['time_diff'] = x['time_diff'] / 1000\n\n    # session duration\n    df_final = x.groupby('session_id')['index'].agg('count')\n    df_final.name = 'num_events'\n    df_final = df_final.reset_index()\n    df_final = df_final.set_index('session_id')  # 都是基于session_id分组\n    \n    if grp == '5-12':\n    # 这样做特征的意义是什么捏\n\n        df_final['logbingo-logbook'] = x[(x['fqid'] == 'logbook.page.bingo') & (x['event_name']=='object_click')] \\\n        .groupby('session_id')['index'].agg('first') - x[x['fqid'] == 'logbook'].groupby('session_id')['index'].agg('first')\n\n        df_final['readerbingo-reader'] = \\\n        x[(x['fqid'] == 'reader.paper2.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'index'].agg('first') - x[x['fqid'] == 'reader'].groupby('session_id')['index'].agg('first')\n\n        df_final['jourbingo-journalspic'] = \\\n        x[(x['fqid'] == 'journals.pic_2.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'index'].agg('first') - x[x['fqid'] == 'journals.pic_0.next'].groupby('session_id')['index'].agg('first')\n\n        df_final['logbingo-logbook_time'] = \\\n        x[(x['fqid'] == 'logbook.page.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'elapsed_time'].agg('first') - x[x['fqid'] == 'logbook'].groupby('session_id')['elapsed_time'].agg('first')\n\n        df_final['readerbingo-reader_time'] = \\\n        x[(x['fqid'] == 'reader.paper2.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'elapsed_time'].agg('first') - x[x['fqid'] == 'reader'].groupby('session_id')['elapsed_time'].agg('first')\n\n        df_final['jourbingo-journalspic_time'] = \\\n        x[(x['fqid'] == 'journals.pic_2.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'elapsed_time'].agg('first') - x[x['fqid'] == 'journals.pic_0.next'].groupby('session_id')[\n            'elapsed_time'].agg('first')\n        \n    if grp == '13-22':\n        df_final['readerbingo-reader_flag'] = \\\n        x[(x['fqid'] == 'reader_flag.paper2.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'index'].agg('first') - x[x['fqid'] == 'reader_flag'].groupby('session_id')['index'].agg('first')\n\n        df_final['journalbingo-journals_flag'] = \\\n        x[(x['fqid'] == 'journals_flag.pic_0.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'index'].agg('first') - x[x['fqid'] == 'journals_flag'].groupby('session_id')['index'].agg('first')\n\n        df_final['readerbingo-reader_flag_time'] = \\\n        x[(x['fqid'] == 'reader_flag.paper2.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'elapsed_time'].agg('first') - x[x['fqid'] == 'reader_flag'].groupby('session_id')['elapsed_time'].agg(\n            'first')\n\n        df_final['journalbingo-journals_flag_time'] = \\\n        x[(x['fqid'] == 'journals_flag.pic_0.bingo') & (x['event_name'] == 'object_click')].groupby('session_id')[\n            'elapsed_time'].agg('first') - x[x['fqid'] == 'journals_flag'].groupby('session_id')['elapsed_time'].agg(\n            'first')\n    \n    df_final['first_elapsed_time'] = x.groupby('session_id')['elapsed_time'].agg('first')\n    df_final['elapsed_time'] = x.groupby('session_id')['elapsed_time'].agg('last') - df_final['first_elapsed_time']\n    \n    for c in CATS:\n        df_final[f'{c}_nuniques'] = x.groupby('session_id')[c].agg('nunique')\n    \n    for c in NUMS:\n        df_final[f'{c}_mean'] = x.groupby('session_id')[c].agg('mean')\n        df_final[f'{c}_min'] = x.groupby('session_id')[c].agg('min')\n        df_final[f'{c}_max'] = x.groupby('session_id')[c].agg('max')\n        \n    for c in EVENTS:\n        x[c] = (x.event_name == c).astype('int8')  # 相当于one-hot\n    for c in EVENTS:\n        df_final[f'{c}_sum'] = x.groupby('session_id')[c].agg('sum')\n\n    x.drop(EVENTS, axis=1, inplace=True)\n    for c in EVENTS:\n        df_final[f'{c}_time_mean'] = x[x['event_name'] == c].groupby('session_id')['time_diff'].mean()\n        df_final[f'{c}_time_min'] = x[x['event_name'] == c].groupby('session_id')['time_diff'].min()\n        df_final[f'{c}_time_max'] = x[x['event_name'] == c].groupby('session_id')['time_diff'].max()\n\n    for c in NAMES:\n        x[c] = (x.name == c).astype('int8')\n    for c in NAMES:\n        df_final[f'{c}_sum'] = x.groupby('session_id')[c].agg('sum')\n    x.drop(NAMES, axis=1, inplace=True)\n\n    for c in NAMES:\n        df_final[f'{c}_time_mean'] = x[x['name'] == c].groupby('session_id')['time_diff'].mean()\n        df_final[f'{c}_time_min'] = x[x['name'] == c].groupby('session_id')['time_diff'].min()\n        df_final[f'{c}_time_max'] = x[x['name'] == c].groupby('session_id')['time_diff'].max()\n\n    return df_final","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:53.501885Z","iopub.execute_input":"2023-03-17T05:38:53.505017Z","iopub.status.idle":"2023-03-17T05:38:53.544001Z","shell.execute_reply.started":"2023-03-17T05:38:53.504973Z","shell.execute_reply":"2023-03-17T05:38:53.542865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df1 = feature_engineer(train1.copy(), grp='0-4')\nprint('df1 done')\ndf2 = feature_engineer(train2.copy(), grp='5-12')\nprint('df2 done')\ndf3 = feature_engineer(train3.copy(), grp='13-22')\nprint('df3 done')","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:38:53.549058Z","iopub.execute_input":"2023-03-17T05:38:53.552152Z","iopub.status.idle":"2023-03-17T05:39:03.729837Z","shell.execute_reply.started":"2023-03-17T05:38:53.552102Z","shell.execute_reply":"2023-03-17T05:39:03.727392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df1.shape, df2.shape, df3.shape, train1.shape, train2.shape, train3.shape","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:39:03.737680Z","iopub.execute_input":"2023-03-17T05:39:03.740433Z","iopub.status.idle":"2023-03-17T05:39:03.755974Z","shell.execute_reply.started":"2023-03-17T05:39:03.740385Z","shell.execute_reply":"2023-03-17T05:39:03.754577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"null1 = df1.isnull().sum().sort_values(ascending=False) / len(df1)  # 缺省率 三个dataframe可能是不一样的\nnull2 = df2.isnull().sum().sort_values(ascending=False) / len(df1)\nnull3 = df3.isnull().sum().sort_values(ascending=False) / len(df1)\n\n# 缺省大于90%的drop\ndrop1 = list(null1[null1>0.9].index.to_pandas())\ndrop2 = list(null2[null2>0.9].index.to_pandas())\ndrop3 = list(null3[null3>0.9].index.to_pandas())\nprint(len(drop1), len(drop2), len(drop3))","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:39:03.761532Z","iopub.execute_input":"2023-03-17T05:39:03.764721Z","iopub.status.idle":"2023-03-17T05:39:04.040410Z","shell.execute_reply.started":"2023-03-17T05:39:03.764677Z","shell.execute_reply":"2023-03-17T05:39:04.036140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in tqdm(df1.columns):\n    if df1[col].nunique()==1:\n        print(col)\n        drop1.append(col)\nprint(\"*********df1 DONE*********\")\nfor col in tqdm(df2.columns):\n    if df2[col].nunique()==1:\n        print(col)\n        drop2.append(col)\nprint(\"*********df2 DONE*********\")\nfor col in tqdm(df3.columns):\n    if df3[col].nunique()==1:\n        print(col)\n        drop3.append(col)\nprint(\"*********df3 DONE*********\")","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:39:04.045277Z","iopub.execute_input":"2023-03-17T05:39:04.045691Z","iopub.status.idle":"2023-03-17T05:39:04.746121Z","shell.execute_reply.started":"2023-03-17T05:39:04.045650Z","shell.execute_reply":"2023-03-17T05:39:04.744991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 三个group使用的feas也是不一样\nFEATURES1 = [c for c in df1.columns if c not in drop1+['level_group']]\nFEATURES2 = [c for c in df2.columns if c not in drop2+['level_group','first_index']]\nFEATURES3 = [c for c in df3.columns if c not in drop3+['level_group']]\nprint('We will train with', len(FEATURES1), len(FEATURES2), len(FEATURES3) ,'features')\nALL_USERS = df1.index.unique()\nprint('We will train with', len(ALL_USERS) ,'users info')","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:39:04.753158Z","iopub.execute_input":"2023-03-17T05:39:04.753896Z","iopub.status.idle":"2023-03-17T05:39:04.779763Z","shell.execute_reply.started":"2023-03-17T05:39:04.753855Z","shell.execute_reply":"2023-03-17T05:39:04.778550Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ngkf = GroupKFold(n_splits=5)\noof_xgb = pd.DataFrame(data=np.zeros((len(ALL_USERS),18)), index=ALL_USERS, columns=[f'meta_{i}' for i in range(1, 19)])\nbest_iteration_xgb = defaultdict(list)\nimportance_dict = {}\nfor t in range(1,19):  # 外层是不同的问题\n    if t<=3: \n        grp = '0-4'\n        df = df1\n        FEATURES = FEATURES1\n    elif t<=13: \n        grp = '5-12'\n        df = df2\n        FEATURES = FEATURES2\n    elif t<=22: \n        grp = '13-22'\n        df = df3\n        FEATURES = FEATURES3\n        \n    print('#'*25)\n    print('### question', t, 'with features', len(FEATURES))\n    print('#'*25)\n    \n    xgb_params = {\n        'booster': 'gbtree',\n        'objective': 'binary:logistic',\n        'tree_method': 'gpu_hist', #Change4\n        'eval_metric':'logloss',\n        'learning_rate': 0.02,\n        'alpha': 8,\n        'max_depth': 4,\n        'n_estimators': 9999,\n        'early_stopping_rounds': 90,\n        'subsample':0.8,\n        'colsample_bytree': 0.5,\n        'seed': 42\n    }\n\n    feature_importance_df = pd.DataFrame()\n    # COMPUTE CV SCORE WITH 5 GROUP K FOLD\n    P1 = df.iloc[:,0].to_pandas() #Change5\n    P2 = df.index.to_pandas() #Change6\n    for i, (train_index, test_index) in enumerate(gkf.split(X=P1, groups=P2)): #Change7\n        \n        # TRAIN DATA\n        train_x = df.iloc[train_index]\n        train_users = train_x.index.values  # session\n        train_y = targets.loc[targets.q==t].set_index('session').loc[train_users]\n        \n        # VALID DATA\n        valid_x = df.iloc[test_index]\n        valid_users = valid_x.index.values\n        valid_y = targets.loc[targets.q==t].set_index('session').loc[valid_users]\n        \n        # TRAIN MODEL        \n        clf =  XGBClassifier(**xgb_params)\n        clf.fit(train_x[FEATURES].astype('float32'), train_y['correct'],\n                eval_set=[(valid_x[FEATURES].astype('float32'), valid_y['correct'])],\n                verbose=0)\n        print(i+1, ', ', end='')\n        best_iteration_xgb[str(t)].append(clf.best_ntree_limit)\n        \n        fold_importance_df = pd.DataFrame()\n        fold_importance_df[\"feature\"] = FEATURES\n        fold_importance_df[\"importance\"] = clf.feature_importances_\n        fold_importance_df[\"fold\"] = i + 1\n        feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n        \n        # SAVE MODEL, PREDICT VALID OOF\n        oof_xgb.loc[valid_users, f'meta_{t}'] = clf.predict_proba(valid_x[FEATURES].astype('float32'))[:,1]\n            \n    print()\n    feature_importance_df = feature_importance_df.groupby(['feature'])['importance'].agg(['mean']).sort_values(by='mean', ascending=False)","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:39:04.783833Z","iopub.execute_input":"2023-03-17T05:39:04.786555Z","iopub.status.idle":"2023-03-17T05:41:28.060002Z","shell.execute_reply.started":"2023-03-17T05:39:04.786515Z","shell.execute_reply":"2023-03-17T05:41:28.058502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"true = oof_xgb.copy()\nfor i in range(1, 19):\n    # GET TRUE LABELS\n    tmp = targets.loc[targets.q==i].set_index('session').loc[ALL_USERS]\n    true[f'meta_{i}'] = tmp.correct.values","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:41:28.063762Z","iopub.execute_input":"2023-03-17T05:41:28.064774Z","iopub.status.idle":"2023-03-17T05:41:28.222599Z","shell.execute_reply.started":"2023-03-17T05:41:28.064717Z","shell.execute_reply":"2023-03-17T05:41:28.221363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scores = []\nthresholds = []\nbest_score_xgb = 0\nbest_threshold_xgb = 0\n\nfor threshold in np.arange(0.4,0.81,0.005):\n    print(f'{threshold:.03f}, ',end='')\n    preds = (oof_xgb.to_pandas().values.reshape((-1))>threshold).astype('int') #Change8\n    m = f1_score(true.to_pandas().values.reshape((-1)), preds, average='macro') #Change9\n    scores.append(m)\n    thresholds.append(threshold)\n    if m>best_score_xgb:\n        best_score_xgb = m\n        best_threshold_xgb = threshold","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:41:28.224273Z","iopub.execute_input":"2023-03-17T05:41:28.225572Z","iopub.status.idle":"2023-03-17T05:41:34.777254Z","shell.execute_reply.started":"2023-03-17T05:41:28.225525Z","shell.execute_reply":"2023-03-17T05:41:34.775786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('When using optimal threshold...')\nfor k in range(18):\n    m = f1_score(true[f'meta_{k+1}'].to_pandas().values, (oof_xgb[f'meta_{k+1}'].to_pandas().values>best_threshold_xgb).astype('int'), average='macro') #Change10\n    print(f'Q{k}: F1 =',m)\n    \nm = f1_score(true.to_pandas().values.reshape((-1)), (oof_xgb.to_pandas().values.reshape((-1))>best_threshold_xgb).astype('int'), average='macro') #Change11\nprint('==> Overall F1 =',m)","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:41:34.779197Z","iopub.execute_input":"2023-03-17T05:41:34.779669Z","iopub.status.idle":"2023-03-17T05:41:34.974232Z","shell.execute_reply.started":"2023-03-17T05:41:34.779624Z","shell.execute_reply":"2023-03-17T05:41:34.972091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for t in range(1,19):\n\n    # USE THIS TRAIN DATA WITH THESE QUESTIONS\n    if t<=3: \n        grp = '0-4'\n        df = df1\n        FEATURES = FEATURES1\n    elif t<=13: \n        grp = '5-12'\n        df = df2\n        FEATURES = FEATURES2\n    elif t<=22: \n        grp = '13-22'\n        df = df3\n        FEATURES = FEATURES3\n    \n    n_estimators = int(np.median(best_iteration_xgb[str(t)]) + 1)\n    xgb_params = {\n        'objective': 'binary:logistic',\n        'tree_method': 'gpu_hist',\n        'eval_metric':'logloss',\n        'learning_rate': 0.02,\n        'alpha': 8,\n        'max_depth': 4,\n        'n_estimators': n_estimators,\n        'subsample':0.8,\n        'colsample_bytree': 0.5,\n    }\n    \n    print('#'*25)\n    print(f'### question {t} features {len(FEATURES)}')\n        \n    # TRAIN DATA\n    train_users = df.index.values\n    train_y = targets.loc[targets.q==t].set_index('session').loc[train_users]\n\n    # TRAIN MODEL        \n    clf =  XGBClassifier(**xgb_params)\n    clf.fit(df[FEATURES].astype('float32'), train_y['correct'], verbose=0)\n    clf.save_model(f'XGB_question{t}.xgb')","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:41:34.976000Z","iopub.execute_input":"2023-03-17T05:41:34.976796Z","iopub.status.idle":"2023-03-17T05:41:48.557508Z","shell.execute_reply.started":"2023-03-17T05:41:34.976738Z","shell.execute_reply":"2023-03-17T05:41:48.556374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"importance_dict = {}\nfor t in range(1, 19):\n    if t<=3: \n        importance_dict[str(t)] = FEATURES1\n    elif t<=13: \n        importance_dict[str(t)] = FEATURES2\n    elif t<=22:\n        importance_dict[str(t)] = FEATURES3\n\nf_save = open('importance_dict.pkl', 'wb')\npickle.dump(importance_dict, f_save)\nf_save.close()","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:41:48.558902Z","iopub.execute_input":"2023-03-17T05:41:48.559275Z","iopub.status.idle":"2023-03-17T05:41:48.571040Z","shell.execute_reply.started":"2023-03-17T05:41:48.559236Z","shell.execute_reply":"2023-03-17T05:41:48.570211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pwd","metadata":{"execution":{"iopub.status.busy":"2023-03-17T05:52:24.451680Z","iopub.execute_input":"2023-03-17T05:52:24.452281Z","iopub.status.idle":"2023-03-17T05:52:25.556319Z","shell.execute_reply.started":"2023-03-17T05:52:24.452243Z","shell.execute_reply":"2023-03-17T05:52:25.554959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}