{"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":"# data analysis and wrangling\nimport numpy as np\nimport pandas as pd\nfrom scipy.stats import chi2_contingency\nfrom sklearn.impute import SimpleImputer\n\n# visualization\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:55.844910Z","iopub.execute_input":"2022-08-03T09:07:55.845906Z","iopub.status.idle":"2022-08-03T09:07:57.801588Z","shell.execute_reply.started":"2022-08-03T09:07:55.845775Z","shell.execute_reply":"2022-08-03T09:07:57.800022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read files and have a glimpse of the data.","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/titanic/train.csv')\ntest = pd.read_csv('/kaggle/input/titanic/test.csv')\ncombine = [train, test]\nprint('Number of rows (Train): ' + str(len(train)))\nprint('Number of DUPLICATE rows (Train): ' + str(len(train) - len(train.drop_duplicates())))\nprint('_' * 40)\nprint('Number of rows (Test): ' + str(len(test)))\nprint('Number of DUPLICATE rows (Test): ' + str(len(test) - len(test.drop_duplicates())))\ntrain[:5]","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:57.804580Z","iopub.execute_input":"2022-08-03T09:07:57.805150Z","iopub.status.idle":"2022-08-03T09:07:57.886336Z","shell.execute_reply.started":"2022-08-03T09:07:57.805096Z","shell.execute_reply":"2022-08-03T09:07:57.884565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA","metadata":{}},{"cell_type":"code","source":"# Check number of unique values for every column\nfor col in train.columns:\n    print(col + ': ' + str(train[col].nunique()) + ' unique values')\nprint('_'*80)\nprint(train.info())\nprint('_'*80)\nprint(train.describe())\nprint('_'*80)\nprint(train.describe(include=['O']))\nprint('_'*80)\n# Check for missing values in every column\nprint('Number of missing value(s) in every column (Train):')\nprint(train.isnull().sum())\nprint('Number of missing value(s) in every column (Test):')\nprint(test.isnull().sum())","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:57.888196Z","iopub.execute_input":"2022-08-03T09:07:57.888638Z","iopub.status.idle":"2022-08-03T09:07:57.971545Z","shell.execute_reply.started":"2022-08-03T09:07:57.888597Z","shell.execute_reply":"2022-08-03T09:07:57.970153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot charts between multiple variables\n# age\nfig, ax=plt.subplots(1,figsize=(8,6))\nsns.boxplot(x='Survived',y='Age', data=train)\nax.set_ylim(0,100)\nplt.title(\"Survived vs Age\")\nplt.show()\n\n# Sex\nfig, ax=plt.subplots(1,figsize=(8,6))\nsns.countplot(x='Survived' ,hue='Sex', data=train)\nax.set_ylim(0,500)\nplt.title(\"Survived vs Sex\")\nplt.show()\n\n# Pclass\nfig, ax=plt.subplots(1,figsize=(8,6))\nsns.countplot(x='Survived' ,hue='Pclass', data=train)\nax.set_ylim(0,400)\nplt.title(\"Survived vs Pclass\")\nplt.show()\n\n# Embarked\nfig, ax=plt.subplots(1,figsize=(8,6))\nsns.countplot(x='Survived' ,hue='Embarked', data=train)\nax.set_ylim(0,500)\nplt.title(\"Survived vs Embarked\")\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-08-03T09:07:57.974945Z","iopub.execute_input":"2022-08-03T09:07:57.975574Z","iopub.status.idle":"2022-08-03T09:07:59.024709Z","shell.execute_reply.started":"2022-08-03T09:07:57.975521Z","shell.execute_reply":"2022-08-03T09:07:59.023611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Insights from the charts:\n- For Age, few points are located outside the whiskers of the box plot. However, since it is still within a reasonable age range (around 62 - 80 years old) we'll keep the data\n- Females were more likely to survived than Male\n- Upper-class passengers (Pclass = 1) were more likely to survived that crash\n- Passengers embarked from S were less likely to survived (Possibility of a correlation between Pclass and Embarked)\n\n## Additional insights:\n- Since class of passengers is significant in predicting survivability, it might be worth trying to infer the social status of a passenger from his/her name\n- Since a lof of the values are unique, dropping the 'PassengerId', 'Ticket' and the 'Cabin' columns might improve the accuracy of our model\n- Might be worthwhile to combine 'SibSp' and 'Parch' columns to create 'FamilySize' column instead","metadata":{}},{"cell_type":"code","source":"# Drop PassengerId, Ticket and Cabin columns\ntrain = train.drop(['PassengerId', 'Ticket', 'Cabin'], axis = 1)\ntest = test.drop(['Ticket', 'Cabin'], axis = 1)\ncombine = [train, test]","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.026110Z","iopub.execute_input":"2022-08-03T09:07:59.027124Z","iopub.status.idle":"2022-08-03T09:07:59.037890Z","shell.execute_reply.started":"2022-08-03T09:07:59.027080Z","shell.execute_reply":"2022-08-03T09:07:59.035928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Feature Engineering\n1. Create FamilySize column from SibSp and Parch\n2. Create Title column from Name\n3. Encode all categorical columns except Embarked (has missing values)\n4. Drop unnecessary columns","metadata":{}},{"cell_type":"code","source":"# Crate FamilySize column from SibSp and Parch\nfor df in combine:\n    df['FamilySize'] = df['SibSp'] + df['Parch'] + 1","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.039783Z","iopub.execute_input":"2022-08-03T09:07:59.040543Z","iopub.status.idle":"2022-08-03T09:07:59.061853Z","shell.execute_reply.started":"2022-08-03T09:07:59.040478Z","shell.execute_reply":"2022-08-03T09:07:59.059962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create Title column from Name\nfor df in combine:\n    df['Title'] = df['Name'].str.extract(' ([A-Za-z]+)\\.', expand=False)\n\npd.crosstab(train['Title'], train['Sex'])","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.063589Z","iopub.execute_input":"2022-08-03T09:07:59.064218Z","iopub.status.idle":"2022-08-03T09:07:59.114130Z","shell.execute_reply.started":"2022-08-03T09:07:59.064179Z","shell.execute_reply":"2022-08-03T09:07:59.111879Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Replace titles to more common names and group rare titles\ncommon = ['Master', 'Mr', 'Miss', 'Mrs']\nfor df in combine:\n    df['Title'] = df['Title'].replace('Mlle', 'Miss')\n    df['Title'] = df['Title'].replace('Ms', 'Miss')\n    df['Title'] = df['Title'].replace('Mme', 'Mrs')\n    df['Title'] = [x if x in common else 'Rare' for x in df['Title']]\n\ntrain['Title'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.116765Z","iopub.execute_input":"2022-08-03T09:07:59.117240Z","iopub.status.idle":"2022-08-03T09:07:59.137240Z","shell.execute_reply.started":"2022-08-03T09:07:59.117200Z","shell.execute_reply":"2022-08-03T09:07:59.135459Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Encode columns\nfor df in combine:\n    df['Sex'] = df['Sex'].map({'female': 0, 'male': 1})\n    #df['Title'] = df['Title'].map({'Mr': 0, 'Miss': 1, 'Mrs': 2, 'Master': 3, 'Rare': 4})\n    \ntitle_ohe1 = pd.get_dummies(train['Title'], prefix = 'Title', drop_first = True)\ntrain = pd.concat([train.drop('Title', axis = 1), title_ohe1], axis = 1)\n\ntitle_ohe2 = pd.get_dummies(test['Title'], prefix = 'Title', drop_first = True)\ntest = pd.concat([test.drop('Title', axis = 1), title_ohe2], axis = 1)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.139224Z","iopub.execute_input":"2022-08-03T09:07:59.139677Z","iopub.status.idle":"2022-08-03T09:07:59.160903Z","shell.execute_reply.started":"2022-08-03T09:07:59.139638Z","shell.execute_reply":"2022-08-03T09:07:59.159489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Drop Name, SibSp and Parch columns\ntrain = train.drop(['Name', 'SibSp', 'Parch'], axis = 1)\ntest = test.drop(['Name', 'SibSp', 'Parch'], axis = 1)\ncombine = [train, test]","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.166396Z","iopub.execute_input":"2022-08-03T09:07:59.167032Z","iopub.status.idle":"2022-08-03T09:07:59.178445Z","shell.execute_reply.started":"2022-08-03T09:07:59.166991Z","shell.execute_reply":"2022-08-03T09:07:59.177328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Imputation : Age","metadata":{}},{"cell_type":"code","source":"# Check correlation of Age with other variables\nage_corr = train.corr().abs().unstack().sort_values(kind=\"quicksort\", ascending=False).reset_index()\nage_corr.rename(columns={\"level_0\": \"Feature 1\", \"level_1\": \"Feature 2\", 0: 'Correlation Coefficient'}, inplace=True)\nage_corr[age_corr['Feature 1'] == 'Age']","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.181754Z","iopub.execute_input":"2022-08-03T09:07:59.182398Z","iopub.status.idle":"2022-08-03T09:07:59.210508Z","shell.execute_reply.started":"2022-08-03T09:07:59.182339Z","shell.execute_reply":"2022-08-03T09:07:59.208808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Impute Age based on Pclass\nimpute_ages = np.zeros((2,3))\nfor df in combine:\n    for i in range(0, 2):\n        for j in range(0, 3):\n            impute_df = df[(df['Sex'] == i) & \\\n                                  (df['Pclass'] == j+1)]['Age'].dropna()\n            impute_ages[i,j] = int(impute_df.median())\n            \n    for i in range(0, 2):\n        for j in range(0, 3):\n            df.loc[ (df.Age.isnull()) & (df.Sex == i) & (df.Pclass == j+1), 'Age'] = impute_ages[i,j]","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.213152Z","iopub.execute_input":"2022-08-03T09:07:59.214371Z","iopub.status.idle":"2022-08-03T09:07:59.267082Z","shell.execute_reply.started":"2022-08-03T09:07:59.214304Z","shell.execute_reply":"2022-08-03T09:07:59.265411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Imputation: Embarked","metadata":{}},{"cell_type":"code","source":"# Check correlation between Embarked & Pclass\nfig, ax=plt.subplots(1,figsize=(8,6))\nsns.countplot(x='Embarked',hue='Pclass', data=train)\nax.set_ylim(0,400)\nplt.title(\"Embarked vs Pclass\")\nprint('Check correlation between Embarked & Pclass\\n')\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-08-03T09:07:59.269346Z","iopub.execute_input":"2022-08-03T09:07:59.269979Z","iopub.status.idle":"2022-08-03T09:07:59.536439Z","shell.execute_reply.started":"2022-08-03T09:07:59.269918Z","shell.execute_reply":"2022-08-03T09:07:59.534886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"There seem to be some correlation between Embarked and Pclass as lower-class passengers were more likely to embarked from S and most passengers that embarked from C were from the upper-class","metadata":{}},{"cell_type":"code","source":"impute_embarked= ['', '', '']\nfor df in combine:\n    for i in range(0, 3):\n        impute_val = df[df['Pclass'] == i+1]['Embarked'].dropna().mode()[0]\n        impute_embarked[i] = impute_val\n        \n    for i in range(0, 3):\n        df.loc[ (df.Embarked.isnull()) & (df.Pclass == i+1), 'Embarked'] = impute_embarked[i]","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.538544Z","iopub.execute_input":"2022-08-03T09:07:59.539920Z","iopub.status.idle":"2022-08-03T09:07:59.567975Z","shell.execute_reply.started":"2022-08-03T09:07:59.539862Z","shell.execute_reply":"2022-08-03T09:07:59.566415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for df in combine:\n#     df['Embarked'] = df['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})\n\nembarked_ohe1 = pd.get_dummies(train['Embarked'], prefix = 'Embarked', drop_first = True)\ntrain = pd.concat([train.drop('Embarked', axis = 1), embarked_ohe1], axis = 1)\n\nembarked_ohe2 = pd.get_dummies(test['Embarked'], prefix = 'Embarked', drop_first = True)\ntest = pd.concat([test.drop('Embarked', axis = 1), embarked_ohe2], axis = 1)\n\ncombine = [train, test]","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.570882Z","iopub.execute_input":"2022-08-03T09:07:59.571438Z","iopub.status.idle":"2022-08-03T09:07:59.590578Z","shell.execute_reply.started":"2022-08-03T09:07:59.571396Z","shell.execute_reply":"2022-08-03T09:07:59.589074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Imputation: Fare","metadata":{}},{"cell_type":"code","source":"imputer = SimpleImputer()\ntest['Fare'] = list(imputer.fit_transform(test[['Fare']]))\ntest['Fare'] = [x[0] for x in test['Fare']]\n\n# Check if there's any missing values left\nprint('Number of missing value(s) in every column (Train):')\nprint(train.isnull().sum())\nprint('Number of missing value(s) in every column (Test):')\nprint(test.isnull().sum())","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:07:59.592724Z","iopub.execute_input":"2022-08-03T09:07:59.594570Z","iopub.status.idle":"2022-08-03T09:07:59.625076Z","shell.execute_reply.started":"2022-08-03T09:07:59.594504Z","shell.execute_reply":"2022-08-03T09:07:59.623656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train = train.drop(['Fare'], axis = 1)\n# test = test.drop(['Fare'], axis = 1)\n# combine = [train, test]\n\n# for df in combine:\n#     df['Age'] = pd.cut(df['Age'], bins=5, labels = False)\n    #df['Fare'] = pd.qcut(df['Fare'], q=4, labels = False)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-08-03T09:07:59.626793Z","iopub.execute_input":"2022-08-03T09:07:59.628388Z","iopub.status.idle":"2022-08-03T09:07:59.634740Z","shell.execute_reply.started":"2022-08-03T09:07:59.628146Z","shell.execute_reply":"2022-08-03T09:07:59.633658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modelling","metadata":{}},{"cell_type":"code","source":"# Modeling\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom xgboost.sklearn import XGBClassifier\nfrom sklearn.ensemble import GradientBoostingClassifier\nfrom lightgbm import LGBMClassifier\nfrom catboost import CatBoostClassifier\nfrom sklearn.experimental import enable_hist_gradient_boosting\nfrom sklearn.ensemble import HistGradientBoostingClassifier\n\nfrom sklearn import metrics\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import GridSearchCV","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-08-03T09:07:59.636646Z","iopub.execute_input":"2022-08-03T09:07:59.637467Z","iopub.status.idle":"2022-08-03T09:08:01.897415Z","shell.execute_reply.started":"2022-08-03T09:07:59.637410Z","shell.execute_reply":"2022-08-03T09:08:01.896339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = train.drop(columns = 'Survived')\nX = pd.get_dummies(X, drop_first = True)\n\ny = train['Survived']","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:08:01.898906Z","iopub.execute_input":"2022-08-03T09:08:01.899845Z","iopub.status.idle":"2022-08-03T09:08:01.915687Z","shell.execute_reply.started":"2022-08-03T09:08:01.899805Z","shell.execute_reply":"2022-08-03T09:08:01.914038Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:08:01.918027Z","iopub.execute_input":"2022-08-03T09:08:01.918761Z","iopub.status.idle":"2022-08-03T09:08:01.939301Z","shell.execute_reply.started":"2022-08-03T09:08:01.918700Z","shell.execute_reply":"2022-08-03T09:08:01.937638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def find_best_model(X_train, X_test, y_train, y_test):\n    # Logistic Regression\n    logreg = LogisticRegression(max_iter = 600, random_state = 42)\n    logreg.fit(X_train, y_train)\n    y_pred = logreg.predict(X_test)\n    logreg_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n    \n    # Decision Tree\n    decision_tree = DecisionTreeClassifier(random_state = 42)\n    decision_tree.fit(X_train, y_train)\n    y_pred = decision_tree.predict(X_test)\n    decision_tree_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n    \n    # Random Forest\n    random_forest = RandomForestClassifier(random_state = 42)\n    random_forest.fit(X_train, y_train)\n    y_pred = random_forest.predict(X_test)\n    random_forest_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n    \n    # XGBoost\n    xgb = XGBClassifier(random_state = 42)\n    xgb.fit(X_train, y_train)\n    y_pred = xgb.predict(X_test)\n    xgb_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n    \n    # GBM\n    gbm = GradientBoostingClassifier(random_state = 42)\n    gbm.fit(X_train, y_train)\n    y_pred = gbm.predict(X_test)\n    gbm_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n    \n    # LightGBM\n    lgbm = LGBMClassifier(random_state = 42)\n    lgbm.fit(X_train, y_train)\n    y_pred = lgbm.predict(X_test)\n    lgbm_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n        \n    # Catboost\n    catb = CatBoostClassifier(verbose = 0, random_state = 42)\n    catb.fit(X_train, y_train)\n    y_pred = catb.predict(X_test)\n    catb_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n    \n    # Histogram-based Gradient Boosting Classification Tree\n    hgb = HistGradientBoostingClassifier(random_state = 42)\n    hgb.fit(X_train, y_train)\n    y_pred = hgb.predict(X_test)\n    hgb_acc = round(metrics.accuracy_score(y_test, y_pred) * 100, 2)\n    \n    model_df = pd.DataFrame({'Model': ['Logistic Regression', 'Decision Tree', 'Random Forest', 'XGBoost', 'GBM', 'LightGBM', 'Catboost', 'HistBoost'],\n                       'Score': [logreg_acc, decision_tree_acc, random_forest_acc, xgb_acc, gbm_acc, lgbm_acc, catb_acc, hgb_acc]})\n    print(model_df.sort_values('Score', ascending = False).reset_index(drop = True))","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:08:01.941741Z","iopub.execute_input":"2022-08-03T09:08:01.942335Z","iopub.status.idle":"2022-08-03T09:08:01.966143Z","shell.execute_reply.started":"2022-08-03T09:08:01.942261Z","shell.execute_reply":"2022-08-03T09:08:01.964222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"find_best_model(X_train, X_test, y_train, y_test)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T09:08:01.968633Z","iopub.execute_input":"2022-08-03T09:08:01.969107Z","iopub.status.idle":"2022-08-03T09:08:06.595650Z","shell.execute_reply.started":"2022-08-03T09:08:01.969069Z","shell.execute_reply":"2022-08-03T09:08:06.594032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Our Random Forest model performed the best on unseen data.","metadata":{}},{"cell_type":"markdown","source":"# Random Forest\nFind the best hyperparameters for our Random Forest model using GridSearch and fit it accoring to those parameters.","metadata":{}},{"cell_type":"code","source":"rfc = RandomForestClassifier(random_state=42)\nparam_grid = { \n    'n_estimators': [100, 200, 300], # The number of boosting stages to perform\n    'max_features': ['auto'], # The number of features to consider when looking for the best split\n    'max_depth' : [4, 6, 8], # The maximum depth of the individual regression estimators.\n    'criterion' :['gini', 'entropy'] #Function to measure the quality of a split\n}\nCV_rfc = GridSearchCV(estimator=rfc, param_grid=param_grid, cv= 5)\nCV_rfc.fit(X, y)\nprint('Best hyperparameters:',CV_rfc.best_params_)\n\nX_test = test.drop('PassengerId', axis = 1)\npredictions = CV_rfc.predict(X_test)\n\noutput = pd.DataFrame({'PassengerId': test.PassengerId,\n                      'Survived': predictions})\n\noutput.to_csv('titanic-submission.csv', index= False)","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2022-08-03T09:08:06.598984Z","iopub.execute_input":"2022-08-03T09:08:06.599497Z","iopub.status.idle":"2022-08-03T09:08:44.363336Z","shell.execute_reply.started":"2022-08-03T09:08:06.599456Z","shell.execute_reply":"2022-08-03T09:08:44.361865Z"},"trusted":true},"execution_count":null,"outputs":[]}]}