{"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":"import numpy as np\nimport pandas as pd\nimport re\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport random\nimport tqdm\n\nprint(f'tf version: {tf.__version__}')\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:51.849383Z","iopub.execute_input":"2022-07-15T05:01:51.849916Z","iopub.status.idle":"2022-07-15T05:01:51.862131Z","shell.execute_reply.started":"2022-07-15T05:01:51.849875Z","shell.execute_reply":"2022-07-15T05:01:51.860191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Fix random seed","metadata":{}},{"cell_type":"code","source":"tf.random.set_seed(6688)\nrandom.seed(6688)\nnp.random.seed(6688)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:51.869708Z","iopub.execute_input":"2022-07-15T05:01:51.870555Z","iopub.status.idle":"2022-07-15T05:01:51.876940Z","shell.execute_reply.started":"2022-07-15T05:01:51.870508Z","shell.execute_reply":"2022-07-15T05:01:51.875318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load data","metadata":{}},{"cell_type":"code","source":"df_full = pd.read_csv('/kaggle/input/titanic/train.csv')\ndf_valid = pd.read_csv('/kaggle/input/titanic/test.csv')\n\ndf_full","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:51.884987Z","iopub.execute_input":"2022-07-15T05:01:51.886057Z","iopub.status.idle":"2022-07-15T05:01:51.927813Z","shell.execute_reply.started":"2022-07-15T05:01:51.885995Z","shell.execute_reply":"2022-07-15T05:01:51.926551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define utils functions","metadata":{}},{"cell_type":"markdown","source":"## Normalize ticker number","metadata":{}},{"cell_type":"code","source":"def normalize_ticket(ticket_data):\n    ticket_data = ticket_data.split()[0]\n    ticket_data = re.sub('^\\d+$', 'normal', ticket_data)\n    ticket_data = re.sub('\\.|/', '', ticket_data)\n    return ticket_data","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:51.929849Z","iopub.execute_input":"2022-07-15T05:01:51.930714Z","iopub.status.idle":"2022-07-15T05:01:51.937395Z","shell.execute_reply.started":"2022-07-15T05:01:51.930662Z","shell.execute_reply":"2022-07-15T05:01:51.936188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Statistic of missing value","metadata":{}},{"cell_type":"code","source":"def statMissingValue(X):\n    lstSummary = []\n    for col in X.columns:\n        liTotal = len(X.index)\n        liMissing = X[col].isna().sum()\n        lfMissingRate = round(liMissing * 100/liTotal,2)\n        liZero = 0\n        liNUnique = X[col].nunique()\n        if(X[col].dtype!='object'):\n            liZero = X[col].isin([0]).sum()\n        lfZeroRate = round(liZero*100/liTotal,2)\n        lstSummary.append([col,str(X[col].dtype),liTotal, liNUnique, liMissing, lfMissingRate,liZero,lfZeroRate])    \n    return pd.DataFrame(lstSummary,columns=['feature','col_type','total', 'unique', 'na','na_rate','zero','zero_rate'])\n","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:51.938987Z","iopub.execute_input":"2022-07-15T05:01:51.939705Z","iopub.status.idle":"2022-07-15T05:01:51.952643Z","shell.execute_reply.started":"2022-07-15T05:01:51.939654Z","shell.execute_reply":"2022-07-15T05:01:51.951138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA","metadata":{}},{"cell_type":"markdown","source":"## Review statistic on each feature","metadata":{}},{"cell_type":"code","source":"df_stat = statMissingValue(df_full)\nprint(df_stat.feature.to_list())\ndf_stat","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:51.955516Z","iopub.execute_input":"2022-07-15T05:01:51.955945Z","iopub.status.idle":"2022-07-15T05:01:51.996614Z","shell.execute_reply.started":"2022-07-15T05:01:51.955911Z","shell.execute_reply":"2022-07-15T05:01:51.995602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We notice that:\n- \"Pclass\" has only 3 unique value so it mustbe categorical type. Same for \"Sex\", \"Embarked\".\n- \"Ticket\" seems useless but if we split it, keep only first chunk (remove numeric part), it looks like categorial type.\n- \"Parch\", \"SibSp\" are numeric type due to their definition.\n- \"Name\" looks messy. We extract only the title part.","metadata":{}},{"cell_type":"markdown","source":"Plot the missing value rate of each feature","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(20,4))\nplt.barh(df_stat.feature, df_stat.na_rate, label='na rate (%)')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:51.998627Z","iopub.execute_input":"2022-07-15T05:01:51.999283Z","iopub.status.idle":"2022-07-15T05:01:52.246412Z","shell.execute_reply.started":"2022-07-15T05:01:51.999243Z","shell.execute_reply":"2022-07-15T05:01:52.244773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- \"Cabin\" looks bad and need to remove instead of doing imputation.\n- \"Age\" has only about 20% missing value and can be impute.\n- \"Embarked\" has 0.22% of missing value and very good to impute.","metadata":{}},{"cell_type":"markdown","source":"## Define columns ","metadata":{}},{"cell_type":"code","source":"col_id = ['PassengerId']\ncol_target = ['Survived']\ncol_cat_small = ['Pclass', 'Sex', 'Embarked','Name']\ncol_cat_big = ['Ticket','Cabin']\ncol_cat = col_cat_big + col_cat_small\ncol_num = ['Age', 'SibSp', 'Parch', 'Fare']","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.248682Z","iopub.execute_input":"2022-07-15T05:01:52.250190Z","iopub.status.idle":"2022-07-15T05:01:52.257921Z","shell.execute_reply.started":"2022-07-15T05:01:52.250137Z","shell.execute_reply":"2022-07-15T05:01:52.256363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Simple preprocess function","metadata":{}},{"cell_type":"code","source":"def simple_preprocess(X):\n    df_ret =  X.copy()\n    df_ret['Ticket']  = df_ret['Ticket'].apply(lambda x:normalize_ticket(x))\n    df_ret['Name'] = df_ret['Name'].str.extract(r', (\\w+\\.)')\n    df_ret[df_ret.Cabin.isna()] = 'null_value'\n    return df_ret","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.261348Z","iopub.execute_input":"2022-07-15T05:01:52.261978Z","iopub.status.idle":"2022-07-15T05:01:52.274440Z","shell.execute_reply.started":"2022-07-15T05:01:52.261917Z","shell.execute_reply":"2022-07-15T05:01:52.272696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Review data and statistic after simple preprocess","metadata":{}},{"cell_type":"code","source":"simple_preprocess(df_full)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.276095Z","iopub.execute_input":"2022-07-15T05:01:52.277727Z","iopub.status.idle":"2022-07-15T05:01:52.336677Z","shell.execute_reply.started":"2022-07-15T05:01:52.277628Z","shell.execute_reply":"2022-07-15T05:01:52.335151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"statMissingValue(simple_preprocess(df_full))","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.338367Z","iopub.execute_input":"2022-07-15T05:01:52.338807Z","iopub.status.idle":"2022-07-15T05:01:52.386493Z","shell.execute_reply.started":"2022-07-15T05:01:52.338767Z","shell.execute_reply":"2022-07-15T05:01:52.384888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# simple_preprocess(df_full).Name.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.388309Z","iopub.execute_input":"2022-07-15T05:01:52.388727Z","iopub.status.idle":"2022-07-15T05:01:52.394926Z","shell.execute_reply.started":"2022-07-15T05:01:52.388689Z","shell.execute_reply":"2022-07-15T05:01:52.393287Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Fill in missing value from random","metadata":{}},{"cell_type":"code","source":"def fill_na_with_random(df_ref, df_na):\n    df_ret = df_na.copy()\n    for col in df_ret.columns:\n        ret_nan = df_ret[col][df_ret[col].isna()]\n        ref_n_nan = df_ref[~df_ref[col].isna()][col]\n        \n        df_ret[col].loc[df_ret[col].isna()] = np.random.choice(ref_n_nan,size=len(ret_nan))\n    return df_ret\n\n# fill_na_with_random(df_xtrain, df_xtrain)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.397185Z","iopub.execute_input":"2022-07-15T05:01:52.398135Z","iopub.status.idle":"2022-07-15T05:01:52.409739Z","shell.execute_reply.started":"2022-07-15T05:01:52.398053Z","shell.execute_reply":"2022-07-15T05:01:52.408584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create noisy data by using permutate data in each column","metadata":{}},{"cell_type":"code","source":"def make_noisy(np_data):\n    np_ret = np.copy(np_data)\n    for i in range(np_ret.shape[1]):\n        np.random.shuffle(np_ret[:,i])\n    return np_ret","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.414468Z","iopub.execute_input":"2022-07-15T05:01:52.415428Z","iopub.status.idle":"2022-07-15T05:01:52.424694Z","shell.execute_reply.started":"2022-07-15T05:01:52.415378Z","shell.execute_reply":"2022-07-15T05:01:52.423522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"markdown","source":"## Split dataset","metadata":{}},{"cell_type":"code","source":"x_full = df_full[col_num+col_cat]\ny_full = df_full[col_target]\n\nx_valid = df_valid[col_num+col_cat]\n\nx_train, x_test, y_train, y_test = train_test_split(x_full, y_full, test_size=0.25, random_state=6668)\n\nx_ref = x_train.copy()\n\nx_train = fill_na_with_random(x_ref, x_train)\nx_test = fill_na_with_random(x_ref, x_test)\nx_valid = fill_na_with_random(x_ref, x_valid)\n\nx_train = simple_preprocess(x_train)\nx_test = simple_preprocess(x_test)\nx_valid = simple_preprocess(x_valid)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.426395Z","iopub.execute_input":"2022-07-15T05:01:52.427851Z","iopub.status.idle":"2022-07-15T05:01:52.530189Z","shell.execute_reply.started":"2022-07-15T05:01:52.427769Z","shell.execute_reply":"2022-07-15T05:01:52.528773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Encode category pipeline ","metadata":{}},{"cell_type":"code","source":"from sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.preprocessing import LabelEncoder,OrdinalEncoder,StandardScaler\nfrom sklearn.preprocessing import PowerTransformer\nimport category_encoders as ce\nfrom xgboost import XGBClassifier\nimport lightgbm\n\n# Preprocessing for numerical data\nnumerical_transformer = Pipeline(verbose=False,steps=[\n    ('scale', StandardScaler(with_mean=True,with_std=True)),\n])\n\n# Preprocessing for categorical data\ncategorical_onehot_transformer = Pipeline(verbose=False,steps=[\n    ('onehot', OneHotEncoder(handle_unknown='ignore'))\n])\n\ncategorical_count_transformer = Pipeline(verbose=False,steps=[\n    ('count', ce.CountEncoder(min_group_size = 3)),\n    ('scale', StandardScaler(with_mean=True,with_std=True)),\n])\n\n# Bundle preprocessing for numerical and categorical data\npreprocessor = ColumnTransformer(verbose=False,\n    transformers=[\n        ('pre_cat_count', categorical_count_transformer, col_cat_big),\n        ('pre_cat_onehot', categorical_onehot_transformer, col_cat_small),\n        ('pre_num', numerical_transformer, col_num),\n    ])","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:52.532287Z","iopub.execute_input":"2022-07-15T05:01:52.533340Z","iopub.status.idle":"2022-07-15T05:01:54.267805Z","shell.execute_reply.started":"2022-07-15T05:01:52.533282Z","shell.execute_reply":"2022-07-15T05:01:54.266350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Execute encode category process","metadata":{}},{"cell_type":"code","source":"preprocessor.fit(x_train)\nx_train_encoded =  preprocessor.transform(x_train)\nx_test_encoded = preprocessor.transform(x_test)\nx_valid_encoded = preprocessor.transform(x_valid)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:54.269786Z","iopub.execute_input":"2022-07-15T05:01:54.270496Z","iopub.status.idle":"2022-07-15T05:01:54.380114Z","shell.execute_reply.started":"2022-07-15T05:01:54.270434Z","shell.execute_reply":"2022-07-15T05:01:54.378885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Impute missing value using auto encoder","metadata":{}},{"cell_type":"code","source":"input_dim = x_train_encoded.shape[1]\nmodel_impute = keras.Sequential()\nmodel_impute.add(layers.Dense(20,activation='gelu', input_dim=input_dim, kernel_initializer='he_uniform'))\nmodel_impute.add(layers.Dense(16,activation='gelu', kernel_initializer='he_uniform'))\nmodel_impute.add(layers.Dense(10,activation='gelu', kernel_initializer='he_uniform', name='bottleneck'))\nmodel_impute.add(layers.Dense(16,activation='gelu', kernel_initializer='he_uniform'))\nmodel_impute.add(layers.Dense(20,activation='gelu', kernel_initializer='he_uniform'))\nmodel_impute.add(layers.Dense(input_dim,activation='linear', kernel_initializer='he_uniform'))\n\noptimizer = keras.optimizers.Adam(learning_rate=0.03)\nmodel_impute.compile(optimizer = optimizer, loss = 'msle')\nmodel_impute.summary()\n","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:54.381665Z","iopub.execute_input":"2022-07-15T05:01:54.382088Z","iopub.status.idle":"2022-07-15T05:01:54.633697Z","shell.execute_reply.started":"2022-07-15T05:01:54.382038Z","shell.execute_reply":"2022-07-15T05:01:54.629872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.keras.utils.plot_model(model_impute, show_shapes=True,rankdir='LR')","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:54.635675Z","iopub.execute_input":"2022-07-15T05:01:54.636227Z","iopub.status.idle":"2022-07-15T05:01:55.928321Z","shell.execute_reply.started":"2022-07-15T05:01:54.636164Z","shell.execute_reply":"2022-07-15T05:01:55.926346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = tf.keras.callbacks.EarlyStopping(monitor='loss', mode='min', verbose=1, patience=50)\n\nnoise_X = make_noisy(x_train_encoded)\n# noise_X = np.concatenate((noise_X, make_noisy(noise_X)), axis=0)\nnoise_X = np.concatenate((noise_X, np.copy(x_train_encoded)), axis=0)\n\nhis = model_impute.fit(noise_X, noise_X, epochs = 2000, batch_size = 512, shuffle = True, callbacks=[es], verbose=0)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:01:55.930563Z","iopub.execute_input":"2022-07-15T05:01:55.931570Z","iopub.status.idle":"2022-07-15T05:02:13.640053Z","shell.execute_reply.started":"2022-07-15T05:01:55.931507Z","shell.execute_reply":"2022-07-15T05:02:13.638526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Plot learning curve","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12,8))\nplt.plot(his.epoch,his.history['loss'], label='loss', linewidth=2)\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:13.642197Z","iopub.execute_input":"2022-07-15T05:02:13.643438Z","iopub.status.idle":"2022-07-15T05:02:13.871851Z","shell.execute_reply.started":"2022-07-15T05:02:13.643377Z","shell.execute_reply":"2022-07-15T05:02:13.870505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create final dataset with impute missing value by auto encoder","metadata":{}},{"cell_type":"code","source":"x_train_impute = model_impute.predict(x_train_encoded)\nx_test_impute = model_impute.predict(x_test_encoded)\nx_valid_impute = model_impute.predict(x_valid_encoded)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:13.873731Z","iopub.execute_input":"2022-07-15T05:02:13.874202Z","iopub.status.idle":"2022-07-15T05:02:14.330511Z","shell.execute_reply.started":"2022-07-15T05:02:13.874162Z","shell.execute_reply":"2022-07-15T05:02:14.328877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model predict survival","metadata":{}},{"cell_type":"markdown","source":"## Model for suvival prediction","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score\ndef get_score(model, X, y):\n    y_pred = model.predict(X)\n    return accuracy_score(y, y_pred)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:14.332545Z","iopub.execute_input":"2022-07-15T05:02:14.333460Z","iopub.status.idle":"2022-07-15T05:02:14.341428Z","shell.execute_reply.started":"2022-07-15T05:02:14.333412Z","shell.execute_reply":"2022-07-15T05:02:14.340090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# list_score = []\n# for n_est in tqdm.tqdm(range(200,300,1)):\n#     xgb = XGBClassifier(n_estimators=n_est)\n#     xgb.fit(x_train_impute, y_train)\n#     score = get_score(xgb,x_test_impute, y_test)\n#     list_score.append([n_est,score])\n# list_score = np.array(list_score)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:14.343115Z","iopub.execute_input":"2022-07-15T05:02:14.343758Z","iopub.status.idle":"2022-07-15T05:02:14.352976Z","shell.execute_reply.started":"2022-07-15T05:02:14.343717Z","shell.execute_reply":"2022-07-15T05:02:14.351732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(12,8))\n# plt.plot(list_score[:,0],list_score[:,1], label='accurary')\n# plt.legend()\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:14.355034Z","iopub.execute_input":"2022-07-15T05:02:14.355525Z","iopub.status.idle":"2022-07-15T05:02:14.366590Z","shell.execute_reply.started":"2022-07-15T05:02:14.355483Z","shell.execute_reply":"2022-07-15T05:02:14.365069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# best_param = list_score[np.argmax(list_score[:,1])]\n# best_param","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:14.368564Z","iopub.execute_input":"2022-07-15T05:02:14.369065Z","iopub.status.idle":"2022-07-15T05:02:14.383351Z","shell.execute_reply.started":"2022-07-15T05:02:14.369019Z","shell.execute_reply":"2022-07-15T05:02:14.382177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from lightgbm import LGBMClassifier\nfrom sklearn.ensemble import RandomForestClassifier\n\n# Best param\n# best_n_est = int(best_param[0])\nbest_n_est = 1000\nxgb = XGBClassifier(n_estimators=best_n_est, learning_rate=1e-3, seed=6688)\nxgb.fit(x_train_impute, y_train)\n\nprint(f'train score: {get_score(xgb,x_train_impute,y_train)}')\nprint(f'test score: {get_score(xgb,x_test_impute,y_test)}')","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:14.385144Z","iopub.execute_input":"2022-07-15T05:02:14.386604Z","iopub.status.idle":"2022-07-15T05:02:22.873610Z","shell.execute_reply.started":"2022-07-15T05:02:14.386427Z","shell.execute_reply":"2022-07-15T05:02:22.872258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Submit result to leaderboard","metadata":{}},{"cell_type":"code","source":"y_valid = xgb.predict(x_valid_impute)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:22.879558Z","iopub.execute_input":"2022-07-15T05:02:22.880913Z","iopub.status.idle":"2022-07-15T05:02:22.899662Z","shell.execute_reply.started":"2022-07-15T05:02:22.880838Z","shell.execute_reply":"2022-07-15T05:02:22.898427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submit = pd.DataFrame({'PassengerId': df_valid.PassengerId, 'Survived': y_valid})\ndf_submit.head(3)","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:22.906048Z","iopub.execute_input":"2022-07-15T05:02:22.907158Z","iopub.status.idle":"2022-07-15T05:02:22.924645Z","shell.execute_reply.started":"2022-07-15T05:02:22.907091Z","shell.execute_reply":"2022-07-15T05:02:22.923137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submit.to_csv('submission.csv', index=False)\nprint(\"Submitted successful!\")","metadata":{"execution":{"iopub.status.busy":"2022-07-15T05:02:22.926538Z","iopub.execute_input":"2022-07-15T05:02:22.930572Z","iopub.status.idle":"2022-07-15T05:02:22.943316Z","shell.execute_reply.started":"2022-07-15T05:02:22.930510Z","shell.execute_reply":"2022-07-15T05:02:22.941650Z"},"trusted":true},"execution_count":null,"outputs":[]}]}