{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":103436,"databundleVersionId":12476472,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import warnings\nwarnings.simplefilter('ignore')\n\nfrom sklearn.model_selection import train_test_split, StratifiedKFold, cross_val_score\nfrom sklearn.metrics import accuracy_score, f1_score, classification_report\nfrom sklearn.preprocessing import LabelEncoder\nfrom collections import Counter\n\nimport optuna\n\nfrom lightgbm import LGBMClassifier\nimport pandas as pd\nimport numpy as np","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:56:05.940746Z","iopub.execute_input":"2025-06-18T02:56:05.941211Z","iopub.status.idle":"2025-06-18T02:56:13.343927Z","shell.execute_reply.started":"2025-06-18T02:56:05.941176Z","shell.execute_reply":"2025-06-18T02:56:13.343010Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Loading data","metadata":{}},{"cell_type":"code","source":"# 4-6\ndelay_4_6 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/delay_4_6_CONDITION_PRODUCT_SUPPLIER.csv', encoding='utf-8')\nnot_delay_4_6 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/not_delay_4_6_CONDITION_PRODUCT_SUPPLIER.csv', encoding='utf-8', low_memory=False)\n\n#7-9\ndelay_7_9 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/delay_7_9_CONDITION_PRODUCT_SUPPLIER.csv', encoding='utf-8')\nnot_delay_7_9 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/not_delay_7_9_CONDITION_PRODUCT_SUPPLIER.csv', encoding='utf-8', low_memory=False)\n\n#pilot\npilot = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/PILOT_10.csv', encoding= 'utf-8')\n\n# Data concat\ndata_4_6 = pd.concat([delay_4_6, not_delay_4_6],join='inner', ignore_index=True)\ndata_7_9 = pd.concat([delay_7_9, not_delay_7_9], join='inner', ignore_index=True)\nfull_data = pd.concat([data_4_6, data_7_9], join='inner', ignore_index=True)\nprint(data_4_6.shape, data_7_9.shape,full_data.shape, pilot.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:56:13.345211Z","iopub.execute_input":"2025-06-18T02:56:13.345777Z","iopub.status.idle":"2025-06-18T02:56:28.473005Z","shell.execute_reply.started":"2025-06-18T02:56:13.345754Z","shell.execute_reply":"2025-06-18T02:56:28.472008Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Preprocessing","metadata":{}},{"cell_type":"code","source":"def preprocessing(df):\n    # drop data leak feature - ['REASON_CD', 'QTUF_RCV_NO', 'SOUF_RCV_NO']\n    df = df.drop(columns=['REASON_CD', 'QTUF_RCV_NO', 'SOUF_RCV_NO'])\n    # drop feature has correlation = 1 - ['SUPPLIER INV AMOUNT', 'Stock class', 'ALLOCATION QTY', 'SPECIAL DIV']\n    df = df.drop(columns=['SUPPLIER INV AMOUNT', 'Stock class', 'ALLOCATION QTY', 'SPECIAL DIV'])\n    # drop SUBSIDIARY_CD\n    df = df.drop(columns='SUBSIDIARY_CD')\n    \n    # Ensure date and add new features\n    df['Order date'] = pd.to_datetime(df['Order date'], format='mixed', errors='raise')\n    df['VSD'] = pd.to_datetime(df['VSD'], format='mixed', errors='raise')\n    \n    df['Order_day'] = df['Order date'].dt.day\n    df['Order_month'] = df['Order date'].dt.month\n    df['Order_year'] = df['Order date'].dt.year\n    \n    df['VSD_day'] = df['VSD'].dt.day\n    df['VSD_month'] = df['VSD'].dt.month\n    df['VSD_year'] = df['VSD'].dt.year\n    \n    df['Day_range'] = (df['VSD'] - df['Order date']).dt.days\n    \n    df = df.drop(columns=['Order date', 'VSD'])\n    \n    # Handle missing value\n    numerical_cols = df.select_dtypes(include=['number']).columns\n    for col in numerical_cols:\n        df[col] = df[col].fillna(df[col].mean()) #impute mean\n\n    categorical_cols = df.select_dtypes(include=['object']).columns\n    for col in categorical_cols:  \n        df[col] = df[col].fillna('missing') #impute missing\n        \n    #df[categorical_cols] =  df[categorical_cols].astype('category')\n\n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:56:28.473820Z","iopub.execute_input":"2025-06-18T02:56:28.474097Z","iopub.status.idle":"2025-06-18T02:56:28.483505Z","shell.execute_reply.started":"2025-06-18T02:56:28.474076Z","shell.execute_reply":"2025-06-18T02:56:28.482416Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = preprocessing(full_data)\ntest = preprocessing(pilot)\n\ncat_cols = train.select_dtypes(include='object').columns\ntrain[cat_cols] = train[cat_cols].astype('category')\ntest[cat_cols] = test[cat_cols].astype('category')\n\nX_train = train.drop(columns= 'label')\ny_train = train['label']\ntest = test.drop(columns= 'ID')\nprint(X_train.shape, test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:56:28.485529Z","iopub.execute_input":"2025-06-18T02:56:28.485904Z","iopub.status.idle":"2025-06-18T02:56:44.832345Z","shell.execute_reply.started":"2025-06-18T02:56:28.485874Z","shell.execute_reply":"2025-06-18T02:56:44.831344Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Modeling","metadata":{}},{"cell_type":"code","source":"LGBM = LGBMClassifier()\nLGBM.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:56:44.833290Z","iopub.execute_input":"2025-06-18T02:56:44.833532Z","iopub.status.idle":"2025-06-18T02:57:05.420777Z","shell.execute_reply.started":"2025-06-18T02:56:44.833511Z","shell.execute_reply":"2025-06-18T02:57:05.419864Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"result = LGBM.predict(test)\nprint(Counter(result))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:57:05.421689Z","iopub.execute_input":"2025-06-18T02:57:05.421953Z","iopub.status.idle":"2025-06-18T02:57:07.944651Z","shell.execute_reply.started":"2025-06-18T02:57:05.421924Z","shell.execute_reply":"2025-06-18T02:57:07.943736Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"output = pd.DataFrame(result)\noutput.insert(0, 'ID', range(1, len(output) + 1))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:57:07.945518Z","iopub.execute_input":"2025-06-18T02:57:07.945775Z","iopub.status.idle":"2025-06-18T02:57:07.953103Z","shell.execute_reply.started":"2025-06-18T02:57:07.945755Z","shell.execute_reply":"2025-06-18T02:57:07.951572Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T02:57:07.954174Z","iopub.execute_input":"2025-06-18T02:57:07.954567Z","iopub.status.idle":"2025-06-18T02:57:08.084128Z","shell.execute_reply.started":"2025-06-18T02:57:07.954533Z","shell.execute_reply":"2025-06-18T02:57:08.083062Z"}},"outputs":[],"execution_count":null}]}