{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"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 in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\npd.options.display.max_columns = 999\n# Input data files are available in the \"../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# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"trainData=pd.read_csv(\"/kaggle/input/elo-merchant-category-recommendation/train.csv\")\nnewTrans=pd.read_csv(\"/kaggle/input/elo-merchant-category-recommendation/new_merchant_transactions.csv\")\npastTrans=pd.read_csv(\"/kaggle/input/elo-merchant-category-recommendation/historical_transactions.csv\")\nmerchants=pd.read_csv(\"/kaggle/input/elo-merchant-category-recommendation/merchants.csv\")\nnewTrans=newTrans.drop(columns=['merchant_category_id','purchase_date'])\npastTrans=pastTrans.drop(columns=['merchant_category_id','purchase_date'])\nmerchants=merchants[['merchant_id','merchant_category_id','subsector_id','numerical_1','numerical_2','avg_sales_lag12','avg_purchases_lag12','active_months_lag12']]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"newTrans.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pastTrans.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"agg_func = {\n    'installments': ['mean'],\n    'month_lag': ['mean','count'],\n    'purchase_amount': ['mean']}\n    \nnewTransSummary = newTrans.groupby(['card_id']).agg(agg_func)\nnewTransSummary.columns = ['_'.join(col).strip() for col in newTransSummary.columns.values]\nnewTransSummary.reset_index(inplace=True)\npastTransSummary = pastTrans.groupby(['card_id']).agg(agg_func)\npastTransSummary.columns = ['_'.join(col).strip() for col in pastTransSummary.columns.values]\npastTransSummary.reset_index(inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"newTrans=newTrans.sort_values(by=['month_lag'], ascending=False)\npastTrans=pastTrans.sort_values(by=['month_lag'], ascending=False)\npastTrans=pastTrans.drop_duplicates('card_id',keep='first')\nnewTrans=newTrans.drop_duplicates('card_id',keep='first')\nnewTrans.reset_index(inplace=True)\npastTrans.reset_index(inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"### Aggregated with the latest and past summary with merchants info\naggregatedNew=newTrans.merge(newTransSummary,on='card_id',how='left')\naggregatedPast=pastTrans.merge(pastTransSummary,on='card_id',how='left')\naggregatedNew=aggregatedNew.merge(merchants,on='merchant_id',how='left')\naggregatedPast=aggregatedPast.merge(merchants,on='merchant_id',how='left')\naggregatedNew=aggregatedNew.drop(columns=['index','merchant_id'])\naggregatedPast=aggregatedPast.drop(columns=['index','merchant_id'])\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Release memory"},{"metadata":{"trusted":true},"cell_type":"code","source":"del pastTrans\ndel newTrans\ndel merchants","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedPast.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedPast.columns = [col+'_'+'past' for col in aggregatedPast.columns]\naggregatedAll=aggregatedNew.merge(aggregatedPast,left_on='card_id',right_on='card_id_past',how='outer')\ncardId=aggregatedAll['card_id'].tolist()\n#aggregatedAll=aggregatedAll.drop(columns=['card_id_past'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Free memoery again"},{"metadata":{"trusted":true},"cell_type":"code","source":"del aggregatedPast\ndel aggregatedNew","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll.isna().sum() \nids=aggregatedAll['card_id_past'].tolist()\naggregatedAll=aggregatedAll.drop(columns=['card_id','card_id_past'])\naggregatedAll['authorized_flag']=aggregatedAll['authorized_flag'].fillna('Unknown')\naggregatedAll['city_id']=aggregatedAll['city_id'].fillna('Unknown')\naggregatedAll['category_1']=aggregatedAll['category_1'].fillna('Unknown')\naggregatedAll['installments']=aggregatedAll['installments'].fillna(0)\naggregatedAll['category_3']=aggregatedAll['category_3'].fillna('Unknown')\naggregatedAll['month_lag']=aggregatedAll['month_lag'].fillna('Unknown')\naggregatedAll['purchase_amount']=aggregatedAll['purchase_amount'].fillna(0.0)\naggregatedAll['category_2']=aggregatedAll['category_2'].fillna('Unknown')\naggregatedAll['state_id']=aggregatedAll['state_id'].fillna('Unknown')\naggregatedAll['subsector_id_x']=aggregatedAll['subsector_id_x'].fillna('Unknown')\naggregatedAll['installments_mean']=aggregatedAll['installments_mean'].fillna(0)\naggregatedAll['month_lag_mean']=aggregatedAll['month_lag_mean'].fillna(0)\naggregatedAll['month_lag_count']=aggregatedAll['month_lag_count'].fillna(0)\naggregatedAll['purchase_amount_mean']=aggregatedAll['purchase_amount_mean'].fillna(0)\naggregatedAll['merchant_category_id']=aggregatedAll['merchant_category_id'].fillna('Unknown')\naggregatedAll['subsector_id_y']=aggregatedAll['subsector_id_y'].fillna('Unknown')\naggregatedAll['numerical_1']=aggregatedAll['numerical_1'].fillna(aggregatedAll['numerical_1'].mean())\naggregatedAll['numerical_2']=aggregatedAll['numerical_2'].fillna(aggregatedAll['numerical_2'].mean())\naggregatedAll['avg_sales_lag12']=aggregatedAll['avg_sales_lag12'].fillna(0.0)\naggregatedAll['avg_purchases_lag12']=aggregatedAll['avg_purchases_lag12'].fillna(0.0)\naggregatedAll['active_months_lag12']=aggregatedAll['active_months_lag12'].fillna(0.0)\n\n\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll['category_3_past']=aggregatedAll['category_3_past'].fillna('Unknown')\naggregatedAll['category_2_past']=aggregatedAll['category_2_past'].fillna('Unknown')\naggregatedAll['merchant_category_id_past']=aggregatedAll['merchant_category_id_past'].fillna('Unknown')\naggregatedAll['subsector_id_y_past']=aggregatedAll['subsector_id_y_past'].fillna('Unknown')\naggregatedAll['numerical_1_past']=aggregatedAll['numerical_1_past'].fillna(aggregatedAll['numerical_1_past'].mean())\naggregatedAll['numerical_2_past']=aggregatedAll['numerical_2_past'].fillna(aggregatedAll['numerical_2_past'].mean())\naggregatedAll['avg_sales_lag12_past']=aggregatedAll['avg_sales_lag12_past'].fillna(0.0)\naggregatedAll['avg_purchases_lag12_past']=aggregatedAll['avg_purchases_lag12_past'].fillna(0.0)\naggregatedAll['active_months_lag12_past']=aggregatedAll['active_months_lag12_past'].fillna(0.0)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll.isna().sum() ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"set(aggregatedAll['category_1_past'].tolist())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"categoricalColumns=['authorized_flag','category_1','installments','category_3','month_lag','category_2','authorized_flag_past','category_1_past','installments_past','category_3_past','month_lag_past','category_2_past']\ntoEmbedding=['city_id','state_id','subsector_id_x','merchant_category_id','subsector_id_y',\n             'city_id_past','state_id_past','subsector_id_x_past','merchant_category_id_past','subsector_id_y_past']\nnumericalColumns=['purchase_amount','installments_mean','month_lag_mean','month_lag_count','purchase_amount_mean','numerical_1','numerical_2','avg_sales_lag12','avg_purchases_lag12','active_months_lag12',\n                  'purchase_amount_past','installments_mean_past','month_lag_mean_past','month_lag_count_past','purchase_amount_mean_past','numerical_1_past','numerical_2_past','avg_sales_lag12_past','avg_purchases_lag12_past','active_months_lag12_past']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(categoricalColumns)+len(toEmbedding)+len(numericalColumns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(aggregatedAll.columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll=aggregatedAll[categoricalColumns+toEmbedding+numericalColumns]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## Latent Dim=5\n## On 'city_id','state_id','subsector_id_x','merchant_category_id','subsector_id_y'\nallCity=list(set(aggregatedAll['city_id'].tolist()+aggregatedAll['city_id_past'].tolist()))\nallState=list(set(aggregatedAll['state_id'].tolist()+aggregatedAll['state_id_past'].tolist()))\nallSubsectorx=list(set(aggregatedAll['subsector_id_x'].tolist()+aggregatedAll['subsector_id_x_past'].tolist()))\nallMerchantCat=list(set(aggregatedAll['merchant_category_id'].tolist()+aggregatedAll['merchant_category_id_past'].tolist()))\nallSubsectory=list(set(aggregatedAll['subsector_id_y'].tolist()+aggregatedAll['subsector_id_y_past'].tolist()))\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## Label Encode\ncityEncoding={}\ncityEncoding2={}\nfor i in range(len(allCity)):\n    cityEncoding[i]=allCity[i]\n    cityEncoding2[allCity[i]]=i\n\nstateEncoding={}\nstateEncoding2={}\n\nfor i in range(len(allState)):\n    stateEncoding[i]=allState[i]\n    stateEncoding2[allState[i]]=i\n\nsubsectorxEncoding={}\nsubsectorxEncoding2={}\n\nfor i in range(len(allSubsectorx)):\n    subsectorxEncoding[i]=allSubsectorx[i]\n    subsectorxEncoding2[allSubsectorx[i]]=i\n    \n\nmerchantCatEncoding={}\nmerchantCatEncoding2={}\n\nfor i in range(len(allMerchantCat)):\n    merchantCatEncoding[i]=allMerchantCat[i]\n    merchantCatEncoding2[allMerchantCat[i]]=i\n    \n\nsubsectoryEncoding={}\nsubsectoryEncoding2={}\n\nfor i in range(len(allSubsectory)):\n    subsectoryEncoding[i]=allSubsectory[i]\n    subsectoryEncoding2[allSubsectory[i]]=i\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll['ID']=ids\naggregatedAll=aggregatedAll.sample(frac=1)\naggregatedAll.reset_index(drop=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll=pd.get_dummies(data=aggregatedAll, columns=categoricalColumns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"idLst=aggregatedAll['ID'].tolist()\naggregatedAll=aggregatedAll.drop(columns=['ID'],inplace=False)\naggregatedAll=aggregatedAll.reset_index(drop=True)\ntrainData2=trainData[['card_id','target']]\naggregatedAll['ID']=idLst\naggregatedAll=aggregatedAll.merge(trainData2,left_on='ID',right_on='card_id',how='right')\naggregatedAll.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"result=aggregatedAll['target'].tolist()\naggregatedAll=aggregatedAll.drop(columns=['ID','card_id'])\naggregatedAll.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll=aggregatedAll.drop(columns=['target'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll['city_id']=aggregatedAll['city_id'].apply(lambda x:cityEncoding2[x])\naggregatedAll['city_id_past']=aggregatedAll['city_id_past'].apply(lambda x:cityEncoding2[x])\n\naggregatedAll['state_id']=aggregatedAll['state_id'].apply(lambda x:stateEncoding2[x])\naggregatedAll['state_id_past']=aggregatedAll['state_id_past'].apply(lambda x:stateEncoding2[x])\n\naggregatedAll['subsector_id_x']=aggregatedAll['subsector_id_x'].apply(lambda x:subsectorxEncoding2[x])\naggregatedAll['subsector_id_x_past']=aggregatedAll['subsector_id_x_past'].apply(lambda x:subsectorxEncoding2[x])\n\naggregatedAll['merchant_category_id']=aggregatedAll['merchant_category_id'].apply(lambda x:merchantCatEncoding2[x])\naggregatedAll['merchant_category_id_past']=aggregatedAll['merchant_category_id_past'].apply(lambda x:merchantCatEncoding2[x])\n\naggregatedAll['subsector_id_y']=aggregatedAll['subsector_id_y'].apply(lambda x:subsectoryEncoding2[x])\naggregatedAll['subsector_id_y_past']=aggregatedAll['subsector_id_y_past'].apply(lambda x:subsectoryEncoding2[x])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"bigX=np.array(aggregatedAll)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"result=np.array([[x] for x in result])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(bigX.shape)\nprint(result.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"aggregatedAll.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(len(cityEncoding))\nprint(len(stateEncoding))\nprint(len(subsectorxEncoding))\nprint(len(merchantCatEncoding2))\nprint(len(subsectoryEncoding))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import tensorflow.compat.v1 as tf\ntf.disable_v2_behavior()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Create Embeddings"},{"metadata":{"trusted":true},"cell_type":"code","source":"x=tf.placeholder(tf.float32,shape=(None, 103))\ny=tf.placeholder(tf.float32,shape=(None,1))\n\ncityLab=tf.slice(x, [0,0],[-1, 1])\ncityLabPast=tf.slice(x, [0,5],[-1, 1])\ncityLab=tf.dtypes.cast(cityLab, tf.int32)\ncityLabPast=tf.dtypes.cast(cityLabPast, tf.int32)\ncityEmbedding=tf.Variable(tf.random_normal([309,5], stddev=0.1))\nembeddedCity=tf.nn.embedding_lookup(cityEmbedding,cityLab)\nembeddedCityPast=tf.nn.embedding_lookup(cityEmbedding,cityLabPast)\n\n\nstateLab=tf.slice(x, [0,2],[-1, 1])\nstateLabPast=tf.slice(x, [0,6],[-1, 1])\nstateLab=tf.dtypes.cast(stateLab, tf.int32)\nstateLabPast=tf.dtypes.cast(stateLabPast, tf.int32)\nstateEmbedding=tf.Variable(tf.random_normal([26,5], stddev=0.1))\nembeddedState=tf.nn.embedding_lookup(stateEmbedding,cityLab)\nembeddedStatePast=tf.nn.embedding_lookup(stateEmbedding,stateLabPast)\n\nsubsectorxLab=tf.slice(x, [0,3],[-1, 1])\nsubsectorxLabPast=tf.slice(x, [0,7],[-1, 1])\nsubsectorxLab=tf.dtypes.cast(subsectorxLab, tf.int32)\nsubsectorxLabPast=tf.dtypes.cast(subsectorxLabPast, tf.int32)\nsubsectorxLabEmbedding=tf.Variable(tf.random_normal([42,5], stddev=0.1))\nembeddedSubsectorX=tf.nn.embedding_lookup(subsectorxLabEmbedding,subsectorxLab)\nembeddedSubsectorXPast=tf.nn.embedding_lookup(subsectorxLabEmbedding,subsectorxLabPast)\n\nmerchantCatLab=tf.slice(x, [0,4],[-1, 1])\nmerchantCatLabPast=tf.slice(x, [0,8],[-1, 1])\nmerchantCatLab=tf.dtypes.cast(merchantCatLab, tf.int32)\nmerchantCatLabPast=tf.dtypes.cast(merchantCatLabPast, tf.int32)\nmerchantCatLabEmbedding=tf.Variable(tf.random_normal([294,5], stddev=0.1))\nembeddedmerchantCat=tf.nn.embedding_lookup(merchantCatLabEmbedding,merchantCatLab)\nembeddedmerchantCatPast=tf.nn.embedding_lookup(merchantCatLabEmbedding,merchantCatLabPast)\n\nsubsectoryLab=tf.slice(x, [0,5],[-1, 1])\nsubsectoryLabPast=tf.slice(x, [0,9],[-1, 1])\nsubsectoryLab=tf.dtypes.cast(subsectoryLab, tf.int32)\nsubsectoryLabPast=tf.dtypes.cast(subsectoryLabPast, tf.int32)\nsubsectoryLabEmbedding=tf.Variable(tf.random_normal([41,5], stddev=0.1))\nembeddedSubsectorY=tf.nn.embedding_lookup(subsectoryLabEmbedding,subsectoryLab)\nembeddedSubsectorYPast=tf.nn.embedding_lookup(subsectoryLabEmbedding,subsectoryLabPast)\n\nadditionEncoding=embeddedCity+embeddedCityPast+embeddedState+embeddedStatePast+embeddedSubsectorX+embeddedSubsectorXPast+embeddedmerchantCat+embeddedmerchantCatPast+embeddedSubsectorY+embeddedSubsectorYPast\n\ninterCity=tf.multiply(embeddedCity,embeddedCityPast)\ninterState=tf.multiply(embeddedState,embeddedStatePast)\ninterSubsectorx=tf.multiply(embeddedSubsectorX,embeddedSubsectorXPast)\ninterMerchant=tf.multiply(embeddedmerchantCat,embeddedmerchantCatPast)\ninterSubsectory=tf.multiply(embeddedSubsectorY,embeddedSubsectorYPast)\n\nFMPart=tf.concat(\n    [additionEncoding,interCity,interState,interSubsectorx,interMerchant,interSubsectory],2)\nFMPart=tf.squeeze(FMPart, [1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"FFfeatures=cityLab=tf.slice(x, [0,10],[-1, 93])\nhidden1=tf.layers.dense(FFfeatures, 32,activation=tf.nn.sigmoid)\ndeepPart=tf.layers.dense(hidden1,16,activation=tf.nn.sigmoid)\n\nDeepFMHidden=tf.concat([FMPart,deepPart],1)\nDeepFMHidden2=tf.layers.dense(DeepFMHidden,16,activation=tf.nn.tanh)\nDeepFMHidden3=tf.layers.dense(DeepFMHidden2,8,activation=tf.nn.tanh)\nDeepFMFinal=tf.layers.dense(DeepFMHidden3,1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"FMPart.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"deepPart.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DeepFMHidden.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DeepFMFinal.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"loss=mse = tf.losses.mean_squared_error(y, DeepFMFinal) \ntraining=tf.train.AdamOptimizer(0.003).minimize(loss)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## Training","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Change number of Epoches to 200 - 2000 for better performance"},{"metadata":{"trusted":true},"cell_type":"code","source":"sess=tf.Session()\ninit=tf.global_variables_initializer()\nsess.run(init)\n\nbatchSize=128\nepochs=50\ncnter=0\nttLoss=0.0\nfor idx in range(epochs):\n    cnter=0\n    for i in range(int(bigX.shape[0]/batchSize)-1):\n        tempX=bigX[i*batchSize:(i+1)*batchSize]\n        tempY=result[i*batchSize:(i+1)*batchSize]\n        _,temploss=sess.run([training,loss],feed_dict={x:tempX,y:tempY})\n        ttLoss+=temploss\n        if i%10000==0:\n            print('Current Loss: '+ str(ttLoss/10000.0))\n            ttLoss=0.0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"allPred=[]\nfor i in range(int(bigX.shape[0]/batchSize)-1):\n    tempX=bigX[i*batchSize:(i+1)*batchSize]\n    tempY=result[i*batchSize:(i+1)*batchSize]\n    _,_,pred=sess.run([training,loss,DeepFMFinal],feed_dict={x:tempX,y:tempY})\n    allPred+=list(pred.reshape([128]))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"[x[0] for x in result]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":1}