{"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":30664,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 实验2 （2）分行为使用itemCF ","metadata":{"execution":{"iopub.status.busy":"2024-06-09T03:53:02.080517Z","iopub.execute_input":"2024-06-09T03:53:02.08121Z","iopub.status.idle":"2024-06-09T03:53:02.087656Z","shell.execute_reply.started":"2024-06-09T03:53:02.081174Z","shell.execute_reply":"2024-06-09T03:53:02.086469Z"}}},{"cell_type":"code","source":"import pandas as pd, numpy as np\n\nimport glob\n\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-06-09T07:02:00.292395Z","iopub.execute_input":"2024-06-09T07:02:00.292803Z","iopub.status.idle":"2024-06-09T07:02:01.542871Z","shell.execute_reply.started":"2024-06-09T07:02:00.292774Z","shell.execute_reply":"2024-06-09T07:02:01.541687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"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-06-09T07:02:01.544823Z","iopub.execute_input":"2024-06-09T07:02:01.545325Z","iopub.status.idle":"2024-06-09T07:02:01.552226Z","shell.execute_reply.started":"2024-06-09T07:02:01.545292Z","shell.execute_reply":"2024-06-09T07:02:01.551132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = load('train')","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:02:01.553536Z","iopub.execute_input":"2024-06-09T07:02:01.553864Z","iopub.status.idle":"2024-06-09T07:02:56.223506Z","shell.execute_reply.started":"2024-06-09T07:02:01.553836Z","shell.execute_reply":"2024-06-09T07:02:56.222487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# To reduce runtime, only consider data from the last four days as train_df.","metadata":{}},{"cell_type":"code","source":"datetime.strptime(\"2022-08-25 00:00:00\", \"%Y-%m-%d %H:%M:%S\").timestamp()","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:02:56.224793Z","iopub.execute_input":"2024-06-09T07:02:56.225524Z","iopub.status.idle":"2024-06-09T07:02:56.234827Z","shell.execute_reply.started":"2024-06-09T07:02:56.225481Z","shell.execute_reply":"2024-06-09T07:02:56.233795Z"},"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-06-09T07:02:56.237696Z","iopub.execute_input":"2024-06-09T07:02:56.238022Z","iopub.status.idle":"2024-06-09T07:02:58.066669Z","shell.execute_reply.started":"2024-06-09T07:02:56.237995Z","shell.execute_reply":"2024-06-09T07:02:58.065553Z"},"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-06-09T07:02:58.068235Z","iopub.execute_input":"2024-06-09T07:02:58.068669Z","iopub.status.idle":"2024-06-09T07:03:38.009003Z","shell.execute_reply.started":"2024-06-09T07:02:58.068632Z","shell.execute_reply":"2024-06-09T07:03:38.008023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Choose the last day as the validation set.","metadata":{}},{"cell_type":"code","source":"train_df['datetime'].dt.day.unique()","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:03:38.010195Z","iopub.execute_input":"2024-06-09T07:03:38.010507Z","iopub.status.idle":"2024-06-09T07:03:38.991692Z","shell.execute_reply.started":"2024-06-09T07:03:38.010480Z","shell.execute_reply":"2024-06-09T07:03:38.990297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['day'] = train_df['datetime'].dt.day","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:03:38.992954Z","iopub.execute_input":"2024-06-09T07:03:38.993271Z","iopub.status.idle":"2024-06-09T07:03:39.840344Z","shell.execute_reply.started":"2024-06-09T07:03:38.993244Z","shell.execute_reply":"2024-06-09T07:03:39.839413Z"},"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-06-09T07:03:39.841895Z","iopub.execute_input":"2024-06-09T07:03:39.842761Z","iopub.status.idle":"2024-06-09T07:03:41.821474Z","shell.execute_reply.started":"2024-06-09T07:03:39.842720Z","shell.execute_reply":"2024-06-09T07:03:41.820424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"df_train_offline","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:03:41.822606Z","iopub.execute_input":"2024-06-09T07:03:41.822902Z","iopub.status.idle":"2024-06-09T07:03:41.840264Z","shell.execute_reply.started":"2024-06-09T07:03:41.822874Z","shell.execute_reply":"2024-06-09T07:03:41.839188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_offline['aid'].nunique()","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:03:41.841721Z","iopub.execute_input":"2024-06-09T07:03:41.842003Z","iopub.status.idle":"2024-06-09T07:03:42.334994Z","shell.execute_reply.started":"2024-06-09T07:03:41.841980Z","shell.execute_reply":"2024-06-09T07:03:42.333984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 我们将`df_train_offline`针对不同type进行分割，分成`df_train_offline1`、`df_train_offline2`、`df_train_offline3`三种类别","metadata":{}},{"cell_type":"code","source":"# 使用 groupby 根据 type 分割数据\ngrouped = df_train_offline.groupby('type')\n\n# 从分组中获取每个 type 的 DataFrame\ndf_train_offline1 = grouped.get_group(1)\ndf_train_offline2 = grouped.get_group(2)\ndf_train_offline3 = grouped.get_group(3)\n\n# 现在 df_train_offline1, df_train_offline2, df_train_offline3 包含相应 type 的数据","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:03:42.336365Z","iopub.execute_input":"2024-06-09T07:03:42.336685Z","iopub.status.idle":"2024-06-09T07:03:43.984715Z","shell.execute_reply.started":"2024-06-09T07:03:42.336657Z","shell.execute_reply":"2024-06-09T07:03:43.983715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_offline2","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:03:43.986272Z","iopub.execute_input":"2024-06-09T07:03:43.986569Z","iopub.status.idle":"2024-06-09T07:03:43.999554Z","shell.execute_reply.started":"2024-06-09T07:03:43.986544Z","shell.execute_reply":"2024-06-09T07:03:43.998337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"session_aids_df1 = df_train_offline1[['session','aid']].groupby('session',as_index=False).agg(list)\nsession_aids_df2 = df_train_offline2[['session','aid']].groupby('session',as_index=False).agg(list)\nsession_aids_df3 = df_train_offline3[['session','aid']].groupby('session',as_index=False).agg(list)","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:03:44.003913Z","iopub.execute_input":"2024-06-09T07:03:44.004926Z","iopub.status.idle":"2024-06-09T07:05:04.578855Z","shell.execute_reply.started":"2024-06-09T07:03:44.004888Z","shell.execute_reply":"2024-06-09T07:05:04.577658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 与实验1类似，这里我们不再对验证集进行划分","metadata":{}},{"cell_type":"code","source":"session_aids_df_val = df_val_offline[['session','aid']].groupby('session',as_index=False).agg(list)","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:04.580469Z","iopub.execute_input":"2024-06-09T07:05:04.580894Z","iopub.status.idle":"2024-06-09T07:05:34.992269Z","shell.execute_reply.started":"2024-06-09T07:05:04.580856Z","shell.execute_reply":"2024-06-09T07:05:34.990672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"session_aids_df_val","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:34.995395Z","iopub.execute_input":"2024-06-09T07:05:34.995840Z","iopub.status.idle":"2024-06-09T07:05:35.013641Z","shell.execute_reply.started":"2024-06-09T07:05:34.995801Z","shell.execute_reply":"2024-06-09T07:05:35.012279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"session_aids_df1","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.015085Z","iopub.execute_input":"2024-06-09T07:05:35.015510Z","iopub.status.idle":"2024-06-09T07:05:35.040009Z","shell.execute_reply.started":"2024-06-09T07:05:35.015471Z","shell.execute_reply":"2024-06-09T07:05:35.038807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 保留前1000行并重置索引\nsession_aids_df1 = session_aids_df1.head(1000).reset_index(drop=True)\nsession_aids_df2 = session_aids_df2.head(1000).reset_index(drop=True)\nsession_aids_df3 = session_aids_df3.head(1000).reset_index(drop=True)\nsession_aids_df3","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.041807Z","iopub.execute_input":"2024-06-09T07:05:35.042193Z","iopub.status.idle":"2024-06-09T07:05:35.122815Z","shell.execute_reply.started":"2024-06-09T07:05:35.042162Z","shell.execute_reply":"2024-06-09T07:05:35.121540Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import defaultdict","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.124356Z","iopub.execute_input":"2024-06-09T07:05:35.124775Z","iopub.status.idle":"2024-06-09T07:05:35.130440Z","shell.execute_reply.started":"2024-06-09T07:05:35.124737Z","shell.execute_reply":"2024-06-09T07:05:35.129129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_Sim1 = defaultdict()\nitem_Sim2 = defaultdict()\nitem_Sim3 = defaultdict()\n","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.132410Z","iopub.execute_input":"2024-06-09T07:05:35.132807Z","iopub.status.idle":"2024-06-09T07:05:35.144789Z","shell.execute_reply.started":"2024-06-09T07:05:35.132777Z","shell.execute_reply":"2024-06-09T07:05:35.143600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def itemCF(session_aids_df,item_Sim):\n    for i,row in tqdm( session_aids_df.iterrows(), total=len(session_aids_df) ):\n\n        aid_list = row['aid']\n\n\n        for item in aid_list:\n\n\n            item_Sim.setdefault(item,dict())  # 通过设置default，使得对于item这一个aid，在该字典中存在一个空字典作为其默认值，不会出现 KeyError的错误，即这行代码使用defaultdict的setdefault方法来确保item_Sim字典中存在当前项目item作为键的条目。如果不存在，它将创建一个空字典作为该键的值。\n\n\n\n            for related_item in aid_list:    # 找到相关联的物品     只要他们出现在同一aid列表里，也就是上文提到的在session_aids_df里面aid列中的某个具体的列表里面，就证明他们是有关联的\n                if item == related_item:\n                    # 不考虑同一aid物品   不需要计算项目与自身的相似度。\n                    continue\n\n                item_Sim[item].setdefault(related_item,0)      # 确保item_Sim字典中item键对应的字典存在related_item作为键的条目。如果不存在，它将创建一个条目并设置值为0。\n\n                item_Sim[item][related_item] += 1      # 这行代码将related_item在item的相似度计数加1。这意味着如果多个用户在同一个会话中同时交互了item和related_item，那么这两个项目的相似度会增加。   \nitemCF(session_aids_df1,item_Sim1)\nitemCF(session_aids_df2,item_Sim2)\nitemCF(session_aids_df3,item_Sim3)","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.146168Z","iopub.execute_input":"2024-06-09T07:05:35.146512Z","iopub.status.idle":"2024-06-09T07:05:35.536196Z","shell.execute_reply.started":"2024-06-09T07:05:35.146483Z","shell.execute_reply":"2024-06-09T07:05:35.535110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from math import sqrt","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.537700Z","iopub.execute_input":"2024-06-09T07:05:35.538219Z","iopub.status.idle":"2024-06-09T07:05:35.543537Z","shell.execute_reply.started":"2024-06-09T07:05:35.538181Z","shell.execute_reply":"2024-06-09T07:05:35.542528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"# item_Sim1是针对click类型不同物品对应的感兴趣物品列表   # 这一个是字典类型的，输出不了，太多了","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.545432Z","iopub.execute_input":"2024-06-09T07:05:35.545802Z","iopub.status.idle":"2024-06-09T07:05:35.559330Z","shell.execute_reply.started":"2024-06-09T07:05:35.545773Z","shell.execute_reply":"2024-06-09T07:05:35.558129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"# item_Sim.items()","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.560716Z","iopub.execute_input":"2024-06-09T07:05:35.561161Z","iopub.status.idle":"2024-06-09T07:05:35.579078Z","shell.execute_reply.started":"2024-06-09T07:05:35.561124Z","shell.execute_reply":"2024-06-09T07:05:35.577859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 计算项目间的相似度\ndef calculate_similarity(item_Sim):\n    similarity_matrix = defaultdict(dict)\n    \n    for item, related_items in tqdm(item_Sim.items(), total=len(item_Sim)):\n        for related_item, count in related_items.items():\n            # 计算与item共同出现的不同项目的总数\n            total_related_items = len(set(related_items))     # total_related_items 是与items相关的aid的总数量\n            # 避免除以零，如果total_related_items为0，则跳过\n            if total_related_items > 0:\n                # 使用Jaccard相似度计算相似度\n                similarity = count / total_related_items\n                similarity_matrix[item][related_item] = similarity\n    \n    return similarity_matrix\n\n# 针对不同类型计算相似度矩阵\nsimilarity_matrix1 = calculate_similarity(item_Sim1)\nsimilarity_matrix2 = calculate_similarity(item_Sim2)\nsimilarity_matrix3 = calculate_similarity(item_Sim3)","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:35.580945Z","iopub.execute_input":"2024-06-09T07:05:35.581289Z","iopub.status.idle":"2024-06-09T07:05:36.038604Z","shell.execute_reply.started":"2024-06-09T07:05:35.581260Z","shell.execute_reply":"2024-06-09T07:05:36.037543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"similarity_matrix2","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:36.040357Z","iopub.execute_input":"2024-06-09T07:05:36.040764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 我们要定义一个用户历史点击记录，即用户对什么感兴趣，我想他是在训练集上定义，即用户在训练集上没点开过，将没点开过的物品添加到\n# 推荐商品列表里，并根据相似性选择前5个，然后到了验证集上，查看这推荐商品是否出现在了28号的数据集上。\n\n# 我感觉也不用定义，aid_list就存放这用户不同会话的点击的aid列表\n# 我感觉我们要做的就是找到每个会话session对应的aid列表，然后遍历相似矩阵，找到没在aid列表的related_item，将对应的\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_recommendations(similarity_matrix, session_aids_df, num_recommendations=20):\n    recommendations = defaultdict(int)\n    all_recommendations = defaultdict(list)    # 存储每个会话的推荐结果\n    for i,row in tqdm( session_aids_df.iterrows(), total=len(session_aids_df) ):  # 我感觉不太需要这个，应当是遍历训练集，将session作为迭代器，遍历每一个session\n    # 针对每一个session，根据相似矩阵选择相关物品中的前20个，作为推荐，然后与真实的28号的验证集作比较，看看我们选中了几个物品\n    # session_aids_df中有 session列 和aid列\n        aid_list = row['aid']\n        user_history = set(aid_list)  # 使用集合避免重复推荐相同的项目\n        for item in user_history:\n            if item in similarity_matrix:\n                for related_item, similarity in similarity_matrix[item].items():\n                    if related_item not in user_history:\n                        recommendations[related_item] += similarity       # 将相似度+=\n             # 根据相似度分数排序推荐项目\n            sorted_recommendations = sorted(recommendations.items(), key=lambda x: x[1], reverse=True)\n            # 获取分数最高的前 num_recommendations 个推荐\n            top_recommendations = [item for item, _ in sorted_recommendations[:num_recommendations]]\n        \n        # 将推荐结果添加到 all_recommendations 中，以会话ID为键\n        all_recommendations[row['session']] = top_recommendations\n    \n    return all_recommendations\n\n# 假设 user_history 是用户过去喜欢过的项目列表\n# user_history = ['item1', 'item2']\n# 生成推荐\nrecommended_items1 = generate_recommendations(similarity_matrix1, session_aids_df1)\nrecommended_items2 = generate_recommendations(similarity_matrix2, session_aids_df2)\nrecommended_items3 = generate_recommendations(similarity_matrix1, session_aids_df3)\n\nprint(\"Recommended items:\", recommended_items1)","metadata":{"execution":{"iopub.status.idle":"2024-06-09T07:05:54.921865Z","shell.execute_reply.started":"2024-06-09T07:05:36.256020Z","shell.execute_reply":"2024-06-09T07:05:54.920835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"获得推荐系统之后我们便可以与验证集作比较了","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"session_items_val = df_val_offline.groupby(['session','type'],as_index=False)['aid'].agg(set)","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:05:54.923329Z","iopub.execute_input":"2024-06-09T07:05:54.923662Z","iopub.status.idle":"2024-06-09T07:06:34.221468Z","shell.execute_reply.started":"2024-06-09T07:05:54.923633Z","shell.execute_reply":"2024-06-09T07:06:34.220416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def getScore(df, type_, suffix):\n    \n    df_tmp = df[df['type']==type_].reset_index(drop=True)     # df_tmp是真实验证集数据\n    print(df_tmp)\n    score_Numerator = 0\n    score_Denominator = 0\n\n    for i,row in tqdm( df_tmp.iterrows(),total=len(df_tmp) ):\n        # 接下来是我们推荐物品的获取\n        if type_ == 1:\n            recom_tmp = recommended_items1[row['session']]\n        elif type_ == 2:\n            recom_tmp = recommended_items2[row['session']]\n        elif type_ == 3:\n            recom_tmp = recommended_items3[row['session']]\n            \n    \n        score_Numerator += len(row['aid'] & set(recom_tmp))\n        score_Denominator += min(20,len(row['aid']))\n        \n    return score_Numerator/score_Denominator","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:06:34.222844Z","iopub.execute_input":"2024-06-09T07:06:34.223196Z","iopub.status.idle":"2024-06-09T07:06:34.232510Z","shell.execute_reply.started":"2024-06-09T07:06:34.223165Z","shell.execute_reply":"2024-06-09T07:06:34.231209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 计算得分：\nscore_click = getScore(session_items_val,1,'_clicks')\nscore_cart = getScore(session_items_val,2,'_carts')\nscore_order = getScore(session_items_val,3,'_orders')\nscore_click * 0.1 + score_cart * 0.3 + score_order * 0.6\nprint(score_click)","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:06:34.234002Z","iopub.execute_input":"2024-06-09T07:06:34.234424Z","iopub.status.idle":"2024-06-09T07:08:32.281661Z","shell.execute_reply.started":"2024-06-09T07:06:34.234387Z","shell.execute_reply":"2024-06-09T07:08:32.280411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"score_click * 0.1 + score_cart * 0.3 + score_order * 0.6\nprint(score_click)","metadata":{"execution":{"iopub.status.busy":"2024-06-09T07:08:32.283489Z","iopub.execute_input":"2024-06-09T07:08:32.283821Z","iopub.status.idle":"2024-06-09T07:08:32.289473Z","shell.execute_reply.started":"2024-06-09T07:08:32.283795Z","shell.execute_reply":"2024-06-09T07:08:32.288113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}