{"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":"!pip install nvtabular==1.3.3","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-28T11:52:34.139022Z","iopub.execute_input":"2023-01-28T11:52:34.139949Z","iopub.status.idle":"2023-01-28T11:54:47.757613Z","shell.execute_reply.started":"2023-01-28T11:52:34.139819Z","shell.execute_reply":"2023-01-28T11:54:47.755867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nimport os\nimport shutil\n\nimport dask.dataframe as dd\nimport numpy as np\nimport pandas as pd\nimport nvtabular as nvt\nfrom merlin.dag import ColumnSelector\nfrom merlin.schema import Tags","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:05.631337Z","iopub.execute_input":"2023-01-28T12:00:05.631828Z","iopub.status.idle":"2023-01-28T12:00:07.890673Z","shell.execute_reply.started":"2023-01-28T12:00:05.631788Z","shell.execute_reply":"2023-01-28T12:00:07.889578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DEBUG = False","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:07.892467Z","iopub.execute_input":"2023-01-28T12:00:07.893453Z","iopub.status.idle":"2023-01-28T12:00:07.898856Z","shell.execute_reply.started":"2023-01-28T12:00:07.893410Z","shell.execute_reply":"2023-01-28T12:00:07.897537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def clean_working_dir():\n    paths = [\n        \"../working/train\",\n        \"../working/valid\",\n        \"../working/test\"\n    ]\n    \n    for p in paths:\n        if os.path.exists(p):\n            shutil.rmtree(p)\n\n    print(os.listdir(\"../working\"))\n    ","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:07.900880Z","iopub.execute_input":"2023-01-28T12:00:07.901854Z","iopub.status.idle":"2023-01-28T12:00:07.915186Z","shell.execute_reply.started":"2023-01-28T12:00:07.901801Z","shell.execute_reply":"2023-01-28T12:00:07.913335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clean_working_dir()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:07.919459Z","iopub.execute_input":"2023-01-28T12:00:07.920394Z","iopub.status.idle":"2023-01-28T12:00:07.928445Z","shell.execute_reply.started":"2023-01-28T12:00:07.920336Z","shell.execute_reply":"2023-01-28T12:00:07.926881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# NVTabular ETL","metadata":{}},{"cell_type":"code","source":"if DEBUG:\n    trainset = \"../input/otto-etl-with-co-visitation/train_0.parquet\"\n    validset = \"../input/otto-etl-with-co-visitation/valid_0.parquet\"\n    testset = \"../input/otto-etl-with-co-visitation/test_0.parquet\"\n    \n    train_output_files=None\n    valid_output_files=None\n    test_output_files=None\nelse:\n    trainset = glob.glob(\"../input/otto-etl-with-co-visitation/train_*.parquet\")\n    validset = glob.glob(\"../input/otto-etl-with-co-visitation/valid_*.parquet\")\n    testset = glob.glob(\"../input/otto-etl-with-co-visitation/test_*.parquet\")\n    \n    train_output_files=60\n    valid_output_files=10\n    test_output_files=10","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:07.930647Z","iopub.execute_input":"2023-01-28T12:00:07.931563Z","iopub.status.idle":"2023-01-28T12:00:07.942516Z","shell.execute_reply.started":"2023-01-28T12:00:07.931499Z","shell.execute_reply":"2023-01-28T12:00:07.941020Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = dd.read_parquet(trainset)\nvalid_df = dd.read_parquet(validset)\ntest_df = dd.read_parquet(testset)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:07.944467Z","iopub.execute_input":"2023-01-28T12:00:07.945359Z","iopub.status.idle":"2023-01-28T12:00:08.051442Z","shell.execute_reply.started":"2023-01-28T12:00:07.945302Z","shell.execute_reply":"2023-01-28T12:00:08.050195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"candidates = np.load(\"../input/otto-etl-with-co-visitation/candidates.npy\")","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:08.053055Z","iopub.execute_input":"2023-01-28T12:00:08.053574Z","iopub.status.idle":"2023-01-28T12:00:08.063092Z","shell.execute_reply.started":"2023-01-28T12:00:08.053542Z","shell.execute_reply":"2023-01-28T12:00:08.061816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"encode_to_aid = dict(enumerate(candidates, start=2))\naid_to_encode = {v: k for k, v in encode_to_aid.items()}","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:08.065150Z","iopub.execute_input":"2023-01-28T12:00:08.065866Z","iopub.status.idle":"2023-01-28T12:00:08.080812Z","shell.execute_reply.started":"2023-01-28T12:00:08.065808Z","shell.execute_reply":"2023-01-28T12:00:08.079789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def to_encode_(aids):\n    return [aid_to_encode.get(x, 1) for x in aids]\n\ndef to_encode(col):\n    result = []\n    for aids in col:\n        result.append(to_encode_(aids))\n    return result","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:08.082368Z","iopub.execute_input":"2023-01-28T12:00:08.083308Z","iopub.status.idle":"2023-01-28T12:00:08.094559Z","shell.execute_reply.started":"2023-01-28T12:00:08.083269Z","shell.execute_reply":"2023-01-28T12:00:08.093090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def get_first(col):\n#     result = []\n#     for aids in col:\n#         if type(aids) is list:\n#             try:\n#                 result.append(aids[0])\n#             except:\n#                 print(aids)                \n#         else:\n#             result.append(aids)\n#     return result","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:08.981721Z","iopub.execute_input":"2023-01-28T12:00:08.982459Z","iopub.status.idle":"2023-01-28T12:00:08.987563Z","shell.execute_reply.started":"2023-01-28T12:00:08.982422Z","shell.execute_reply":"2023-01-28T12:00:08.986053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df.apply(get_first, axis=1).head()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:09.407603Z","iopub.execute_input":"2023-01-28T12:00:09.408095Z","iopub.status.idle":"2023-01-28T12:00:09.414168Z","shell.execute_reply.started":"2023-01-28T12:00:09.408054Z","shell.execute_reply":"2023-01-28T12:00:09.412487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:09.656233Z","iopub.execute_input":"2023-01-28T12:00:09.657132Z","iopub.status.idle":"2023-01-28T12:00:11.125496Z","shell.execute_reply.started":"2023-01-28T12:00:09.657070Z","shell.execute_reply":"2023-01-28T12:00:11.124180Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:11.128177Z","iopub.execute_input":"2023-01-28T12:00:11.128579Z","iopub.status.idle":"2023-01-28T12:00:12.013274Z","shell.execute_reply.started":"2023-01-28T12:00:11.128545Z","shell.execute_reply":"2023-01-28T12:00:12.012225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:00:12.014866Z","iopub.execute_input":"2023-01-28T12:00:12.015960Z","iopub.status.idle":"2023-01-28T12:00:12.798364Z","shell.execute_reply.started":"2023-01-28T12:00:12.015921Z","shell.execute_reply":"2023-01-28T12:00:12.797027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Number of products ordered vs. number of products clicked\n\nhttps://www.kaggle.com/code/parthpankajtiwary/otto-eda-understanding-users-and-events?scriptVersionId=111667650&cellId=50","metadata":{}},{"cell_type":"code","source":"session_features = (\n    ColumnSelector([\"session\"]) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 1,\n            },\n            \"int_domain\": {\n                \"name\": \"event_type\",\n                \"min\": 0,\n                \"max\": 12899778,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\n\nevent_features = (\n    ColumnSelector([\"event_type\"]) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 1,\n            },\n            \"int_domain\": {\n                \"name\": \"event_type\",\n                \"min\": 1,\n                \"max\": 3,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\ntop_20_clicks_features = (\n    ColumnSelector([\"top_20_clicks-list\"]) >>\n    nvt.ops.LambdaOp(to_encode) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 20,\n            },\n            \"int_domain\": {\n                \"name\": \"top_20_clicks-list\",\n                \"min\": 1,\n                \"max\": 19999,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\ntop_15_buy2buy_features = (\n    ColumnSelector([\"top_15_buy2buy-list\"]) >>\n    nvt.ops.LambdaOp(to_encode) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 15,\n            },\n            \"int_domain\": {\n                \"name\": \"top_15_buy2buy-list\",\n                \"min\": 1,\n                \"max\": 19999,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\ntop_15_carts_orders_features = (\n    ColumnSelector([\"top_15_carts_orders-list\"]) >>\n    nvt.ops.LambdaOp(to_encode) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 15,\n            },\n            \"int_domain\": {\n                \"name\": \"top_15_carts_orders-list\",\n                \"min\": 1,\n                \"max\": 19999,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\naid_features = (\n    ColumnSelector([\"aid-list\"]) >>\n    nvt.ops.LambdaOp(to_encode) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.ITEM_ID],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 500,\n            },\n            \"int_domain\": {\n                \"name\": \"aid-list\",\n                \"min\": 1,\n                \"max\": 19999,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\ntop_20_clicks_raws_features = (\n    ColumnSelector([\"top_20_clicks-list\"]) >>\n    nvt.ops.Rename(postfix='_raws') >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 20,\n            },\n            \"int_domain\": {\n                \"name\": \"top_20_clicks-list\",\n                \"min\": 1,\n                \"max\": 1855603,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\ntop_15_buy2buy_raws_features = (\n    ColumnSelector([\"top_15_buy2buy-list\"]) >>\n    nvt.ops.Rename(postfix='_raws') >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 15,\n            },\n            \"int_domain\": {\n                \"name\": \"top_15_buy2buy-list\",\n                \"min\": 1,\n                \"max\": 1855603,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\ntop_15_carts_orders_raws_features = (\n    ColumnSelector([\"top_15_carts_orders-list\"]) >>\n    nvt.ops.Rename(postfix='_raws') >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 15,\n            },\n            \"int_domain\": {\n                \"name\": \"top_15_carts_orders-list\",\n                \"min\": 1,\n                \"max\": 1855603,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\naid_raws_features = (\n    ColumnSelector([\"aid-list\"]) >>\n    nvt.ops.Rename(postfix='_raws') >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\": 1,\n                \"max\": 500,\n            },\n            \"int_domain\": {\n                \"name\": \"aid-list\",\n                \"min\": 1,\n                \"max\": 1855603,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\nlabels_clicks_features = (\n    ColumnSelector([\"labels_clicks\"]) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\":1,\n                \"max\":1,\n            },\n            \"int_domain\": {\n                \"name\": \"labels_clicks\",\n                \"min\": 1,\n                \"max\": 1855603,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\nlabels_carts_features = (\n    ColumnSelector([\"labels_carts\"]) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\":1,\n                \"max\":150,\n            },\n            \"int_domain\": {\n                \"name\": \"labels_carts\",\n                \"min\": 1,\n                \"max\": 1855603,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)\n\nlabels_orders_features = (\n    ColumnSelector([\"labels_orders\"]) >>\n    nvt.ops.AddMetadata(\n        tags=[Tags.CATEGORICAL, Tags.CONTEXT],\n        properties={\n            \"value_count\": {\n                \"min\":1,\n                \"max\":100,\n            },\n            \"int_domain\": {\n                \"name\": \"labels_orders\",\n                \"min\": 1,\n                \"max\": 1855603,\n                \"is_categorical\": True,\n            }\n        }\n    )\n)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:13.734286Z","iopub.execute_input":"2023-01-28T12:20:13.734773Z","iopub.status.idle":"2023-01-28T12:20:13.765898Z","shell.execute_reply.started":"2023-01-28T12:20:13.734739Z","shell.execute_reply":"2023-01-28T12:20:13.764214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_features = (\n    session_features +\n    event_features +\n    top_20_clicks_features +\n    top_15_buy2buy_features +\n    top_15_carts_orders_features +\n    aid_features +\n    top_20_clicks_raws_features +\n    top_15_buy2buy_raws_features +\n    top_15_carts_orders_raws_features +\n    aid_raws_features +\n    labels_clicks_features +\n    labels_carts_features +\n    labels_orders_features\n)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:13.872237Z","iopub.execute_input":"2023-01-28T12:20:13.872678Z","iopub.status.idle":"2023-01-28T12:20:13.879196Z","shell.execute_reply.started":"2023-01-28T12:20:13.872647Z","shell.execute_reply":"2023-01-28T12:20:13.878159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainset = nvt.Dataset(train_df, cpu=True)\nvalidset = nvt.Dataset(valid_df, cpu=True)\ntestset = nvt.Dataset(test_df, cpu=True)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:14.004682Z","iopub.execute_input":"2023-01-28T12:20:14.006024Z","iopub.status.idle":"2023-01-28T12:20:16.004903Z","shell.execute_reply.started":"2023-01-28T12:20:14.005977Z","shell.execute_reply":"2023-01-28T12:20:16.003759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"workflow = nvt.Workflow(all_features)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:16.006797Z","iopub.execute_input":"2023-01-28T12:20:16.007764Z","iopub.status.idle":"2023-01-28T12:20:16.013053Z","shell.execute_reply.started":"2023-01-28T12:20:16.007724Z","shell.execute_reply":"2023-01-28T12:20:16.011808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_output_path = \"../working/train\"\nvalid_output_path = \"../working/valid\"\ntest_output_path = \"../working/test\"","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:16.014567Z","iopub.execute_input":"2023-01-28T12:20:16.014929Z","iopub.status.idle":"2023-01-28T12:20:16.025500Z","shell.execute_reply.started":"2023-01-28T12:20:16.014898Z","shell.execute_reply":"2023-01-28T12:20:16.024379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nworkflow.fit(trainset)\nworkflow.transform(trainset).to_parquet(output_path=train_output_path, output_files=train_output_files)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:16.029807Z","iopub.execute_input":"2023-01-28T12:20:16.030299Z","iopub.status.idle":"2023-01-28T12:20:30.551289Z","shell.execute_reply.started":"2023-01-28T12:20:16.030262Z","shell.execute_reply":"2023-01-28T12:20:30.550200Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nworkflow.fit(validset)\nworkflow.transform(validset).to_parquet(output_path=valid_output_path, output_files=valid_output_files)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:30.553143Z","iopub.execute_input":"2023-01-28T12:20:30.553791Z","iopub.status.idle":"2023-01-28T12:20:41.419258Z","shell.execute_reply.started":"2023-01-28T12:20:30.553755Z","shell.execute_reply":"2023-01-28T12:20:41.417917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nworkflow.fit(testset)\nworkflow.transform(testset).to_parquet(output_path=test_output_path, output_files=test_output_files)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:41.420908Z","iopub.execute_input":"2023-01-28T12:20:41.422354Z","iopub.status.idle":"2023-01-28T12:20:52.045545Z","shell.execute_reply.started":"2023-01-28T12:20:41.422303Z","shell.execute_reply":"2023-01-28T12:20:52.044058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"workflow.output_schema","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:52.048088Z","iopub.execute_input":"2023-01-28T12:20:52.049985Z","iopub.status.idle":"2023-01-28T12:20:52.067259Z","shell.execute_reply.started":"2023-01-28T12:20:52.049940Z","shell.execute_reply":"2023-01-28T12:20:52.065999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"workflow.output_schema.column_names","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:52.069895Z","iopub.execute_input":"2023-01-28T12:20:52.070307Z","iopub.status.idle":"2023-01-28T12:20:52.081717Z","shell.execute_reply.started":"2023-01-28T12:20:52.070264Z","shell.execute_reply":"2023-01-28T12:20:52.080492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cat ../working/train/schema.pbtxt","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:52.083928Z","iopub.execute_input":"2023-01-28T12:20:52.084481Z","iopub.status.idle":"2023-01-28T12:20:53.281922Z","shell.execute_reply.started":"2023-01-28T12:20:52.084435Z","shell.execute_reply":"2023-01-28T12:20:53.280200Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dd.read_parquet(train_output_path).head()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:53.283832Z","iopub.execute_input":"2023-01-28T12:20:53.284362Z","iopub.status.idle":"2023-01-28T12:20:54.035813Z","shell.execute_reply.started":"2023-01-28T12:20:53.284323Z","shell.execute_reply":"2023-01-28T12:20:54.034630Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dd.read_parquet(valid_output_path).head()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:54.037105Z","iopub.execute_input":"2023-01-28T12:20:54.037438Z","iopub.status.idle":"2023-01-28T12:20:54.739834Z","shell.execute_reply.started":"2023-01-28T12:20:54.037411Z","shell.execute_reply":"2023-01-28T12:20:54.738715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dd.read_parquet(test_output_path).head()","metadata":{"execution":{"iopub.status.busy":"2023-01-28T12:20:54.741271Z","iopub.execute_input":"2023-01-28T12:20:54.741636Z","iopub.status.idle":"2023-01-28T12:20:55.423543Z","shell.execute_reply.started":"2023-01-28T12:20:54.741601Z","shell.execute_reply":"2023-01-28T12:20:55.422210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}