33/learn

/learn/5.24/learn_5.24_2.py
# learn/5.22/learn_5.22.py
import time

import pandas as pd
from tqdm import tqdm
from config import *
from utils import *
from process import *
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

train = pd.read_csv(f'{data_dir}/train.csv', dtype={'is_trade': int, 'user_id': str, 'context_page_id': str, 'item_id': str})
test = pd.read_csv(f'{data_dir}/test.csv', dtype={'is_trade': int, 'user_id': str, 'context_page_id': str, 'item_id': str})
train['timestamp'] = pd.to_datetime(train['timestamp'])
test['timestamp'] = pd.to_datetime(test['timestamp'])
train['hour'] = train['timestamp'].dt.hour
test['hour'] = test['timestamp'].dt.hour

train = train[train['is_trade'] != -1]
train['is_trade'] = train['is_trade'].astype(float)
test['is_trade'] = test['is_trade'].astype(float)

train['time_diff'] = (train['timestamp'] - train['timestamp'].min()).dt.total_seconds().div(60).div(60)
test['time_diff'] = (test['timestamp'] - test['timestamp'].min()).dt.total_seconds().div(60).div(60)

# 2.1 基础特征
# 用户ID特征
train['user_id'] = train['user_id'].astype(str)
test['user_id'] = test['user_id'].astype(str)
train['user_id'].replace('unknown', np.nan, inplace=True)
test['user_id'].replace('unknown', np.nan, inplace=True)

# 基础特征
user_avg = train.groupby(['user_id'], as_index=False)['is_trade'].mean()
user_avg.columns = ['user_id', 'user_avg']
user_avg['user_id'] = user_avg['user_id'].astype(str)
train = pd.merge(train, user_avg, on='user_id', how='left')
test = pd.merge(test, user_avg, on='user_id', how='left')
train['user_avg'].fillna(-1, inplace=True)
test['user_avg'].fillna(-1, inplace=True)

# 2.2 时间特征
# 2.2.1 时间窗口特征
time_window = train.groupby(['hour'], as_index=False)['is_trade'].mean()
time_window.columns = ['hour', 'time_window']
train = pd.merge(train, time_window, on='hour', how='left')
test = pd.merge(test, time_window, on='hour', how='left')

# 2.2.2 时间距离特征
# 2.2.2.1 之前购买特征
train['time_diff'] = train['time_diff'].fillna(0).astype(float)
train['time_diff'] = train['time_diff'].astype(float)
train['pre_buy_num'] = train['time_diff'].div(1800).div(60).astype(int)
train['pre_buy_num'] = train['pre_buy_num'].astype(float)
train['pre_buy_num'] = train['pre_buy_num'].fillna(0)
train['pre_buy_num'] = train['pre_buy_num'].astype(int)

# 2.2.2.2 当前购买特征
train['current_buy_num'] = train['time_diff'].div(200).div(60).astype(int)
train['current_buy_num'] = train['current_buy_num'].astype(float)
train['current_buy_num'] = train['current_buy_num'].fillna(0)
train['current_buy_num'] = train['current_buy_num'].astype(int)

# 2.2.2.3 当前购买特征
train['time_diff'].fillna(0, inplace=True)
train['time_diff'] = train['time_diff'].astype(float)
train['current_buy_num'] = train['time_diff'].div(200).div(60).astype(int)
train['current_buy_num'] = train['current_buy_num'].astype(float)
train['current_buy_num'] = train['current_buy_num'].fillna(0)
train['current_buy_num'] = train['current_buy_num'].astype(int)

train['current_buy_num'].fillna(0, inplace=True)
train['current_buy_num'] = train['current_buy_num'].astype(float)
train['current_buy_num'] = train['current_buy_num'].fillna(0)
train['current_buy_num'] = train['current_buy_num'].astype(int)
train['current_buy_num'].replace(-1, 0, inplace=True)
train['current_buy_num'].replace(0, 0, inplace=True)

train['current_buy_num'].replace(-1, 0, inplace=True)
train['current_buy_num'].replace(0, 0, inplace=True)

# 2.3 用户-商品特征
# 2.3.1 用户ID特征
train['user_id'] = train['user_id'].astype(str)
test['user_id'] = test['user_id'].astype(str)
train['user_id'].replace('unknown', np.nan, inplace=True)
test['user_id'].replace('unknown', np.nan, inplace=True)
train['user_id'] = train['user_id'].astype(str)

# 2.3.2 商品ID特征
train['item_id'] = train['item_id'].astype(str)
test['item_id'] = test['item_id'].astype(str)
train['item_id'].replace('unknown', np.nan, inplace=True)
test['item_id'].replace('unknown', np.nan, inplace=True