{"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":"markdown","source":"# 52nd Place Solution Notebook\n\nThis notebook is a cleaned version of my final submission.  \nSee [this post](https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324076/) for some details about my solution.\n\nThe notebook has minimal code in it - most of the code is imported from my [handmhelpers dataset](https://www.kaggle.com/datasets/jacob34/handmhelpers), which is synced to [this github repo](https://github.com/JacobCP/kaggle-handm-helpers) .  \nSee [this post](https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324078) for some details about my code development.  \n\n**Please note:**  \nI plan on continuing to update the github repo, as I try to recreate some of the strategies shared by winning teams.  \nSome of those changes may break the code usage for this notebook.  \nIn order to keep this notebook functional, I will no longer be updating the dataset to reflect the changes made to the repo - it will remain at commit 86c412e902a7692b24e15791322a8dfeb5a761eb","metadata":{}},{"cell_type":"code","source":"%%time\nimport os\nimport sys\nimport copy\nfrom datetime import datetime\nimport gc\nimport pickle as pkl\nimport shelve\n\nimport pandas as pd\nimport numpy as np\nimport cudf\n    \nsys.path.append(\"../input/\")\nfrom handmhelpers import io as h_io, sub as h_sub, cv as h_cv, fe as h_fe\nfrom handmhelpers import modeling as h_modeling, candidates as h_can, pairs as h_pairs","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:05:49.239037Z","iopub.execute_input":"2022-11-22T07:05:49.240054Z","iopub.status.idle":"2022-11-22T07:05:53.896481Z","shell.execute_reply.started":"2022-11-22T07:05:49.239934Z","shell.execute_reply":"2022-11-22T07:05:53.895668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load and convert data","metadata":{}},{"cell_type":"code","source":"%%time\n\nc, t, a = h_io.load_data(files=['customers.csv', 'transactions_train.csv', 'articles.csv'])        \n\nindex_to_id_dict_path = h_fe.reduce_customer_id_memory(c, [t])\nt[\"week_number\"] = h_fe.day_week_numbers(t[\"t_dat\"])\nt[\"t_dat\"] = h_fe.day_numbers(t[\"t_dat\"])","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:05:53.899812Z","iopub.execute_input":"2022-11-22T07:05:53.900054Z","iopub.status.idle":"2022-11-22T07:06:38.845009Z","shell.execute_reply.started":"2022-11-22T07:05:53.900027Z","shell.execute_reply":"2022-11-22T07:06:38.844244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"t","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:06:38.846321Z","iopub.execute_input":"2022-11-22T07:06:38.846946Z","iopub.status.idle":"2022-11-22T07:06:38.924822Z","shell.execute_reply.started":"2022-11-22T07:06:38.846893Z","shell.execute_reply":"2022-11-22T07:06:38.923779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Get item pairs","metadata":{}},{"cell_type":"code","source":"%%time\n\npairs_per_item = 5\n\nweek_number_pairs = {}\nfor week_number in [96, 97, 98, 99, 100, 101, 102, 103, 104]:\n    print(f\"Creating pairs for week number {week_number}\")\n    week_number_pairs[week_number] = h_pairs.create_pairs(\n        t, week_number, pairs_per_item, verbose=False\n    )","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:06:38.926954Z","iopub.execute_input":"2022-11-22T07:06:38.927296Z","iopub.status.idle":"2022-11-22T07:07:48.856458Z","shell.execute_reply.started":"2022-11-22T07:06:38.92725Z","shell.execute_reply":"2022-11-22T07:07:48.854924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"week_number_pairs[96]","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:19.954212Z","iopub.execute_input":"2022-11-22T05:56:19.954961Z","iopub.status.idle":"2022-11-22T05:56:20.007627Z","shell.execute_reply.started":"2022-11-22T05:56:19.954922Z","shell.execute_reply":"2022-11-22T05:56:20.006803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Main retrieval/features function!","metadata":{}},{"cell_type":"code","source":"t","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:20.008882Z","iopub.execute_input":"2022-11-22T05:56:20.009203Z","iopub.status.idle":"2022-11-22T05:56:20.067061Z","shell.execute_reply.started":"2022-11-22T05:56:20.009167Z","shell.execute_reply":"2022-11-22T05:56:20.066211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_candidates_with_features_df(t, c, a, customer_batch=None, **kwargs):\n    # splitting cv\n    features_df, label_df = h_cv.feature_label_split(\n        t, kwargs[\"label_week\"], kwargs[\"feature_periods\"]\n    )\n    \n    # converting relative day_number\n    features_df[\"t_dat\"] = h_fe.how_many_ago(features_df[\"t_dat\"])\n    features_df[\"week_number\"] = h_fe.how_many_ago(features_df[\"week_number\"])\n    \n    # pull out the cv week\n    article_pairs_df = week_number_pairs[kwargs[\"label_week\"]-1]\n    \n    # check if we can limit customers\n    if len(label_df) > 0:\n        customers = label_df[\"customer_id\"].unique()\n    elif customer_batch is not None:\n        customers = customer_batch\n    else:\n        customers = None\n    \n    ############################################\n    # creating candidates (and adding features)\n    ###########################################\n    \n    features_db = shelve.open(\"features_db\") \n    \n    # creating candidate (and saving features created)\n    recent_customer_cand, features_db[\"customer_article\"] = (\n        h_can.create_recent_customer_candidates(\n            features_df,\n            kwargs[\"ca_num_weeks\"],\n            customers=customers,\n        )\n    )\n    \n    (cust_last_week_cand,\n     cust_last_week_pair_cand,\n     features_db[\"clw\"],\n     features_db[\"clw_pairs\"]) = h_can.create_last_customer_weeks_and_pairs(\n        features_df,\n        article_pairs_df,\n        kwargs[\"clw_num_weeks\"],\n        kwargs[\"clw_num_pair_weeks\"],\n        customers=customers,\n    )\n    \n    _, features_db[\"popular_articles\"] = h_can.create_popular_article_cand(\n        features_df,\n        c,\n        a,\n        kwargs[\"pa_num_weeks\"],\n        kwargs[\"hier_col\"],\n        num_candidates=kwargs[\"num_recent_candidates\"],\n        num_articles=kwargs[\"num_recent_articles\"],\n        customers=customers,\n    )\n    age_bucket_can, _, _ = h_can.create_age_bucket_candidates(\n        features_df,\n        c,\n        kwargs[\"num_age_buckets\"],\n        articles=kwargs[\"num_recent_articles\"],\n        customers=customers,\n    )\n    \n    cand = [recent_customer_cand, cust_last_week_cand, cust_last_week_pair_cand, age_bucket_can]\n    cand = cudf.concat(cand).drop_duplicates()\n    cand = cand.sort_values([\"customer_id\", \"article_id\"]).reset_index(drop=True)\n    \n    del recent_customer_cand, cust_last_week_cand, cust_last_week_pair_cand, age_bucket_can\n    \n    cand = h_can.filter_candidates(cand, t, **kwargs)\n    \n    # creating other features\n    h_fe.create_cust_hier_features(features_df, a, kwargs[\"hier_cols\"], features_db)\n    h_fe.create_price_features(features_df, features_db)\n    h_fe.create_cust_features(c, features_db)\n    h_fe.create_article_cust_features(features_df, c, features_db)\n    h_fe.create_lag_features(features_df, a, kwargs[\"lag_days\"], features_db)\n    h_fe.create_rebuy_features(features_df, features_db)\n    h_fe.create_cust_t_features(features_df, a, features_db)\n    h_fe.create_art_t_features(features_df, features_db)\n    \n    del features_df\n\n    # another filter at the end, for the ones that didn't get filtered earlier\n    if customers is not None:\n        cand = cand[cand[\"customer_id\"].isin(customers)]\n    \n    # report on recall/precision of candidates\n    if kwargs[\"cv\"]:\n        ground_truth_candidates = label_df[[\"customer_id\", \"article_id\"]].drop_duplicates()\n        h_cv.report_candidates(cand, ground_truth_candidates)\n        del ground_truth_candidates        \n    \n    # adding features to candidates\n    cand_with_f_df = h_can.add_features_to_candidates(\n        cand, features_db, c, a\n    )\n    \n    # manually adding article features (couldn't use shelve for some reason)\n    for article_col in kwargs[\"article_columns\"]:\n        art_col_map = a.set_index(\"article_id\")[article_col]\n        cand_with_f_df[article_col] = cand_with_f_df[\"article_id\"].map(art_col_map)\n    \n    # limiting features\n    if kwargs[\"selected_features\"] is not None:\n        cand_with_f_df = cand_with_f_df[\n            [\"customer_id\", \"article_id\"] + kwargs[\"selected_features\"]\n        ]\n        \n    features_db.close()\n    os.remove(\"features_db.bak\"), os.remove(\"features_db.dir\"), os.remove(\"features_db.dat\")\n    \n    assert len(cand) == len(cand_with_f_df), \"seem to have duplicates in the feature dfs\"\n#     del cand\n    \n    return cand_with_f_df, label_df, cand","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:07:48.858077Z","iopub.execute_input":"2022-11-22T07:07:48.858368Z","iopub.status.idle":"2022-11-22T07:07:48.877493Z","shell.execute_reply.started":"2022-11-22T07:07:48.858331Z","shell.execute_reply":"2022-11-22T07:07:48.876717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def calculate_model_score(ids_df, preds, truth_df):\n    predictions = h_modeling.create_predictions(ids_df, preds)\n    true_labels = h_cv.ground_truth(truth_df).set_index(\"customer_id\")[\"prediction\"]\n    score = round(h_cv.comp_average_precision(true_labels, predictions),5)\n    \n    return score","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:07:48.878805Z","iopub.execute_input":"2022-11-22T07:07:48.879486Z","iopub.status.idle":"2022-11-22T07:07:48.890381Z","shell.execute_reply.started":"2022-11-22T07:07:48.879434Z","shell.execute_reply":"2022-11-22T07:07:48.889617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Parameters - one place for all!","metadata":{}},{"cell_type":"code","source":"cv_params = {\n    \"cv\": True,\n    \"feature_periods\": 105,\n    \"label_week\": 104,\n    \"index_to_id_dict_path\": index_to_id_dict_path,\n    \"pairs_file_version\": \"_v3_5_ex\",\n    \"num_recent_candidates\": 36,\n    \"num_recent_articles\": 12,\n    \"hier_col\": \"department_no\",\n    \"ca_num_weeks\": 3,\n    \"clw_num_weeks\": 12,\n    \"clw_num_pair_weeks\": 2,\n    \"pa_num_weeks\": 1,\n    \"num_age_buckets\": 4,\n    \"filter_recent_art_weeks\": 1,\n    \"filter_num_articles\": None,\n    \"lag_days\": [1, 3, 14, 30],\n    \"article_columns\": [\"index_code\"],\n    \"hier_cols\": [\n        \"department_no\", \"section_no\", \"index_group_no\", \"index_code\",\n        \"product_type_no\", \"product_group_name\"\n    ],\n    \"selected_features\": None,\n    \"lgbm_params\": {\"n_estimators\": 200, \"num_leaves\": 20},\n    \"log_evaluation\": 10,\n    \"early_stopping\": 20,\n    \"eval_at\": 12,\n    \"save_model\": True,\n    \"num_concats\": 5,\n}\nsub_params = {\n    \"cv\": False,\n    \"feature_periods\": 105,\n    \"label_week\": 105,\n    \"index_to_id_dict_path\": index_to_id_dict_path,\n    \"pairs_file_version\": \"_v3_5_ex\",\n    \"num_recent_candidates\": 60,\n    \"num_recent_articles\": 12,\n    \"hier_col\": \"department_no\",\n    \"ca_num_weeks\": 3,\n    \"clw_num_weeks\": 12,\n    \"clw_num_pair_weeks\": 2,\n    \"pa_num_weeks\": 1,\n    \"num_age_buckets\": 4,\n    \"filter_recent_art_weeks\": 1,\n    \"filter_num_articles\": None,\n    \"lag_days\": [1, 3, 14, 30],\n    \"article_columns\": [\"index_code\"],\n    \"hier_cols\": [\n        \"department_no\", \"section_no\", \"index_group_no\", \"index_code\",\n        \"product_type_no\", \"product_group_name\"\n    ],\n    \"selected_features\": None,\n    \"lgbm_params\": {\n        \"n_estimators\": 150,\n        \"num_leaves\": 20,    \n    },\n    \"log_evaluation\": 10,\n    \"eval_at\": 12,\n    \"prediction_models\": [\"model_104\", \"model_105\"],\n    \"save_model\": True,\n    \"num_concats\": 5,\n}","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:07:48.891637Z","iopub.execute_input":"2022-11-22T07:07:48.891847Z","iopub.status.idle":"2022-11-22T07:07:48.903514Z","shell.execute_reply.started":"2022-11-22T07:07:48.891823Z","shell.execute_reply":"2022-11-22T07:07:48.902657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cand_features_func = create_candidates_with_features_df\nscoring_func = calculate_model_score","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:07:48.904585Z","iopub.execute_input":"2022-11-22T07:07:48.906626Z","iopub.status.idle":"2022-11-22T07:07:48.918773Z","shell.execute_reply.started":"2022-11-22T07:07:48.906596Z","shell.execute_reply":"2022-11-22T07:07:48.918005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ncv_weeks = [104]\nresults = h_modeling.run_all_cvs(\n    t, c, a, cand_features_func, scoring_func, \n    cv_weeks=cv_weeks, **cv_params\n)","metadata":{"execution":{"iopub.status.busy":"2022-11-22T01:32:09.301119Z","iopub.execute_input":"2022-11-22T01:32:09.301388Z","iopub.status.idle":"2022-11-22T01:36:15.148236Z","shell.execute_reply.started":"2022-11-22T01:32:09.301358Z","shell.execute_reply":"2022-11-22T01:36:15.147491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cand_with_f_df, label_df, cand = cand_features_func(t, c, a, customer_batch=None, **cv_params)","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:07:48.922861Z","iopub.execute_input":"2022-11-22T07:07:48.923114Z","iopub.status.idle":"2022-11-22T07:08:01.962597Z","shell.execute_reply.started":"2022-11-22T07:07:48.923089Z","shell.execute_reply":"2022-11-22T07:08:01.961777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cand","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:08:01.964999Z","iopub.execute_input":"2022-11-22T07:08:01.965483Z","iopub.status.idle":"2022-11-22T07:08:02.020989Z","shell.execute_reply.started":"2022-11-22T07:08:01.965441Z","shell.execute_reply":"2022-11-22T07:08:02.019621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cand_with_f_df.columns","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:31.349524Z","iopub.execute_input":"2022-11-22T05:56:31.349803Z","iopub.status.idle":"2022-11-22T05:56:31.355327Z","shell.execute_reply.started":"2022-11-22T05:56:31.349767Z","shell.execute_reply":"2022-11-22T05:56:31.354596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_df","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:31.356609Z","iopub.execute_input":"2022-11-22T05:56:31.357129Z","iopub.status.idle":"2022-11-22T05:56:31.425809Z","shell.execute_reply.started":"2022-11-22T05:56:31.357095Z","shell.execute_reply":"2022-11-22T05:56:31.425201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_df = label_df[[\"customer_id\", \"article_id\"]].drop_duplicates()\nlabel_df[\"match\"] = 1\ncf_df = cand_with_f_df.merge(label_df, how=\"left\", on=[\"customer_id\", \"article_id\"])\ncf_df[\"match\"] = cf_df[\"match\"].fillna(0).astype(\"int8\")\ncf_df = cf_df.sample(frac=1, random_state=42).reset_index(drop=True)\n# del label_df[\"match\"]\n\n# only customer with some positives ones\ncustomers_with_positives = cf_df.query(\"match==1\")[\"customer_id\"].unique()\ncf_df = cf_df[cf_df[\"customer_id\"].isin(customers_with_positives)]\ncf_df = cf_df.sort_values(\"customer_id\").reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:08:02.024105Z","iopub.execute_input":"2022-11-22T07:08:02.025507Z","iopub.status.idle":"2022-11-22T07:08:02.33916Z","shell.execute_reply.started":"2022-11-22T07:08:02.025463Z","shell.execute_reply":"2022-11-22T07:08:02.338302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 3천만개에서 candidate 통해 데이터를 50만개까지 줄임\n# lg history 데이터는 총 100만개\n# len(t.drop_duplicates(subset=['customer_id','article_id'])),\nlen(t), len(cf_df)","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:31.642106Z","iopub.execute_input":"2022-11-22T05:56:31.642355Z","iopub.status.idle":"2022-11-22T05:56:31.648273Z","shell.execute_reply.started":"2022-11-22T05:56:31.642319Z","shell.execute_reply":"2022-11-22T05:56:31.647519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = cf_df.to_pandas()\ngroup_lengths = list(df.groupby(\"customer_id\")[\"article_id\"].count())","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:09:24.061785Z","iopub.execute_input":"2022-11-22T07:09:24.062371Z","iopub.status.idle":"2022-11-22T07:09:24.351449Z","shell.execute_reply.started":"2022-11-22T07:09:24.062332Z","shell.execute_reply":"2022-11-22T07:09:24.350644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in group_lengths:\n    if i> 1000:\n        print(i)","metadata":{"execution":{"iopub.status.busy":"2022-11-22T07:10:51.924484Z","iopub.execute_input":"2022-11-22T07:10:51.924882Z","iopub.status.idle":"2022-11-22T07:10:51.930996Z","shell.execute_reply.started":"2022-11-22T07:10:51.924747Z","shell.execute_reply":"2022-11-22T07:10:51.929803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(len(t.columns)+len(a.columns)+len(c.columns)),len(cf_df.columns)","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:31.919691Z","iopub.execute_input":"2022-11-22T05:56:31.919961Z","iopub.status.idle":"2022-11-22T05:56:31.928666Z","shell.execute_reply.started":"2022-11-22T05:56:31.919926Z","shell.execute_reply":"2022-11-22T05:56:31.927834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_user = cf_df.customer_id.unique()\nprint('아이템 수 candidate 통해 줄어듬:',len(t[t['customer_id'].isin(train_user)].article_id.unique()),'->', len(cf_df.article_id.unique()))","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:31.930246Z","iopub.execute_input":"2022-11-22T05:56:31.930497Z","iopub.status.idle":"2022-11-22T05:56:32.160098Z","shell.execute_reply.started":"2022-11-22T05:56:31.930464Z","shell.execute_reply":"2022-11-22T05:56:32.159375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# cf_df['ca_last_purchase_week'].astype('float32')\nstr(cf_df['ca_purchase_count'].dtype)","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:32.161126Z","iopub.execute_input":"2022-11-22T05:56:32.161495Z","iopub.status.idle":"2022-11-22T05:56:32.167471Z","shell.execute_reply.started":"2022-11-22T05:56:32.161463Z","shell.execute_reply":"2022-11-22T05:56:32.166721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cand_with_f_df.columns","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:32.168559Z","iopub.execute_input":"2022-11-22T05:56:32.169215Z","iopub.status.idle":"2022-11-22T05:56:32.180389Z","shell.execute_reply.started":"2022-11-22T05:56:32.169178Z","shell.execute_reply":"2022-11-22T05:56:32.179616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_df","metadata":{"execution":{"iopub.status.busy":"2022-11-22T05:56:32.181559Z","iopub.execute_input":"2022-11-22T05:56:32.18222Z","iopub.status.idle":"2022-11-22T05:56:32.235335Z","shell.execute_reply.started":"2022-11-22T05:56:32.182182Z","shell.execute_reply":"2022-11-22T05:56:32.234674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ngc.collect()\nh_modeling.full_sub_train_run(t, c, a, cand_features_func, scoring_func, **sub_params)\npredictions = h_modeling.full_sub_predict_run(\n    t, c, a, cand_features_func, **sub_params\n)","metadata":{"execution":{"iopub.status.busy":"2022-05-10T18:05:55.592758Z","iopub.execute_input":"2022-05-10T18:05:55.593023Z","iopub.status.idle":"2022-05-10T18:13:51.253149Z","shell.execute_reply.started":"2022-05-10T18:05:55.592994Z","shell.execute_reply":"2022-05-10T18:13:51.252409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = h_sub.create_sub(c[\"customer_id\"], predictions, index_to_id_dict_path)\nsub.to_csv('dev_submission.csv', index=False)\n\ndisplay(sub.head())\nprint(sub.shape)","metadata":{"execution":{"iopub.status.busy":"2022-05-10T18:16:30.682484Z","iopub.execute_input":"2022-05-10T18:16:30.68274Z","iopub.status.idle":"2022-05-10T18:18:14.139011Z","shell.execute_reply.started":"2022-05-10T18:16:30.68271Z","shell.execute_reply":"2022-05-10T18:18:14.137713Z"},"trusted":true},"execution_count":null,"outputs":[]}]}