{"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":10445,"databundleVersionId":200747,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-15T08:35:28.068982Z","iopub.execute_input":"2024-05-15T08:35:28.069577Z","iopub.status.idle":"2024-05-15T08:35:28.076972Z","shell.execute_reply.started":"2024-05-15T08:35:28.069547Z","shell.execute_reply":"2024-05-15T08:35:28.076088Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stdout","text":"/kaggle/input/elo-merchant-category-recommendation/sample_submission.csv\n/kaggle/input/elo-merchant-category-recommendation/new_merchant_transactions.csv\n/kaggle/input/elo-merchant-category-recommendation/merchants.csv\n/kaggle/input/elo-merchant-category-recommendation/Data_Dictionary.xlsx\n/kaggle/input/elo-merchant-category-recommendation/Data Dictionary.xlsx\n/kaggle/input/elo-merchant-category-recommendation/historical_transactions.csv\n/kaggle/input/elo-merchant-category-recommendation/train.csv\n/kaggle/input/elo-merchant-category-recommendation/test.csv\n","output_type":"stream"}]},{"cell_type":"code","source":"# Import the necessary libraries\nimport numpy as np\nimport pandas as pd\nimport os\nimport time\nimport warnings\nimport gc\ngc.collect()\nimport os\nfrom six.moves import urllib\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport datetime\nwarnings.filterwarnings('ignore')\n%matplotlib inline\nplt.style.use('seaborn')\nfrom scipy.stats import norm, skew\nfrom sklearn.preprocessing import StandardScaler","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:35:28.079703Z","iopub.execute_input":"2024-05-15T08:35:28.080067Z","iopub.status.idle":"2024-05-15T08:35:28.176526Z","shell.execute_reply.started":"2024-05-15T08:35:28.080024Z","shell.execute_reply":"2024-05-15T08:35:28.175353Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"#Add All the Models Libraries\n\n# Scalers\nfrom sklearn.utils import shuffle\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.pipeline import FeatureUnion\n\n# Models\n\nfrom sklearn.linear_model import Lasso\nfrom sklearn.metrics import mean_squared_log_error,mean_squared_error, r2_score,mean_absolute_error\n\nfrom sklearn.model_selection import train_test_split #training and testing data split\nfrom sklearn import metrics #accuracy measure\nfrom sklearn.metrics import confusion_matrix #for confusion matrix\nfrom scipy.stats import reciprocal, uniform\n\nfrom sklearn.model_selection import StratifiedKFold, RepeatedKFold\n\n# Cross-validation\nfrom sklearn.model_selection import KFold #for K-fold cross validation\nfrom sklearn.model_selection import cross_val_score #score evaluation\nfrom sklearn.model_selection import cross_val_predict #prediction\nfrom sklearn.model_selection import cross_validate\n\n# GridSearchCV\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.model_selection import RandomizedSearchCV\n\n#Common data processors\nfrom sklearn.preprocessing import OneHotEncoder, LabelEncoder\nfrom sklearn import feature_selection\nfrom sklearn import model_selection\nfrom sklearn import metrics\nfrom sklearn.base import BaseEstimator, TransformerMixin\nfrom sklearn.utils import check_array\nfrom scipy import sparse","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:35:45.783784Z","iopub.execute_input":"2024-05-15T08:35:45.784218Z","iopub.status.idle":"2024-05-15T08:35:46.067467Z","shell.execute_reply.started":"2024-05-15T08:35:45.784186Z","shell.execute_reply":"2024-05-15T08:35:46.066025Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"# to make this notebook's output stable across runs\nnp.random.seed(123)\ngc.collect()\n# To plot pretty figures\n%matplotlib inline\nplt.rcParams['axes.labelsize'] = 14\nplt.rcParams['xtick.labelsize'] = 12\nplt.rcParams['ytick.labelsize'] = 12","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:35:53.644083Z","iopub.execute_input":"2024-05-15T08:35:53.644499Z","iopub.status.idle":"2024-05-15T08:35:53.74052Z","shell.execute_reply.started":"2024-05-15T08:35:53.644448Z","shell.execute_reply":"2024-05-15T08:35:53.739232Z"},"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"#Reduce the memory usage - Inspired by Panchajanya Banerjee\ndef reduce_mem_usage(df, verbose=True):\n    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n    start_mem = df.memory_usage().sum() / 1024**2    \n    for col in df.columns:\n        col_type = df[col].dtypes\n        if col_type in numerics:\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if str(col_type)[:3] == 'int':\n                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                    df[col] = df[col].astype(np.int64)  \n            else:\n                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n                else:\n                    df[col] = df[col].astype(np.float64)    \n    end_mem = df.memory_usage().sum() / 1024**2\n    if verbose: print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:36:40.532719Z","iopub.execute_input":"2024-05-15T08:36:40.533196Z","iopub.status.idle":"2024-05-15T08:36:40.548685Z","shell.execute_reply.started":"2024-05-15T08:36:40.533164Z","shell.execute_reply":"2024-05-15T08:36:40.547322Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"def one_hot_encoder(df, nan_as_category = True):\n    original_columns = list(df.columns)\n    categorical_columns = [col for col in df.columns if df[col].dtype == 'object']\n    df = pd.get_dummies(df, columns= categorical_columns, dummy_na= nan_as_category)\n    new_columns = [c for c in df.columns if c not in original_columns]\n    return df, new_columns","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:37:40.534693Z","iopub.execute_input":"2024-05-15T08:37:40.535168Z","iopub.status.idle":"2024-05-15T08:37:40.543471Z","shell.execute_reply.started":"2024-05-15T08:37:40.535128Z","shell.execute_reply":"2024-05-15T08:37:40.542008Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"train = reduce_mem_usage(pd.read_csv('/kaggle/input/elo-merchant-category-recommendation/train.csv',parse_dates=[\"first_active_month\"]))\ntest = reduce_mem_usage(pd.read_csv('/kaggle/input/elo-merchant-category-recommendation/train.csv', parse_dates=[\"first_active_month\"]))","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:37:46.778866Z","iopub.execute_input":"2024-05-15T08:37:46.779255Z","iopub.status.idle":"2024-05-15T08:37:47.636368Z","shell.execute_reply.started":"2024-05-15T08:37:46.779213Z","shell.execute_reply":"2024-05-15T08:37:47.6351Z"},"trusted":true},"execution_count":8,"outputs":[{"name":"stdout","text":"Mem. usage decreased to  4.04 Mb (56.2% reduction)\nMem. usage decreased to  4.04 Mb (56.2% reduction)\n","output_type":"stream"}]},{"cell_type":"code","source":"# Remove the Outliers \ntrain['outliers'] = 0\ntrain.loc[train['target'] < -30, 'outliers'] = 1\ntrain['outliers'].value_counts()\n\nfor features in ['feature_1','feature_2','feature_3']:\n    order_label = train.groupby([features])['outliers'].mean()\n    train[features] = train[features].map(order_label)\n    test[features] =  test[features].map(order_label)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:37:58.751432Z","iopub.execute_input":"2024-05-15T08:37:58.751922Z","iopub.status.idle":"2024-05-15T08:37:58.803215Z","shell.execute_reply.started":"2024-05-15T08:37:58.751888Z","shell.execute_reply":"2024-05-15T08:37:58.801956Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"# Feature Engineering\ntrain[\"month\"] = train[\"first_active_month\"].dt.month\ntrain[\"year\"] = train[\"first_active_month\"].dt.year\ntrain['week'] = train[\"first_active_month\"].dt.year\ntrain['dayofweek'] = train['first_active_month'].dt.dayofweek\ntrain['days'] = (pd.Timestamp(2018,2, 1) - train['first_active_month']).dt.days\n\ntrain['days_feature1_ratio'] = train['feature_1'] / train['days']\ntrain['days_feature2_ratio'] = train['feature_2'] / train['days']\ntrain['days_feature3_ratio'] = train['feature_3'] / train['days']\n\ntrain['feature_sum'] = train['feature_1'] + train['feature_2'] + train['feature_3']\ntrain['feature_mean'] = train['feature_sum']/3\ntrain['feature_max'] = train[['feature_1', 'feature_2', 'feature_3']].max(axis=1)\ntrain['feature_min'] = train[['feature_1', 'feature_2', 'feature_3']].min(axis=1)\ntrain['feature_var'] = train[['feature_1', 'feature_2', 'feature_3']].std(axis=1)\n\ntest[\"month\"] = test[\"first_active_month\"].dt.month\ntest[\"year\"] = test[\"first_active_month\"].dt.year\ntest['week'] = test[\"first_active_month\"].dt.year\ntest['dayofweek'] = test['first_active_month'].dt.dayofweek\ntest['days'] = (pd.Timestamp(2018,2, 1) - test['first_active_month']).dt.days\n\ntest['days_feature1_ratio'] = test['feature_1'] / train['days']\ntest['days_feature2_ratio'] = test['feature_2'] / train['days']\ntest['days_feature3_ratio'] = test['feature_3'] / train['days']\n\ntest['feature_sum'] = test['feature_1'] + test['feature_2'] + test['feature_3']\ntest['feature_mean'] = test['feature_sum']/3\ntest['feature_max'] = test[['feature_1', 'feature_2', 'feature_3']].max(axis=1)\ntest['feature_min'] = test[['feature_1', 'feature_2', 'feature_3']].min(axis=1)\ntest['feature_var'] = test[['feature_1', 'feature_2', 'feature_3']].std(axis=1)\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:38:09.498716Z","iopub.execute_input":"2024-05-15T08:38:09.499348Z","iopub.status.idle":"2024-05-15T08:38:10.174926Z","shell.execute_reply.started":"2024-05-15T08:38:09.499303Z","shell.execute_reply":"2024-05-15T08:38:10.173864Z"},"trusted":true},"execution_count":10,"outputs":[{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"46"},"metadata":{}}]},{"cell_type":"code","source":"def aggregate_transaction_historical(trans, prefix):  \n    trans = pd.get_dummies(trans, columns=['category_2', 'category_3'])\n    agg_func = {\n        'authorized_flag': ['sum', 'mean'],\n        'category_1': ['sum', 'mean'],\n        'category_2_1.0': ['mean', 'sum'],\n        'category_2_2.0': ['mean', 'sum'],\n        'category_2_3.0': ['mean', 'sum'],\n        'category_2_4.0': ['mean', 'sum'],\n        'category_2_5.0': ['mean', 'sum'],\n        'category_3_1': ['sum', 'mean'],\n        'category_3_2': ['sum', 'mean'],\n        'category_3_3': ['sum', 'mean'],        \n        'city_id': ['nunique'],\n        'installments': ['sum', 'max', 'min', 'std'],\n        'merchant_category_id': ['nunique'],\n        'merchant_id': ['nunique'],\n        'month_lag': ['min', 'max'],\n        'purchase_amount': ['sum', 'max', 'min', 'std'],\n        'state_id': ['nunique'],\n        'subsector_id': ['nunique'],\n        }\n    #对购买金额进行聚合统计，包括总和、最大值、最小值、均值\n    # 对分期付款数量进行聚合统计，包括总和、最大值、均值,这些特征可以用来描述用户的分期付款行为\n    #card_id: 对卡号进行聚合统计，包括交易数量和交易次数。这些特征可以用来描述用户的交易活跃度。\n    #统计用户的购买金额的总和和均值情况\n    \n    agg_trans = trans.groupby(['card_id']).agg(agg_func)\n    agg_trans.columns = [prefix + '_'.join(col).strip() \n                           for col in agg_trans.columns.values]\n    agg_trans.reset_index(inplace=True)\n    \n    df = (trans.groupby('card_id')\n          .size()\n          .reset_index(name='{}transactions_count'.format(prefix)))\n    \n    agg_trans = pd.merge(df, agg_trans, on='card_id', how='left')\n    \n    return agg_trans","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:40:03.152569Z","iopub.execute_input":"2024-05-15T08:40:03.152969Z","iopub.status.idle":"2024-05-15T08:40:03.164365Z","shell.execute_reply.started":"2024-05-15T08:40:03.152939Z","shell.execute_reply":"2024-05-15T08:40:03.16334Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"transactions = reduce_mem_usage(pd.read_csv('/kaggle/input/elo-merchant-category-recommendation/historical_transactions.csv'))\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:47:22.230379Z","iopub.execute_input":"2024-05-15T08:47:22.230873Z","iopub.status.idle":"2024-05-15T08:49:14.654482Z","shell.execute_reply.started":"2024-05-15T08:47:22.230824Z","shell.execute_reply":"2024-05-15T08:49:14.652977Z"},"trusted":true},"execution_count":17,"outputs":[{"name":"stdout","text":"Mem. usage decreased to 1749.11 Mb (43.7% reduction)\n","output_type":"stream"},{"execution_count":17,"output_type":"execute_result","data":{"text/plain":"2388"},"metadata":{}}]},{"cell_type":"code","source":"map_dict = {'Y': 0, 'N': 1}\ntransactions['category_1'] = transactions['category_1'].apply(lambda x: map_dict[x])\ntransactions.groupby(['category_1']).agg({'purchase_amount': ['mean', 'std', 'count'], 'authorized_flag': ['mean', 'std']})","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:49:31.402995Z","iopub.execute_input":"2024-05-15T08:49:31.403485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions.groupby(['category_2']).agg({'purchase_amount': ['mean', 'std', 'count'], 'authorized_flag': ['mean', 'std']})","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"map_dict = {'A': 0, 'B': 1, 'C': 2, 'nan': 3}\ntransactions['category_3'] = transactions['category_3'].apply(lambda x: map_dict[str(x)])\ntransactions.groupby(['category_3']).agg({'purchase_amount': ['mean', 'std', 'count'], 'authorized_flag': ['mean', 'std']})","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions['category_2'] = transactions['category_2'].fillna(1.0,inplace=True)\ntransactions['category_3'] = transactions['category_3'].fillna('A',inplace=True)\ntransactions['merchant_id'] = transactions['merchant_id'].fillna('M_ID_00a6ca8a8a',inplace=True)\ntransactions['installments'].replace(-1, np.nan,inplace=True)\ntransactions['installments'].replace(999, np.nan,inplace=True)\ntransactions['purchase_amount'] = transactions['purchase_amount'].apply(lambda x: min(x, 0.8))\n\n#Feature Engineering\ntransactions['authorized_flag'] = transactions['authorized_flag'].map({'Y': 1, 'N': 0})\ntransactions['category_1'] = transactions['category_1'].map({'Y': 1, 'N': 0})\ntransactions['category_3'] = transactions['category_3'].map({'A':0, 'B':1, 'C':2})\n\ntransactions['purchase_date'] = pd.to_datetime(transactions['purchase_date'])\ntransactions['year'] = transactions['purchase_date'].dt.year\ntransactions['weekofyear'] = transactions['purchase_date'].dt.isocalendar().week\ntransactions['month'] = transactions['purchase_date'].dt.month\ntransactions['hour'] = transactions['purchase_date'].dt.hour \ntransactions['month_diff'] = ((datetime.datetime.today() - transactions['purchase_date']).dt.days)//30\ntransactions['month_diff'] += transactions['month_lag']\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:43:48.549031Z","iopub.execute_input":"2024-05-15T08:43:48.550878Z","iopub.status.idle":"2024-05-15T08:44:49.592435Z","shell.execute_reply.started":"2024-05-15T08:43:48.550806Z","shell.execute_reply":"2024-05-15T08:44:49.591042Z"},"trusted":true},"execution_count":14,"outputs":[{"execution_count":14,"output_type":"execute_result","data":{"text/plain":"40"},"metadata":{}}]},{"cell_type":"code","source":"agg_func = {\n        'mean': ['mean'],\n    }\nfor col in ['category_2','category_3']:\n    transactions[col+'_sum'] = transactions['purchase_amount'].groupby(transactions[col]).agg('sum')\n    transactions[col+'_mean'] = transactions['purchase_amount'].groupby(transactions[col]).agg('mean')\n    transactions[col+'_max'] = transactions['purchase_amount'].groupby(transactions[col]).agg('max')\n    transactions[col+'_min'] = transactions['purchase_amount'].groupby(transactions[col]).agg('min')\n    agg_func[col+'_mean'] = ['mean']\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:44:52.263118Z","iopub.execute_input":"2024-05-15T08:44:52.263508Z","iopub.status.idle":"2024-05-15T08:45:16.902771Z","shell.execute_reply.started":"2024-05-15T08:44:52.263479Z","shell.execute_reply":"2024-05-15T08:45:16.901537Z"},"trusted":true},"execution_count":15,"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":"0"},"metadata":{}}]},{"cell_type":"code","source":"merge_trans = aggregate_transaction_historical(transactions, prefix='hist_')\ndel transactions\ngc.collect()\ntrain = pd.merge(train, merge_trans, on='card_id',how='left')\ntest = pd.merge(test, merge_trans, on='card_id',how='left')\ndel merge_trans\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T08:45:31.040058Z","iopub.execute_input":"2024-05-15T08:45:31.040458Z","iopub.status.idle":"2024-05-15T08:45:56.630994Z","shell.execute_reply.started":"2024-05-15T08:45:31.040429Z","shell.execute_reply":"2024-05-15T08:45:56.629205Z"},"trusted":true},"execution_count":16,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)","Cell \u001b[0;32mIn[16], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m merge_trans \u001b[38;5;241m=\u001b[39m \u001b[43maggregate_transaction_historical\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtransactions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprefix\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mhist_\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m      2\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m transactions\n\u001b[1;32m      3\u001b[0m gc\u001b[38;5;241m.\u001b[39mcollect()\n","Cell \u001b[0;32mIn[12], line 29\u001b[0m, in \u001b[0;36maggregate_transaction_historical\u001b[0;34m(trans, prefix)\u001b[0m\n\u001b[1;32m      3\u001b[0m agg_func \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m      4\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mauthorized_flag\u001b[39m\u001b[38;5;124m'\u001b[39m: [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msum\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmean\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m      5\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcategory_1\u001b[39m\u001b[38;5;124m'\u001b[39m: [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msum\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmean\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m     22\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msubsector_id\u001b[39m\u001b[38;5;124m'\u001b[39m: [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnunique\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m     23\u001b[0m     }\n\u001b[1;32m     24\u001b[0m \u001b[38;5;66;03m#对购买金额进行聚合统计，包括总和、最大值、最小值、均值\u001b[39;00m\n\u001b[1;32m     25\u001b[0m \u001b[38;5;66;03m# 对分期付款数量进行聚合统计，包括总和、最大值、均值,这些特征可以用来描述用户的分期付款行为\u001b[39;00m\n\u001b[1;32m     26\u001b[0m \u001b[38;5;66;03m#card_id: 对卡号进行聚合统计，包括交易数量和交易次数。这些特征可以用来描述用户的交易活跃度。\u001b[39;00m\n\u001b[1;32m     27\u001b[0m \u001b[38;5;66;03m#统计用户的购买金额的总和和均值情况\u001b[39;00m\n\u001b[0;32m---> 29\u001b[0m agg_trans \u001b[38;5;241m=\u001b[39m \u001b[43mtrans\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroupby\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mcard_id\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43magg\u001b[49m\u001b[43m(\u001b[49m\u001b[43magg_func\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     30\u001b[0m agg_trans\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m=\u001b[39m [prefix \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(col)\u001b[38;5;241m.\u001b[39mstrip() \n\u001b[1;32m     31\u001b[0m                        \u001b[38;5;28;01mfor\u001b[39;00m col \u001b[38;5;129;01min\u001b[39;00m agg_trans\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mvalues]\n\u001b[1;32m     32\u001b[0m agg_trans\u001b[38;5;241m.\u001b[39mreset_index(inplace\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/groupby/generic.py:1432\u001b[0m, in \u001b[0;36mDataFrameGroupBy.aggregate\u001b[0;34m(self, func, engine, engine_kwargs, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1429\u001b[0m     kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mengine_kwargs\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m engine_kwargs\n\u001b[1;32m   1431\u001b[0m op \u001b[38;5;241m=\u001b[39m GroupByApply(\u001b[38;5;28mself\u001b[39m, func, args\u001b[38;5;241m=\u001b[39margs, kwargs\u001b[38;5;241m=\u001b[39mkwargs)\n\u001b[0;32m-> 1432\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43magg\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1433\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_dict_like(func) \u001b[38;5;129;01mand\u001b[39;00m result \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m   1434\u001b[0m     \u001b[38;5;66;03m# GH #52849\u001b[39;00m\n\u001b[1;32m   1435\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mas_index \u001b[38;5;129;01mand\u001b[39;00m is_list_like(func):\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/apply.py:190\u001b[0m, in \u001b[0;36mApply.agg\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    187\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_str()\n\u001b[1;32m    189\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_dict_like(func):\n\u001b[0;32m--> 190\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43magg_dict_like\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    191\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m is_list_like(func):\n\u001b[1;32m    192\u001b[0m     \u001b[38;5;66;03m# we require a list, but not a 'str'\u001b[39;00m\n\u001b[1;32m    193\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39magg_list_like()\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/apply.py:423\u001b[0m, in \u001b[0;36mApply.agg_dict_like\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    415\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21magg_dict_like\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m DataFrame \u001b[38;5;241m|\u001b[39m Series:\n\u001b[1;32m    416\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    417\u001b[0m \u001b[38;5;124;03m    Compute aggregation in the case of a dict-like argument.\u001b[39;00m\n\u001b[1;32m    418\u001b[0m \n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    421\u001b[0m \u001b[38;5;124;03m    Result of aggregation.\u001b[39;00m\n\u001b[1;32m    422\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 423\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43magg_or_apply_dict_like\u001b[49m\u001b[43m(\u001b[49m\u001b[43mop_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43magg\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/apply.py:1608\u001b[0m, in \u001b[0;36mGroupByApply.agg_or_apply_dict_like\u001b[0;34m(self, op_name)\u001b[0m\n\u001b[1;32m   1603\u001b[0m     kwargs\u001b[38;5;241m.\u001b[39mupdate({\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mengine\u001b[39m\u001b[38;5;124m\"\u001b[39m: engine, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mengine_kwargs\u001b[39m\u001b[38;5;124m\"\u001b[39m: engine_kwargs})\n\u001b[1;32m   1605\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m com\u001b[38;5;241m.\u001b[39mtemp_setattr(\n\u001b[1;32m   1606\u001b[0m     obj, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas_index\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mTrue\u001b[39;00m, condition\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mhasattr\u001b[39m(obj, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas_index\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m   1607\u001b[0m ):\n\u001b[0;32m-> 1608\u001b[0m     result_index, result_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute_dict_like\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   1609\u001b[0m \u001b[43m        \u001b[49m\u001b[43mop_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mselected_obj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mselection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m   1610\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1611\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrap_results_dict_like(selected_obj, result_index, result_data)\n\u001b[1;32m   1612\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/apply.py:462\u001b[0m, in \u001b[0;36mApply.compute_dict_like\u001b[0;34m(self, op_name, selected_obj, selection, kwargs)\u001b[0m\n\u001b[1;32m    460\u001b[0m is_groupby \u001b[38;5;241m=\u001b[39m \u001b[38;5;28misinstance\u001b[39m(obj, (DataFrameGroupBy, SeriesGroupBy))\n\u001b[1;32m    461\u001b[0m func \u001b[38;5;241m=\u001b[39m cast(AggFuncTypeDict, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc)\n\u001b[0;32m--> 462\u001b[0m func \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnormalize_dictlike_arg\u001b[49m\u001b[43m(\u001b[49m\u001b[43mop_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mselected_obj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    464\u001b[0m is_non_unique_col \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m    465\u001b[0m     selected_obj\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m2\u001b[39m\n\u001b[1;32m    466\u001b[0m     \u001b[38;5;129;01mand\u001b[39;00m selected_obj\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mnunique() \u001b[38;5;241m<\u001b[39m \u001b[38;5;28mlen\u001b[39m(selected_obj\u001b[38;5;241m.\u001b[39mcolumns)\n\u001b[1;32m    467\u001b[0m )\n\u001b[1;32m    469\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m selected_obj\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m    470\u001b[0m     \u001b[38;5;66;03m# key only used for output\u001b[39;00m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/pandas/core/apply.py:663\u001b[0m, in \u001b[0;36mApply.normalize_dictlike_arg\u001b[0;34m(self, how, obj, func)\u001b[0m\n\u001b[1;32m    661\u001b[0m     cols \u001b[38;5;241m=\u001b[39m Index(\u001b[38;5;28mlist\u001b[39m(func\u001b[38;5;241m.\u001b[39mkeys()))\u001b[38;5;241m.\u001b[39mdifference(obj\u001b[38;5;241m.\u001b[39mcolumns, sort\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m    662\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(cols) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m--> 663\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mColumn(s) \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(cols)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m do not exist\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m    665\u001b[0m aggregator_types \u001b[38;5;241m=\u001b[39m (\u001b[38;5;28mlist\u001b[39m, \u001b[38;5;28mtuple\u001b[39m, \u001b[38;5;28mdict\u001b[39m)\n\u001b[1;32m    667\u001b[0m \u001b[38;5;66;03m# if we have a dict of any non-scalars\u001b[39;00m\n\u001b[1;32m    668\u001b[0m \u001b[38;5;66;03m# eg. {'A' : ['mean']}, normalize all to\u001b[39;00m\n\u001b[1;32m    669\u001b[0m \u001b[38;5;66;03m# be list-likes\u001b[39;00m\n\u001b[1;32m    670\u001b[0m \u001b[38;5;66;03m# Cannot use func.values() because arg may be a Series\u001b[39;00m\n","\u001b[0;31mKeyError\u001b[0m: \"Column(s) ['category_2', 'category_2x1', 'category_2x2', 'category_2x3', 'category_2x4', 'category_2x5', 'category_3A', 'category_3B', 'category_3C'] do not exist\""],"ename":"KeyError","evalue":"\"Column(s) ['category_2', 'category_2x1', 'category_2x2', 'category_2x3', 'category_2x4', 'category_2x5', 'category_3A', 'category_3B', 'category_3C'] do not exist\"","output_type":"error"}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}