{"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 os, gc, pickle, datetime, scipy.sparse\nimport time\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom colorama import Fore, Back, Style\nfrom sklearn.cluster import KMeans\nimport lightgbm as lgbm\nfrom sklearn.linear_model import Ridge, Lasso, ElasticNet\nfrom sklearn.neural_network import MLPRegressor\nfrom sklearn.neighbors import KNeighborsRegressor\nfrom sklearn.model_selection import GroupKFold, train_test_split, KFold\nfrom sklearn.preprocessing import StandardScaler, scale, MinMaxScaler\nfrom sklearn.metrics import mean_squared_error\nfrom tqdm import tqdm\nimport tensorflow as tf\nimport tensorflow.keras.backend as K\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, LearningRateScheduler, EarlyStopping\nfrom tensorflow.keras.layers import Dense, Input, Concatenate, Dropout\nfrom tensorflow.keras.utils import plot_model\nimport keras_tuner\n\nDATA_DIR = \"/kaggle/input/open-problems-multimodal/\"\nFP_CELL_METADATA = os.path.join(DATA_DIR,\"metadata.csv\")\n\nFP_CITE_TRAIN_INPUTS = os.path.join(DATA_DIR,\"train_cite_inputs.h5\")\nFP_CITE_TRAIN_TARGETS = os.path.join(DATA_DIR,\"train_cite_targets.h5\")\nFP_CITE_TEST_INPUTS = os.path.join(DATA_DIR,\"test_cite_inputs.h5\")\n\nFP_MULTIOME_TRAIN_INPUTS = os.path.join(DATA_DIR,\"train_multi_inputs.h5\")\nFP_MULTIOME_TRAIN_TARGETS = os.path.join(DATA_DIR,\"train_multi_targets.h5\")\nFP_MULTIOME_TEST_INPUTS = os.path.join(DATA_DIR,\"test_multi_inputs.h5\")\n\nFP_SUBMISSION = os.path.join(DATA_DIR,\"sample_submission.csv\")\nFP_EVALUATION_IDS = os.path.join(DATA_DIR,\"evaluation_ids.csv\")\n\nTUNE = False\nSUBMIT = True","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-11-10T21:53:35.676139Z","iopub.execute_input":"2022-11-10T21:53:35.676678Z","iopub.status.idle":"2022-11-10T21:53:35.686267Z","shell.execute_reply.started":"2022-11-10T21:53:35.676646Z","shell.execute_reply":"2022-11-10T21:53:35.685543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dfs = []\n\nfor file in tqdm(os.listdir(\"../input/feature-shop-for-multimodal-singlecell-competition/\")):\n    if not file.startswith(\"_\"):\n        try:\n            dfs.append( pd.read_csv(f\"../input/feature-shop-for-multimodal-singlecell-competition/{file}\") )\n        except:\n            continue","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:00:50.536691Z","iopub.execute_input":"2022-11-10T21:00:50.537207Z","iopub.status.idle":"2022-11-10T21:02:43.454547Z","shell.execute_reply.started":"2022-11-10T21:00:50.537176Z","shell.execute_reply":"2022-11-10T21:02:43.453795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.concat(dfs, axis=1).fillna(0)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:02:43.455954Z","iopub.execute_input":"2022-11-10T21:02:43.456745Z","iopub.status.idle":"2022-11-10T21:02:47.314558Z","shell.execute_reply.started":"2022-11-10T21:02:43.456716Z","shell.execute_reply":"2022-11-10T21:02:47.312786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idxs = df.iloc[:, 0].values\ndf = df.drop([\"cell_id\"], axis=1)\ndf.insert(loc=0, column='cell_id', value=idxs)\n\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:04:06.413740Z","iopub.execute_input":"2022-11-10T21:04:06.415746Z","iopub.status.idle":"2022-11-10T21:04:07.992796Z","shell.execute_reply.started":"2022-11-10T21:04:06.415692Z","shell.execute_reply":"2022-11-10T21:04:07.991360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_df = pd.read_csv(\"../input/feature-shop-for-multimodal-singlecell-competition/_citeseq_meta_all_text_also.csv\")\nmeta_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:11:27.697916Z","iopub.execute_input":"2022-11-10T21:11:27.698372Z","iopub.status.idle":"2022-11-10T21:11:27.827702Z","shell.execute_reply.started":"2022-11-10T21:11:27.698313Z","shell.execute_reply":"2022-11-10T21:11:27.826779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = df.loc[meta_df[\"Train0OrTest1\"]==0]\ngc.collect()\nXt = df.loc[meta_df[\"Train0OrTest1\"]==1]\ngc.collect()\n\nX = X.set_index(\"cell_id\")\nXt = Xt.set_index(\"cell_id\")\n\nX.shape, Xt.shape","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:04:38.539626Z","iopub.execute_input":"2022-11-10T21:04:38.540024Z","iopub.status.idle":"2022-11-10T21:04:40.948716Z","shell.execute_reply.started":"2022-11-10T21:04:38.539991Z","shell.execute_reply":"2022-11-10T21:04:40.947806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del df, dfs\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:04:50.143484Z","iopub.execute_input":"2022-11-10T21:04:50.143842Z","iopub.status.idle":"2022-11-10T21:04:50.428440Z","shell.execute_reply.started":"2022-11-10T21:04:50.143813Z","shell.execute_reply":"2022-11-10T21:04:50.426908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom sklearn.decomposition import TruncatedSVD\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.preprocessing import QuantileTransformer\nfrom tqdm import tqdm\n\ndata_size = 256\nsvd_train = TruncatedSVD(n_components=data_size, random_state=42)\nXt = svd_train.fit_transform(Xt)\nX = svd_train.transform(X)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:05:38.702336Z","iopub.execute_input":"2022-11-10T21:05:38.702739Z","iopub.status.idle":"2022-11-10T21:06:01.761942Z","shell.execute_reply.started":"2022-11-10T21:05:38.702706Z","shell.execute_reply":"2022-11-10T21:06:01.761154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Xt.shape, X.shape","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:06:02.010048Z","iopub.execute_input":"2022-11-10T21:06:02.010595Z","iopub.status.idle":"2022-11-10T21:06:02.017528Z","shell.execute_reply.started":"2022-11-10T21:06:02.010564Z","shell.execute_reply":"2022-11-10T21:06:02.016527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def correlation_score(y_true, y_pred):\n\n    if type(y_true) == pd.DataFrame: y_true = y_true.values\n    if type(y_pred) == pd.DataFrame: y_pred = y_pred.values\n    corrsum = 0\n    for i in range(len(y_true)):\n        corrsum += np.corrcoef(y_true[i], y_pred[i])[1, 0]\n    return corrsum / len(y_true)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:06:02.018809Z","iopub.execute_input":"2022-11-10T21:06:02.019130Z","iopub.status.idle":"2022-11-10T21:06:02.031890Z","shell.execute_reply.started":"2022-11-10T21:06:02.019105Z","shell.execute_reply":"2022-11-10T21:06:02.030796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We read train and test datasets, keep the important columns and convert the rest to sparse matrices.","metadata":{}},{"cell_type":"code","source":"!pip install tables","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:07:21.005522Z","iopub.execute_input":"2022-11-10T21:07:21.005940Z","iopub.status.idle":"2022-11-10T21:07:33.772931Z","shell.execute_reply.started":"2022-11-10T21:07:21.005909Z","shell.execute_reply":"2022-11-10T21:07:33.771151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y = pd.read_hdf(FP_CITE_TRAIN_TARGETS)\ny_columns = list(Y.columns)\nY = Y.values\n\n# Normalize the targets row-wise: This doesn't change the correlations,\n# and negative_correlation_loss depends on it\nY -= Y.mean(axis=1).reshape(-1, 1)\nY /= Y.std(axis=1).reshape(-1, 1)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:07:33.775141Z","iopub.execute_input":"2022-11-10T21:07:33.775534Z","iopub.status.idle":"2022-11-10T21:07:34.502241Z","shell.execute_reply.started":"2022-11-10T21:07:33.775500Z","shell.execute_reply":"2022-11-10T21:07:34.501223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta = meta_df.loc[meta_df[\"Train0OrTest1\"]==0]\nmeta_test = meta_df.loc[meta_df[\"Train0OrTest1\"]==1]\nmeta[\"cell_type\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:13:32.664098Z","iopub.execute_input":"2022-11-10T21:13:32.664437Z","iopub.status.idle":"2022-11-10T21:13:32.689949Z","shell.execute_reply.started":"2022-11-10T21:13:32.664408Z","shell.execute_reply":"2022-11-10T21:13:32.689278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models_dict = {\n#     \"lgb_default\": [lgbm.LGBMRegressor, dict(random_state = 0)],\n#     \"lgb_tuned\": [lgbm.LGBMRegressor, dict(random_state = 0, \n#         learning_rate= 0.07 ,  # hypersensitive - change to 0.0671 - worsens about 2% from 0.43590181064083766\n#         num_leaves = 12, # hypersensitive - change to 11, worsens about 2%\n#         max_depth = 9, # hypersensitive - change to 10 - worsens about 1%\n#         n_estimators= 150, # senstitive - change by 10 - worsents about 0.5%\n#         min_child_samples = 20,# hypersensitive - change to 21 - worsens about 3% \n#         min_split_gain = 12.2,# sometimes hypersenstive - change by 0.1 worsens by 0.9%, But for 100 features changes 11.8-12.2 - not change AT ALLL !!!  # Uplifts to  0.43590.. !!! \n#         reg_lambda = 0.0, # seems only makes worse\n#         reg_alpha = 0.0, # seems only makes worse\n#         subsample_for_bin = 10000, # seems  less 10000 - worsens, but after 10 000 does not influence  \n#         colsample_bytree = 1, # only worsens\n#         subsample = 1, # Does not seem to influence at all\n#         other_rate = 1,# no influence ?  \n#         min_child_weight =  0.1, # no influence ?\n#         subsample_freq = 10,# no influence ? # Integer; alias: bagging_freq; k means perform bagging at every k iteration\n#                   )],\n#     \"ridge_default\": [Ridge, dict(random_state=0)],\n    \"ridge_tuned\": [Ridge, dict(random_state=0, alpha=1e-04)],\n    \"lasso_default\": [Lasso, dict(random_state=0)],\n    \"elasticnet_default\": [ElasticNet, dict(random_state=0)],\n    \"knn\": [KNeighborsRegressor, dict(n_neighbors=11, leaf_size=22)]\n}","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:54:05.737160Z","iopub.execute_input":"2022-11-10T21:54:05.737527Z","iopub.status.idle":"2022-11-10T21:54:05.744328Z","shell.execute_reply.started":"2022-11-10T21:54:05.737497Z","shell.execute_reply":"2022-11-10T21:54:05.743318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"corr_dict = {model_name: [] for model_name in models_dict.keys()}\nmse_dict = {model_name: [] for model_name in models_dict.keys()}\ntime_dict = {model_name: [] for model_name in models_dict.keys()}","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:54:07.280618Z","iopub.execute_input":"2022-11-10T21:54:07.281011Z","iopub.status.idle":"2022-11-10T21:54:07.286476Z","shell.execute_reply.started":"2022-11-10T21:54:07.280980Z","shell.execute_reply":"2022-11-10T21:54:07.285532Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from typing import * \n\ndef fit_from_scratch(name: str, \n                     x: np.ndarray, \n                     y: np.ndarray,\n                     return_time: bool = True) -> Union[object, List[Union[object, float]]]: \n    \"\"\"\n    Create model from models_dict by given name. \n    Fit (x, y) into model.\n    Return trained model or trained model and time spent for training.\n    \"\"\"\n    params = models_dict[name][1]\n    model = models_dict[name][0](**params)\n    \n    s_t = time.time()\n    model.fit(x, y)\n    total_time = time.time() - s_t\n    \n    if return_time:\n        return model, total_time\n    else:\n        return model\n\n\ndef get_stats_from_model(model: object,\n                         x: np.ndarray, \n                         y: np.ndarray) -> List[float]:\n    \"\"\"\n    Get y_pred from model.predict(x).\n    Return r2 and mse of (y, y_pred)\n    \"\"\"\n    y_pred = model.predict(x)\n    \n    mse_ = mean_squared_error(y, y_pred)\n    corr_ = np.corrcoef(y, y_pred)[1, 0]\n    \n    return mse_, corr_","metadata":{"execution":{"iopub.status.busy":"2022-11-10T21:54:07.495345Z","iopub.execute_input":"2022-11-10T21:54:07.497135Z","iopub.status.idle":"2022-11-10T21:54:07.506515Z","shell.execute_reply.started":"2022-11-10T21:54:07.497090Z","shell.execute_reply":"2022-11-10T21:54:07.505310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = {model_name: [] for model_name in models_dict.keys()}\noof = {model_name: np.zeros(Y.shape) for model_name in models_dict.keys()}\n\nnp.random.seed(1)\n\noof_mse = {}\noof_corr = {}\nfor model_name in models_dict.keys():\n    print(f\"Model : {model_name}\")\n    \n    oof_mse[model_name] = {}\n    oof_corr[model_name] = {}\n\n    for cell_type in meta[\"cell_type\"].unique():\n        oof_mse[model_name][cell_type] = {}\n        oof_corr[model_name][cell_type] = {}\n\n        cell_ind = (meta[\"cell_type\"] == cell_type).values\n\n        X_cell = X[cell_ind]\n        Y_cell = Y[cell_ind]\n\n        kfold = KFold(n_splits = 5, random_state=42, shuffle=True)\n        for fold, (trn_ind, val_ind) in enumerate(kfold.split(X_cell)):\n            print(f\"Validating on {cell_type} fold {fold}\")\n\n            gc.collect()\n            X_tr = X_cell[trn_ind]\n            y_tr = Y_cell[trn_ind]\n            X_va = X_cell[val_ind]\n            y_va = Y_cell[val_ind]\n\n            model, time_ = fit_from_scratch(model_name, \n                                            X_tr, \n                                            y_tr,\n                                            return_time=True)\n\n            # We validate the model\n            y_va_pred = model.predict(X_va)\n            corrscore = correlation_score(y_va, y_va_pred)\n            mse_score = mean_squared_error(y_va, y_va_pred)\n\n            oof[model_name][val_ind] = y_va_pred\n            oof_mse[model_name][cell_type][fold] = mse_score\n            oof_corr[model_name][cell_type][fold] = corrscore\n\n            preds[model_name].append(model.predict(Xt[(meta_test[\"cell_type\"] == cell_type).values]))\n\n    #         # save imps\n    #         with open(f\"ridge_cell_{cell_type}_fold{fold}_imps.npy\", \"wb\") as f:\n    #             np.save(f, model.coef_)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T22:17:37.525553Z","iopub.execute_input":"2022-11-10T22:17:37.525937Z","iopub.status.idle":"2022-11-10T22:23:39.717079Z","shell.execute_reply.started":"2022-11-10T22:17:37.525908Z","shell.execute_reply":"2022-11-10T22:23:39.716163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for model_name in oof_mse.keys():\n    display(pd.DataFrame(oof_corr[model_name]).style.set_caption(f\"{model_name} pearson corr table\"))","metadata":{"execution":{"iopub.status.busy":"2022-11-10T22:30:17.069290Z","iopub.execute_input":"2022-11-10T22:30:17.069681Z","iopub.status.idle":"2022-11-10T22:30:17.094555Z","shell.execute_reply.started":"2022-11-10T22:30:17.069652Z","shell.execute_reply":"2022-11-10T22:30:17.092049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for model_name in oof_mse.keys():\n    display(pd.DataFrame(oof_mse[model_name]).style.set_caption(f\"{model_name} mse table\"))","metadata":{"execution":{"iopub.status.busy":"2022-11-10T22:30:23.628953Z","iopub.execute_input":"2022-11-10T22:30:23.629325Z","iopub.status.idle":"2022-11-10T22:30:23.654919Z","shell.execute_reply.started":"2022-11-10T22:30:23.629297Z","shell.execute_reply":"2022-11-10T22:30:23.653917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for model_name in oof_mse.keys():\n#     print(f\"{model_name} Y / OOF corr score: \", correlation_score(Y, oof[model_name]))","metadata":{"execution":{"iopub.status.busy":"2022-11-10T22:31:27.391567Z","iopub.execute_input":"2022-11-10T22:31:27.392006Z","iopub.status.idle":"2022-11-10T22:31:49.825150Z","shell.execute_reply.started":"2022-11-10T22:31:27.391969Z","shell.execute_reply":"2022-11-10T22:31:49.824281Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models_preds = {}\nfor model_name in oof_mse.keys():\n    preds_ = preds[model_name]\n    preds_dict = {}\n    for i, cell_type in enumerate(meta[\"cell_type\"].unique()):\n        preds_dict[cell_type] = np.mean(preds_[i * kfold.n_splits:(i+1) * kfold.n_splits], axis=0)\n    \n    preds_ = np.zeros((Xt.shape[0], Y.shape[1]))\n    for cell_type in preds_dict.keys():\n        preds_[meta_test[\"cell_type\"]==cell_type] = preds_dict[cell_type]\n    \n    models_preds[model_name] = preds_","metadata":{"execution":{"iopub.status.busy":"2022-11-10T22:59:02.909385Z","iopub.execute_input":"2022-11-10T22:59:02.909730Z","iopub.status.idle":"2022-11-10T22:59:03.309686Z","shell.execute_reply.started":"2022-11-10T22:59:02.909703Z","shell.execute_reply":"2022-11-10T22:59:03.309010Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = []\nfor model_name in oof_mse.keys():\n    preds.append(models_preds[model_name])","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:00:09.857905Z","iopub.execute_input":"2022-11-10T23:00:09.858308Z","iopub.status.idle":"2022-11-10T23:00:09.863359Z","shell.execute_reply.started":"2022-11-10T23:00:09.858278Z","shell.execute_reply":"2022-11-10T23:00:09.862153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import matplotlib.pyplot as plt\n# import seaborn as sns\n\n# for i in range(Y.shape[1]):\n#     plt.figure(figsize=[10, 4])\n#     plt.subplot(1, 2, 1)\n#     sns.histplot(preds[:, i])\n#     plt.title(f\"OOF Target {i}. All cell types\")\n    \n#     plt.subplot(1, 2, 2)\n#     sns.histplot(oof[:, i])\n#     plt.title(f\"Pred Target {i}. All cell types\")\n#     plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:00:22.456648Z","iopub.execute_input":"2022-11-10T23:00:22.457294Z","iopub.status.idle":"2022-11-10T23:00:22.461035Z","shell.execute_reply.started":"2022-11-10T23:00:22.457263Z","shell.execute_reply":"2022-11-10T23:00:22.460128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# with open('ridge_oof_cell_features.npy', 'wb') as f:\n#     np.save(f, oof)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T18:23:34.545077Z","iopub.execute_input":"2022-11-10T18:23:34.545544Z","iopub.status.idle":"2022-11-10T18:23:34.705248Z","shell.execute_reply.started":"2022-11-10T18:23:34.54551Z","shell.execute_reply":"2022-11-10T18:23:34.703924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del X_tr, X_va, y_tr, y_va, y_va_pred\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:00:35.528506Z","iopub.execute_input":"2022-11-10T23:00:35.529773Z","iopub.status.idle":"2022-11-10T23:00:35.978601Z","shell.execute_reply.started":"2022-11-10T23:00:35.529723Z","shell.execute_reply":"2022-11-10T23:00:35.977495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del X, Y\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:00:35.980123Z","iopub.execute_input":"2022-11-10T23:00:35.980432Z","iopub.status.idle":"2022-11-10T23:00:36.398439Z","shell.execute_reply.started":"2022-11-10T23:00:35.980405Z","shell.execute_reply":"2022-11-10T23:00:36.397547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = np.average(preds, axis=0, weights=[0.4, 0.25, 0.25, 0.1])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('sklearn_pred_fs.npy', 'wb') as f:\n    np.save(f, preds)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:00:44.133053Z","iopub.execute_input":"2022-11-10T23:00:44.133394Z","iopub.status.idle":"2022-11-10T23:00:44.458248Z","shell.execute_reply.started":"2022-11-10T23:00:44.133364Z","shell.execute_reply":"2022-11-10T23:00:44.457121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}