{"cells":[{"metadata":{"collapsed":true,"trusted":false,"_uuid":"c03d18d6300441593a525597c16b87e2cfa94b17"},"cell_type":"code","source":"%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"cec48d08d7547cc1c905f359f90c91342532bfdb"},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom multiprocessing import Pool\nimport datetime\nfrom sklearn.preprocessing import OneHotEncoder,StandardScaler\nimport warnings\nfrom xgboost import XGBRegressor\nfrom joblib import Parallel,delayed\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"8de065a901ab2f29b2dc76ac75db777c361e495b"},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv')\ntest = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"67a625c7bf84b83c3321e997184652393dca3e11"},"cell_type":"code","source":"train['first_active_month'] = pd.to_datetime(train['first_active_month'] )\ntrain['year'] = pd.to_datetime(train['first_active_month']).dt.year\ntrain['month'] = pd.to_datetime(train['first_active_month']).dt.month","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"fe174a6e7796e9db302ad742c08ecb0763fb2154"},"cell_type":"code","source":"test['first_active_month'] = pd.to_datetime(test['first_active_month'])\ntest['year'] = pd.to_datetime(test['first_active_month']).dt.year\ntest['month'] = pd.to_datetime(test['first_active_month']).dt.month","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"77e9f2c0df5708083356681441e4ff07a2fcea8c"},"cell_type":"code","source":"ht = pd.read_csv('../input/historical_transactions.csv')\nnmt = pd.read_csv('../input/new_merchant_transactions.csv')\nmerchants = pd.read_csv('../input/merchants.csv')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"4ce5311ec388b6d0be7a3968eec691b9f0852467"},"cell_type":"code","source":"ht['purchase_date'] = pd.to_datetime(ht['purchase_date'])\nnmt['purchase_date'] = pd.to_datetime(nmt['purchase_date'])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"73b8cefce0b4b6790591fd0a86a0a6a37107fd13"},"cell_type":"code","source":"ht['category_2'] = ht['category_2'].fillna(0)\nht['category_3'] = ht['category_3'].fillna('E')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"ea6a79b49528b21a20e07023c8c35e6e75fc2e94"},"cell_type":"code","source":"train['active_till_now'] = train['first_active_month'].map(lambda x:(datetime.datetime.today() - x).days)\ntest['active_till_now'] = test['first_active_month'].map(lambda x:(datetime.datetime.today() - x).days)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"4f7bac9c6f0c9eba8d0e90fa78829152bf2d1cef"},"cell_type":"code","source":"train['target'].hist(bins=20)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"31481b0cd9c0567951a33ec0672479de77580ecb"},"cell_type":"code","source":"card_id_cnt = ht.groupby('card_id')['city_id'].count().reset_index()\ncard_id_cnt.columns = ['card_id','purchase_cnt']","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"d92e5a5e948ad4649f03fc685a78c899e67a460a"},"cell_type":"code","source":"train = pd.merge(train,card_id_cnt,on='card_id',how='left')\ntest = pd.merge(test,card_id_cnt,on='card_id',how='left')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"e0ad7c93c02e9a7d4dc6ee619143c3d099179e00"},"cell_type":"code","source":"amount = ht.groupby('card_id').agg({'purchase_amount':['mean','std','max']})\namount.columns = ['amount_mean','amount_std','amount_max']\namount = amount.reset_index()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"e614f47dd6a576db82f8c7be31efd4f76c807fd2"},"cell_type":"code","source":"month_lag = ht.groupby('card_id').agg({'month_lag':['max','min','std','mean']})\nmonth_lag.columns = ['lag_max','lag_min','lag_std','lag_mean']\nmonth_lag = month_lag.reset_index()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"ddde85bc060a5db0e1a1b46f2333d7f9ba9850dd"},"cell_type":"code","source":"def get_stat_feature(df):\n    city_cnt = df['city_id'].nunique()\n    mer_cnt = df['merchant_id'].nunique()\n    state_cnt = df['state_id'].nunique()\n    installments = len(df['installments']>0)\n    avg_installments = df['installments'].mean()\n    max_installments = df['installments'].max()\n    newly_date = df['purchase_date'].max()\n    last_buy = (datetime.datetime.today() - newly_date).days\n    return [df['card_id'].values[0],city_cnt,mer_cnt,state_cnt,installments,avg_installments,max_installments,last_buy]\ndef applyParallel(dfGrouped, func):\n    retLst = Parallel(n_jobs=2)(delayed(func)(group) for name, group in dfGrouped)\n    return retLst\nht_feature = ht.groupby('card_id')\nht_res = applyParallel(ht_feature,get_stat_feature)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"562c3606ba9d21f35baa8cae7df0bdd2bd3d1443"},"cell_type":"code","source":"stat_df = pd.DataFrame(ht_res,columns=['card_id','city_cnt','mer_cnt','state_cnt','installments','avg_installments',\n                                       'max_installments','last_buy'])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"cf7ed83ef772d07700b7fded2dc6ebb6fc8866c3"},"cell_type":"code","source":"train = pd.merge(train,amount,on='card_id',how='left')\ntest = pd.merge(test,amount,on='card_id',how='left')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"f5259902bac86b43a7f1e0f3ae88dca4f87bed70"},"cell_type":"code","source":"train = pd.merge(train,month_lag,on='card_id',how='left')\ntest = pd.merge(test,month_lag,on='card_id',how='left')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"ead54b4262d6e88e27b2b43686bf4c3fd5dfe541"},"cell_type":"code","source":"train = pd.merge(train,stat_df,on='card_id',how='left')\ntest = pd.merge(test,stat_df,on='card_id',how='left')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"26cf3b566b50638588d68341f109259cf50dc9b0"},"cell_type":"code","source":"cat_feature = ['feature_1','feature_2','feature_3']\nnum_feature = ['active_till_now','purchase_cnt','amount_mean','amount_std','amount_max','lag_max','lag_min','lag_std','lag_mean',\n              'city_cnt','mer_cnt','state_cnt','installments','avg_installments','max_installments','last_buy']","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"4841fc950bcfdd328d9cc037de9c7a7a3ffa8df2"},"cell_type":"code","source":"for cat in cat_feature:\n    train[cat] = train[cat].map(lambda x:str(x))\n    test[cat] = test[cat].map(lambda x:str(x))","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"d46c7ea41f186fc38619b5d72bafe37a5d49d426"},"cell_type":"code","source":"train_cat_feature = pd.get_dummies(train[cat_feature])\ntest_cat_feature = pd.get_dummies(test[cat_feature])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"21d3430f9ee16a5d5ade5f1c84faa3801c998127"},"cell_type":"code","source":"ss = StandardScaler()\ntrain_num_feature = ss.fit_transform(train[num_feature])\ntest_num_feature = ss.transform(test[num_feature])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"e1d480f65b666bca5bf23128c8a76d337c1dc532"},"cell_type":"code","source":"train_feature = np.hstack([train_num_feature,train_cat_feature.values])\ntest_feature = np.hstack([test_num_feature,test_cat_feature.values])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"4df6a63eeb399a513de2dada90dc66613d7d1e68"},"cell_type":"code","source":"from lightgbm import LGBMRegressor\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.linear_model import LinearRegression","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"7ab9468586e318fc63c5b37f5b5c6da3e70cf3f9"},"cell_type":"code","source":"res = []\nfeature_imp = []\nfor tr,va in KFold(n_splits=10,random_state=2018).split(train_feature,train['target'].values):\n    lgbmr = LGBMRegressor(num_leaves=16,n_estimators=50)\n    lgbmr.fit(train_feature[tr],train['target'].values[tr],\n              eval_set=(train_feature[va],train['target'].values[va]),\n              eval_metric='rmse',\n              verbose=50)\n    feature_imp.append(lgbmr.feature_importances_)\n    res.append(lgbmr.predict(test_feature))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"876d6bf390a92d8c68e943f0457b626421d0a959"},"cell_type":"code","source":"f = np.mean(feature_imp,axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"40f2db6a12daed99b0e3f71bea583cdac4a5d3ba"},"cell_type":"code","source":"list(zip(cat_feature+num_feature,f))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"85a14d855036b44ad0880c9e77ce49d8f65aa6fe"},"cell_type":"code","source":"res_lr = []\nfeature_imp = []\nfor tr,va in KFold(n_splits=10,random_state=2018).split(train_feature,train['target'].values):\n    lr = LinearRegression(n_jobs=-1)\n    lr.fit(train_feature[tr],train['target'].values[tr])\n    print(np.sqrt(mean_squared_error(train['target'].values[va],lr.predict(train_feature[va]))))","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"bcc34855b0f7ad46c0852134696e07951b768c9f"},"cell_type":"code","source":"avg_res = np.mean(res,axis=0)\ntest['target'] = avg_res\ntest[['card_id','target']].to_csv('predict.csv',index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.2"}},"nbformat":4,"nbformat_minor":1}