{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Changes: \n# Using One vectorizer for train and test dataframes\n# Using 'city' column in dataframes instead of using 'state' \n\n# import libraries \nimport pandas as pd\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-14T16:01:17.075520Z","iopub.execute_input":"2023-11-14T16:01:17.076026Z","iopub.status.idle":"2023-11-14T16:01:17.082691Z","shell.execute_reply.started":"2023-11-14T16:01:17.075988Z","shell.execute_reply":"2023-11-14T16:01:17.081286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# usefull features in df_train\ncol_features = [\n    'trans_date_trans_time', \n    'category', \n    'amt',  \n    'gender', \n    'city', \n    'lat', \n    'long', \n    'city_pop', \n    'dob',  \n    'job',  \n    'merch_lat', \n    'merch_long',\n    'is_fraud']","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:17.085203Z","iopub.execute_input":"2023-11-14T16:01:17.085739Z","iopub.status.idle":"2023-11-14T16:01:17.101535Z","shell.execute_reply.started":"2023-11-14T16:01:17.085691Z","shell.execute_reply":"2023-11-14T16:01:17.100141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Making df_train more usefull for training","metadata":{}},{"cell_type":"code","source":"class Main(): \n    def __init__(self, \n                 train_path, \n                 test_path, \n                 train_usefull_features:list = [], \n                 test_usefull_features:list = []): \n        self.df_train = pd.read_csv(train_path)[train_usefull_features]\n        self.df_test = pd.read_csv(test_path)[test_usefull_features]\n        self.trained = False\n    \n    def preprocess(self, fn_lst, vectorize_fn): \n        self.fn_lst = fn_lst\n        for fn in fn_lst: \n            self.df_train = fn(self.df_train)\n            self.df_test = fn(self.df_test)\n        \n        self.df_train, self.df_test = vectorize_fn(self.df_train, self.df_test)\n            \n    def train_clf(self, target_column = 'is_fraud'): \n        # Assuming df_train is your DataFrame\n        print('split to X and y')\n        y = self.df_train.pop(target_column)\n        X = self.df_train\n\n        print('split to Train and Validation sets')\n        # Split the data into training and testing sets\n        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n        \n        print('model training ...')\n                # Initialize the RandomForestClassifier\n        clf = RandomForestClassifier(n_estimators=100, random_state=42)\n\n        # Fit the model to the training data\n        clf.fit(X_train, y_train)\n        print(f\"model score is {clf.score(X_test, y_test)}\")\n        \n        self.model = clf\n        self.trained = True\n        \n    def predict_test(self, df = None): \n        if df == None: \n            df = self.df_test\n        if self.trained: \n            for fn in self.fn_lst: \n                df = fn(df)\n            \n            prediction = self.model.predict(df)\n            return prediction\n        else: \n            print('Train model before predict')\n            return None","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:17.103929Z","iopub.execute_input":"2023-11-14T16:01:17.105372Z","iopub.status.idle":"2023-11-14T16:01:17.121005Z","shell.execute_reply.started":"2023-11-14T16:01:17.105320Z","shell.execute_reply":"2023-11-14T16:01:17.119459Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"main = Main(\n    train_path = '/kaggle/input/anyas-gojo-revival-bondman/trainData.csv', \n    test_path = '/kaggle/input/anyas-gojo-revival-bondman/testData.csv', \n    train_usefull_features = col_features, \n    test_usefull_features = col_features[:-1])","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:17.123033Z","iopub.execute_input":"2023-11-14T16:01:17.123755Z","iopub.status.idle":"2023-11-14T16:01:25.127026Z","shell.execute_reply.started":"2023-11-14T16:01:17.123715Z","shell.execute_reply":"2023-11-14T16:01:25.125489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**TIME:** ","metadata":{}},{"cell_type":"code","source":"def create_trans_time(df_train): \n    df_train['trans_date_trans_time'] = pd.to_datetime(df_train['trans_date_trans_time'])\n\n    # take only usefull time\n    def take_hour(x): \n         return x.hour\n\n    df_train['trans_time'] = df_train['trans_date_trans_time'].apply(take_hour)\n\n    df_train = df_train.drop(['trans_date_trans_time'], axis=1)\n    return df_train","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:25.130323Z","iopub.execute_input":"2023-11-14T16:01:25.130753Z","iopub.status.idle":"2023-11-14T16:01:25.137480Z","shell.execute_reply.started":"2023-11-14T16:01:25.130717Z","shell.execute_reply":"2023-11-14T16:01:25.136273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**DOB:**","metadata":{}},{"cell_type":"code","source":"def preprocess_dob(df_train): \n    df_train['dob'] = pd.to_datetime(df_train['dob'])\n\n    def take_period(x):\n        year = x.year\n        age = 2023 - year\n        \n        return age\n\n    df_train['dob'] = df_train['dob'].apply(take_period)\n    return df_train","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:25.138858Z","iopub.execute_input":"2023-11-14T16:01:25.139277Z","iopub.status.idle":"2023-11-14T16:01:25.149446Z","shell.execute_reply.started":"2023-11-14T16:01:25.139241Z","shell.execute_reply":"2023-11-14T16:01:25.148131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess_gender (df_train): # gender\n    df_train['gender'] = df_train['gender'].apply(lambda x: 1 if x == 'F' else 0)\n    return df_train","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:25.151088Z","iopub.execute_input":"2023-11-14T16:01:25.152267Z","iopub.status.idle":"2023-11-14T16:01:25.162404Z","shell.execute_reply.started":"2023-11-14T16:01:25.152225Z","shell.execute_reply":"2023-11-14T16:01:25.160940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.feature_extraction.text import CountVectorizer\n\ndef vectorize_and_drop(df_train, df_test, column_name, max_features=50):\n    global vectorizers\n    print(f'vectorizing {column_name} column')\n    # Initialize the CountVectorizer\n    vectorizer = CountVectorizer(max_features=max_features)\n\n#     fit vectorizer on test dataframe\n    vectorizer.fit(df_test[column_name])\n\n    # Fit and transform the column\n    vectors_train = vectorizer.fit_transform(df_train[column_name])\n    vectors_test = vectorizer.transform(df_test[column_name])\n\n    # Convert the vectors to a DataFrame\n    vectors_df_train = pd.DataFrame(vectors_train.toarray(), columns=vectorizer.get_feature_names_out())\n    vectors_df_test = pd.DataFrame(vectors_test.toarray(), columns=vectorizer.get_feature_names_out())\n    \n    # Concatenate the original DataFrame with the new vectors\n    df_train = pd.concat([df_train, vectors_df_train], axis=1)\n    df_test = pd.concat([df_test, vectors_df_test], axis=1)\n\n    # Drop the original column\n    df_train = df_train.drop(column_name, axis=1)\n    df_test = df_test.drop(column_name, axis=1)\n\n    return df_train, df_test","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:25.164131Z","iopub.execute_input":"2023-11-14T16:01:25.164553Z","iopub.status.idle":"2023-11-14T16:01:25.178962Z","shell.execute_reply.started":"2023-11-14T16:01:25.164519Z","shell.execute_reply":"2023-11-14T16:01:25.177490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_test_to_numeric(df_train, df_test): \n    df_train, df_test = vectorize_and_drop(df_train, df_test, 'category')\n    df_train, df_test = vectorize_and_drop(df_train, df_test, 'job')    \n    df_train, df_test = vectorize_and_drop(df_train, df_test, 'city')    \n#     df_train, df_test = vectorize_and_drop(df_train, df_test, 'dob')    \n    \n    return df_train, df_test","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:25.180448Z","iopub.execute_input":"2023-11-14T16:01:25.180855Z","iopub.status.idle":"2023-11-14T16:01:25.196920Z","shell.execute_reply.started":"2023-11-14T16:01:25.180820Z","shell.execute_reply":"2023-11-14T16:01:25.195785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fn_lst = [\n    create_trans_time,\n    preprocess_dob,\n    preprocess_gender, \n]\nmain.preprocess(fn_lst, train_test_to_numeric)","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:01:25.199272Z","iopub.execute_input":"2023-11-14T16:01:25.200105Z","iopub.status.idle":"2023-11-14T16:02:11.274522Z","shell.execute_reply.started":"2023-11-14T16:01:25.200056Z","shell.execute_reply":"2023-11-14T16:02:11.272913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train RandomForest Classifier","metadata":{}},{"cell_type":"code","source":"main.train_clf()","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:02:11.279964Z","iopub.execute_input":"2023-11-14T16:02:11.280447Z","iopub.status.idle":"2023-11-14T16:05:15.350248Z","shell.execute_reply.started":"2023-11-14T16:02:11.280408Z","shell.execute_reply":"2023-11-14T16:05:15.348645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Make Submissions","metadata":{}},{"cell_type":"code","source":"predicted_test = main.model.predict(main.df_test)","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:05:15.352519Z","iopub.execute_input":"2023-11-14T16:05:15.353262Z","iopub.status.idle":"2023-11-14T16:05:28.944560Z","shell.execute_reply.started":"2023-11-14T16:05:15.353213Z","shell.execute_reply":"2023-11-14T16:05:28.943085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test_id = pd.read_csv('/kaggle/input/anyas-gojo-revival-bondman/testData.csv').id\n\nsubmission = pd.DataFrame({'is_fraud': predicted_test})\nsubmission.index = df_test_id\nsubmission.index.name = 'id'\n# submission.index rename to 'id'","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:05:28.946633Z","iopub.execute_input":"2023-11-14T16:05:28.947004Z","iopub.status.idle":"2023-11-14T16:05:33.112360Z","shell.execute_reply.started":"2023-11-14T16:05:28.946971Z","shell.execute_reply":"2023-11-14T16:05:33.111078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:05:33.114622Z","iopub.execute_input":"2023-11-14T16:05:33.115488Z","iopub.status.idle":"2023-11-14T16:05:34.561070Z","shell.execute_reply.started":"2023-11-14T16:05:33.115439Z","shell.execute_reply":"2023-11-14T16:05:34.559854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"main.fn_lst","metadata":{"execution":{"iopub.status.busy":"2023-11-14T16:05:34.563276Z","iopub.execute_input":"2023-11-14T16:05:34.563804Z","iopub.status.idle":"2023-11-14T16:05:34.573293Z","shell.execute_reply.started":"2023-11-14T16:05:34.563759Z","shell.execute_reply":"2023-11-14T16:05:34.571589Z"},"trusted":true},"execution_count":null,"outputs":[]}]}