{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":38760,"databundleVersionId":4493939,"sourceType":"competition"},{"sourceId":4436180,"sourceType":"datasetVersion","datasetId":2597726}],"dockerImageVersionId":30684,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#基于BPR矩阵分解获得商品的相似性，嵌入到itemCF，优化推荐效果","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-30T08:29:58.510997Z","iopub.execute_input":"2024-05-30T08:29:58.511459Z","iopub.status.idle":"2024-05-30T08:29:58.574254Z","shell.execute_reply.started":"2024-05-30T08:29:58.511420Z","shell.execute_reply":"2024-05-30T08:29:58.572795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd, numpy as np\n\nimport glob\n\nimport scipy.sparse as sparse\n\nimport implicit\n\nfrom tqdm import tqdm\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nfrom datetime import datetime\n\nfrom tqdm import tqdm\n\ntype_labels = {'clicks':1, 'carts':2, 'orders':3}","metadata":{"execution":{"iopub.status.busy":"2024-05-30T09:20:56.951693Z","iopub.execute_input":"2024-05-30T09:20:56.952206Z","iopub.status.idle":"2024-05-30T09:20:56.965778Z","shell.execute_reply.started":"2024-05-30T09:20:56.952171Z","shell.execute_reply":"2024-05-30T09:20:56.964141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load(which):    \n    dfs = []\n\n    test_files = glob.glob('/kaggle/input/otto-chunk-data-inparquet-format/'+which+'_parquet/*')\n    \n    for e, chunk_file in enumerate(test_files):\n        chunk = pd.read_parquet(chunk_file)\n        chunk.ts = (chunk.ts/1000).astype('int32')\n        chunk['type'] = chunk['type'].map(type_labels).astype('int8')\n        dfs.append(chunk)\n        \n    return pd.concat(dfs).reset_index(drop=True) #.astype({\"ts\": \"datetime64[ms]\"})","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:30:01.032217Z","iopub.execute_input":"2024-05-30T08:30:01.032709Z","iopub.status.idle":"2024-05-30T08:30:01.040692Z","shell.execute_reply.started":"2024-05-30T08:30:01.032676Z","shell.execute_reply":"2024-05-30T08:30:01.039126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = load('train')","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:30:01.042298Z","iopub.execute_input":"2024-05-30T08:30:01.042749Z","iopub.status.idle":"2024-05-30T08:31:06.955422Z","shell.execute_reply.started":"2024-05-30T08:30:01.042700Z","shell.execute_reply":"2024-05-30T08:31:06.953582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df[train_df['ts']>=1661385600].reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:31:06.959334Z","iopub.execute_input":"2024-05-30T08:31:06.959749Z","iopub.status.idle":"2024-05-30T08:31:08.899250Z","shell.execute_reply.started":"2024-05-30T08:31:06.959714Z","shell.execute_reply":"2024-05-30T08:31:08.897857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:31:08.906823Z","iopub.execute_input":"2024-05-30T08:31:08.907207Z","iopub.status.idle":"2024-05-30T08:31:08.927516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['datetime'] = train_df['ts'].apply(lambda x: datetime.fromtimestamp(x))","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:31:08.929186Z","iopub.execute_input":"2024-05-30T08:31:08.929527Z","iopub.status.idle":"2024-05-30T08:32:24.663496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:32:24.665341Z","iopub.execute_input":"2024-05-30T08:32:24.665733Z","iopub.status.idle":"2024-05-30T08:32:24.682982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"train_df['day'] = train_df['datetime'].dt.day","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:32:24.684720Z","iopub.execute_input":"2024-05-30T08:32:24.685195Z","iopub.status.idle":"2024-05-30T08:32:25.583563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:32:25.584779Z","iopub.execute_input":"2024-05-30T08:32:25.585181Z","iopub.status.idle":"2024-05-30T08:32:25.611759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_val_offline = train_df[train_df['day']==28].reset_index(drop=True)\ndf_train_offline = train_df[train_df['day']<28].reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:15:49.398369Z","iopub.execute_input":"2024-05-30T11:15:49.398778Z","iopub.status.idle":"2024-05-30T11:15:52.089678Z","shell.execute_reply.started":"2024-05-30T11:15:49.398747Z","shell.execute_reply":"2024-05-30T11:15:52.088320Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_val_offline","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:09:24.308102Z","iopub.execute_input":"2024-05-30T11:09:24.308926Z","iopub.status.idle":"2024-05-30T11:09:24.327201Z","shell.execute_reply.started":"2024-05-30T11:09:24.308853Z","shell.execute_reply":"2024-05-30T11:09:24.325720Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_offline","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:09:27.548842Z","iopub.execute_input":"2024-05-30T11:09:27.549835Z","iopub.status.idle":"2024-05-30T11:09:27.572667Z","shell.execute_reply.started":"2024-05-30T11:09:27.549792Z","shell.execute_reply":"2024-05-30T11:09:27.570993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_offline = df_train_offline.sort_values('ts',ascending=True).reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:32:27.838234Z","iopub.execute_input":"2024-05-30T08:32:27.838631Z","iopub.status.idle":"2024-05-30T08:32:33.383596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_offline","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:32:33.385527Z","iopub.execute_input":"2024-05-30T08:32:33.386017Z","iopub.status.idle":"2024-05-30T08:32:33.402943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"首先从 df_train_offline 数据框中选取了 'session' 和 'aid' 这两列，然后使用 groupby 方法按照 'session' 进行分组，且设置 as_index=False 表示分组后的索引不使用分组列。接着使用 agg 方法对每个分组应用聚合操作，将每个分组中 'aid' 的值聚合为一个列表。最终得到一个新的数据框 session_aids_df ，其中包含了按 session 分组后 'aid' 的列表","metadata":{}},{"cell_type":"code","source":"#按id和商品的编号分组\nsession_aids_df = df_train_offline[['session','aid']].groupby('session',as_index=False).agg(list)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:32:33.404475Z","iopub.execute_input":"2024-05-30T08:32:33.404932Z","iopub.status.idle":"2024-05-30T08:34:08.271703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"session_aids_df","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:34:08.273572Z","iopub.execute_input":"2024-05-30T08:34:08.273947Z","iopub.status.idle":"2024-05-30T08:34:08.295567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import defaultdict","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:34:08.296991Z","iopub.execute_input":"2024-05-30T08:34:08.297362Z","iopub.status.idle":"2024-05-30T08:34:08.309546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"这里是给 session_aids_df 数据框添加了一个新列 'session_activity'，该列的值是通过对 'aid' 列应用一个 lambda 函数计算得到的，这个 lambda 函数计算的是 'aid' 所对应列表的长度。也就是说，新添加的列表示每个分组中 'aid' 列表的元素个数","metadata":{}},{"cell_type":"code","source":"session_aids_df['session_activity'] = session_aids_df['aid'].apply(lambda x: len(x))","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:34:08.311737Z","iopub.execute_input":"2024-05-30T08:34:08.312142Z","iopub.status.idle":"2024-05-30T08:34:10.372468Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"session_aids_df\n","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:34:10.373716Z","iopub.execute_input":"2024-05-30T08:34:10.374213Z","iopub.status.idle":"2024-05-30T08:34:10.393441Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"创建了一个字典 session_dict，它是通过将 session_aids_df 中的 'session' 列和 'session_activity' 列进行 zip 操作（将对应元素组合在一起），然后再转换为字典。这样字典的键就是各个 'session' 值，字典的值就是对应的 'session_activity' 值，简而言之就是用户id对应的活跃商品数量。","metadata":{}},{"cell_type":"code","source":"session_dict = dict(zip(session_aids_df['session'],session_aids_df['session_activity']))","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:34:10.394627Z","iopub.execute_input":"2024-05-30T08:34:10.395047Z","iopub.status.idle":"2024-05-30T08:34:11.967682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:34:11.969976Z","iopub.execute_input":"2024-05-30T08:34:11.970649Z","iopub.status.idle":"2024-05-30T08:34:11.985044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"BPR\n","metadata":{}},{"cell_type":"markdown","source":"用户有对商品的偏好和操作，就为1，否则为0，以此创建矩阵","metadata":{}},{"cell_type":"code","source":"!pip install implicit ","metadata":{"execution":{"iopub.status.busy":"2024-05-30T08:34:12.207652Z","iopub.execute_input":"2024-05-30T08:34:12.208065Z","iopub.status.idle":"2024-05-30T08:34:30.616672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#切片一千个数据\ndata = df_train_offline.iloc[:1000]\ndata","metadata":{"execution":{"iopub.status.busy":"2024-05-30T09:55:53.804236Z","iopub.execute_input":"2024-05-30T09:55:53.804674Z","iopub.status.idle":"2024-05-30T09:55:53.819543Z","shell.execute_reply.started":"2024-05-30T09:55:53.804644Z","shell.execute_reply":"2024-05-30T09:55:53.818310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#用户-商品特征向量 根据每个用户对商品的交互来分解用户特征\ndata['user'], user_index = pd.factorize(data['session'])\ndata['item'], item_index = pd.factorize(data['aid'])","metadata":{"execution":{"iopub.status.busy":"2024-05-30T09:56:15.766716Z","iopub.execute_input":"2024-05-30T09:56:15.767196Z","iopub.status.idle":"2024-05-30T09:56:15.775811Z","shell.execute_reply.started":"2024-05-30T09:56:15.767160Z","shell.execute_reply":"2024-05-30T09:56:15.774483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data","metadata":{"execution":{"iopub.status.busy":"2024-05-30T09:58:08.641287Z","iopub.execute_input":"2024-05-30T09:58:08.641704Z","iopub.status.idle":"2024-05-30T09:58:08.659266Z","shell.execute_reply.started":"2024-05-30T09:58:08.641673Z","shell.execute_reply":"2024-05-30T09:58:08.657793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data['user']","metadata":{"execution":{"iopub.status.busy":"2024-05-30T09:57:46.229598Z","iopub.execute_input":"2024-05-30T09:57:46.230349Z","iopub.status.idle":"2024-05-30T09:57:46.239032Z","shell.execute_reply.started":"2024-05-30T09:57:46.230311Z","shell.execute_reply":"2024-05-30T09:57:46.237985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"user_index#673个不重复的session","metadata":{"execution":{"iopub.status.busy":"2024-05-30T09:56:49.348829Z","iopub.execute_input":"2024-05-30T09:56:49.349405Z","iopub.status.idle":"2024-05-30T09:56:49.358132Z","shell.execute_reply.started":"2024-05-30T09:56:49.349368Z","shell.execute_reply":"2024-05-30T09:56:49.356362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_index#902个不重复的商品","metadata":{"execution":{"iopub.status.busy":"2024-05-30T09:57:14.264274Z","iopub.execute_input":"2024-05-30T09:57:14.264737Z","iopub.status.idle":"2024-05-30T09:57:14.274216Z","shell.execute_reply.started":"2024-05-30T09:57:14.264706Z","shell.execute_reply":"2024-05-30T09:57:14.272536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#建立模型,所有用户有过交互的商品都为1，创建矩阵\nuser_item_matrix = sparse.csr_matrix((np.ones(len(data)),(data['user'], data['item'])))\nprint(user_item_matrix)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:01:52.849751Z","iopub.execute_input":"2024-05-30T10:01:52.850190Z","iopub.status.idle":"2024-05-30T10:01:52.862375Z","shell.execute_reply.started":"2024-05-30T10:01:52.850158Z","shell.execute_reply":"2024-05-30T10:01:52.860867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#建模\nmodel = implicit.bpr.BayesianPersonalizedRanking(factors = 64,regularization=0.001,iterations=100,random_state=0)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:02:02.248736Z","iopub.execute_input":"2024-05-30T10:02:02.249189Z","iopub.status.idle":"2024-05-30T10:02:02.256872Z","shell.execute_reply.started":"2024-05-30T10:02:02.249156Z","shell.execute_reply":"2024-05-30T10:02:02.255290Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(user_item_matrix)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:10:19.821648Z","iopub.execute_input":"2024-05-30T10:10:19.822122Z","iopub.status.idle":"2024-05-30T10:10:20.023919Z","shell.execute_reply.started":"2024-05-30T10:10:19.822080Z","shell.execute_reply":"2024-05-30T10:10:20.022735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"user_item_matrix.shape","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:12:29.828356Z","iopub.execute_input":"2024-05-30T10:12:29.829661Z","iopub.status.idle":"2024-05-30T10:12:29.840528Z","shell.execute_reply.started":"2024-05-30T10:12:29.829604Z","shell.execute_reply":"2024-05-30T10:12:29.839129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#对每个用户进行推荐\n#user_item_matrix.shape[0]存的是用户的id的数量长度\n#top_20是给该用户推荐的20件商品\nrecommend_aid={}\nfor user in tqdm(range(user_item_matrix.shape[0])):\n    top_20=model.recommend(user,user_item_matrix[user],20)\n    recommend_aid[user]=top_20","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:16:52.051505Z","iopub.execute_input":"2024-05-30T10:16:52.052358Z","iopub.status.idle":"2024-05-30T10:16:53.312416Z","shell.execute_reply.started":"2024-05-30T10:16:52.052295Z","shell.execute_reply":"2024-05-30T10:16:53.310138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" recommend_aid[user]","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:30:19.393146Z","iopub.execute_input":"2024-05-30T10:30:19.393606Z","iopub.status.idle":"2024-05-30T10:30:19.407948Z","shell.execute_reply.started":"2024-05-30T10:30:19.393568Z","shell.execute_reply":"2024-05-30T10:30:19.406372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#把计算好的加入到df中，去更直观的看出每个用户对推荐的商品的得分\nscore_aid_df=pd.DataFrame()\nfor user,(aid,scores) in tqdm(recommend_aid.items()):\n    score_aid=pd.DataFrame({'user_id':user,\"aid_id\":aid,'score':scores})\n    score_aid_df = pd.concat([score_aid_df, score_aid])\nscore_aid_df","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:59:22.608484Z","iopub.execute_input":"2024-05-30T10:59:22.608901Z","iopub.status.idle":"2024-05-30T10:59:23.074338Z","shell.execute_reply.started":"2024-05-30T10:59:22.608870Z","shell.execute_reply":"2024-05-30T10:59:23.072930Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"对测试集进行处理，用模型试试效果，处理过程同训练集，要写出矩阵的之间的关系。","metadata":{}},{"cell_type":"code","source":"print(df_val_offline.isnull().sum())","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:21:21.547058Z","iopub.execute_input":"2024-05-30T11:21:21.547538Z","iopub.status.idle":"2024-05-30T11:21:21.626304Z","shell.execute_reply.started":"2024-05-30T11:21:21.547497Z","shell.execute_reply":"2024-05-30T11:21:21.624864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_val = df_val_offline.iloc[:1200]\nprint(df_val.isnull().sum())","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:21:35.174563Z","iopub.execute_input":"2024-05-30T11:21:35.174990Z","iopub.status.idle":"2024-05-30T11:21:35.183897Z","shell.execute_reply.started":"2024-05-30T11:21:35.174958Z","shell.execute_reply":"2024-05-30T11:21:35.182524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_val['user'], user_index2 = pd.factorize(df_val['session'])\ndf_val['item'], aid_index2 = pd.factorize(df_val['aid'])\ndf_val","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:23:54.284618Z","iopub.execute_input":"2024-05-30T11:23:54.285134Z","iopub.status.idle":"2024-05-30T11:23:54.305276Z","shell.execute_reply.started":"2024-05-30T11:23:54.285101Z","shell.execute_reply":"2024-05-30T11:23:54.303677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"user_item_matrix_test = sparse.csr_matrix((np.ones(len(df_val)),(df_val['user'], df_val['item'])))\nprint(user_item_matrix_test)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:25:51.739741Z","iopub.execute_input":"2024-05-30T11:25:51.740678Z","iopub.status.idle":"2024-05-30T11:25:51.751382Z","shell.execute_reply.started":"2024-05-30T11:25:51.740636Z","shell.execute_reply":"2024-05-30T11:25:51.749996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(user_item_matrix_test)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T11:25:56.929746Z","iopub.execute_input":"2024-05-30T11:25:56.930199Z","iopub.status.idle":"2024-05-30T11:25:57.186822Z","shell.execute_reply.started":"2024-05-30T11:25:56.930165Z","shell.execute_reply":"2024-05-30T11:25:57.185279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_Sim = defaultdict()#创建默认字典\n\nfor i,row in tqdm(session_aids_df.iterrows(), total=len(session_aids_df) ):\n    \n    aid_list = row['aid']\n    \n    for loc1, item in enumerate(aid_list):\n        \n        item_Sim.setdefault(item,dict())\n        \n        for loc2, related_item in enumerate(aid_list):\n            if item == related_item:\n                continue\n        \n            item_Sim[item].setdefault(related_item,0)\n            \n            if loc1 < loc2:\n                item_Sim[item][related_item] += 1 * 0.7 ** (loc2-loc1-1) * 1/math.log(session_dict[row['session']]+1)\n            else:\n                item_Sim[item][related_item] += 0.7 * 0.7 ** (loc1-loc2-1) * 1/math.log(session_dict[row['session']]+1)","metadata":{"execution":{"iopub.status.busy":"2024-05-30T10:31:18.991470Z","iopub.execute_input":"2024-05-30T10:31:18.991961Z","iopub.status.idle":"2024-05-30T10:37:28.348267Z","shell.execute_reply.started":"2024-05-30T10:31:18.991925Z","shell.execute_reply":"2024-05-30T10:37:28.346338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# to be continue","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}