{"metadata":{"kernelspec":{"display_name":"base","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.12.3"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":103436,"databundleVersionId":12476472,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport numpy as np","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Chuẩn bị dữ liệu","metadata":{}},{"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":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_delay_4_6 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/delay_4_6_CONDITION_PRODUCT_SUPPLIER.csv', na_values=[' ', '', '   '], low_memory=False)\ndf_not_delay_4_6 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/not_delay_4_6_CONDITION_PRODUCT_SUPPLIER.csv', na_values=[' ', '', '   '], low_memory=False)\ndf_delay_7_9 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/delay_7_9_CONDITION_PRODUCT_SUPPLIER.csv', na_values=[' ', '', '   '], low_memory=False)\ndf_not_delay_7_9 = pd.read_csv('/kaggle/input/ds-108-p-21-assigment-06/not_delay_7_9_CONDITION_PRODUCT_SUPPLIER.csv', na_values=[' ', '', '   '], low_memory=False)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Gộp dữ liệu\nA = pd.concat([df_delay_4_6, df_not_delay_4_6], ignore_index=True)\nB = pd.concat([df_delay_7_9, df_not_delay_7_9], ignore_index=True)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Xử lí tập A","metadata":{}},{"cell_type":"code","source":"if A[\"SPECIAL_DIV\"].equals(A[\"SPECIAL DIV\"]): \n    print('Hai cột giống nhau, chỉ giữ lại một cột')\n    A.drop(columns=[\"SPECIAL DIV\"], inplace=True) ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển cột 'Order date' sang kiểu datetime\nA['Order date'] = pd.to_datetime(A['Order date'])\n\n# Chuyển cột 'VSD' sang kiểu datetime\nA['VSD'] = pd.to_datetime(A['VSD'])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"A['Order_Year'] = A['Order date'].dt.year\nA['Order_Month'] = A['Order date'].dt.month\nA['Time_to_Ship'] = (A['VSD'] - A['Order date']).dt.days\n\n# Loại bỏ cột gốc sau khi trích xuất\nA.drop(columns=['Order date', 'VSD'], inplace=True) ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kiểm tra missing values\ntotal_missing = A.isnull().sum()\ntotal_cells = A.size\n\n# Tính phần trăm giá trị thiếu cho mỗi cột\npercentage_missing = (total_missing / len(A)) * 100\n\nfor col, missing, percent in zip(A.columns, total_missing, percentage_missing):\n    print(f\"- {col}: {missing} giá trị thiếu ({percent:.2f}%)\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột có quá nhiều missing values\ncolumns_to_drop = [ \"SOUF_RCV_NO\", \"QTUF_RCV_NO\"]\n\nA = A.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kiểm tra thuộc tính chỉ có khoảng trắng\nstr_cols = A.select_dtypes(include='object').columns\n\n# Tạo dictionary để lưu kết quả\nblankspace_counts = {}\n\nfor col in str_cols:\n    series = A[col].dropna()\n\n    count = series.apply(lambda x: isinstance(x, str) and (\n        x.strip() == ''              # chỉ chứa khoảng trắng\n\n    )).sum()\n\n    blankspace_counts[col] = count\n\nfor col, count in blankspace_counts.items():\n    print(f\"{col}: {count} ô có khoảng trắng\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột chỉ chứa khoảng trống\nA = A.drop(columns=[\"PRODUCT_ASSORT\", \"REASON_CD\"], errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Thay thế các khoảng trắng ở thuộc tính OTHER AREA SHIP DIV thành 0\nA[\"OTHER AREA SHIP DIV\"] = A[\"OTHER AREA SHIP DIV\"].astype(str).str.strip().replace(\"\", \"0\").fillna(\"0\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kiểm tra các cột chỉ có một giá trị\nunique_value_counts = A.apply(lambda col: len(col.unique()))\nsingle_value_cols = unique_value_counts[unique_value_counts == 1].index\n\nfor col in single_value_cols:\n    print(f\"- {col}: {A[col].unique()[0]}\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột chỉ có một giá trị\ncolumns_to_drop = [\"SUBSIDIARY_CD\", \"HAZARD_FLG\", \"Order_Year\"]\n\nA = A.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột chỉ có ở tập A mà không có ở tập B\ncolumns_to_drop = [\"HEAVY_FLG\", \"EXPENSIVE_FLG\", \"ACTUAL_SHIP_DAYS\", \"SPECIFY_PRODUCTION_DAYS\", \"SPECIFY_SHIP_DAYS\", \"IO_UNFIT_FLG\", \"WEIGHT_UNIT\", \n                   \"SUPPLIER_CATEGORY_CD\"]\n\nA = A.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Lọc ra các cột có kiểu dữ liệu object\nobject_columns = A.select_dtypes(include=['object'])\n\nfor column in object_columns.columns:\n    print(f\"Cột {column}: {object_columns[column].unique()}\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển đổi cột có thể thành số \nnumeric_columns = ['Consider count hodiday Saturday', 'OTHER AREA SHIP DIV']\nfor column in numeric_columns:\n    A[column] = pd.to_numeric(A[column], errors='coerce') ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển đổi cột có thể thành category \ncategory_columns = ['PACKING RANK', 'DELI_DIV', 'Ship Mode']\nfor column in category_columns:\n    A[column] = A[column].astype('category')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"category_features = A.select_dtypes(include=['object', 'category']).columns\n\n# Chỉ chọn những cột có số lượng giá trị duy nhất nhỏ hơn 100\nselected_categories = [col for col in category_features if A[col].nunique() < 100]\nA = pd.get_dummies(A, columns=selected_categories)\n\n# Nếu số lượng giá trị duy nhất lớn, dùng Label Encoding\nfrom sklearn.preprocessing import LabelEncoder\n\nle = LabelEncoder()\nfor col in category_features:\n    if A[col].nunique() >= 100:\n        A[col] = le.fit_transform(A[col])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chỉ lấy các cột kiểu số\nnumeric_cols = A.select_dtypes(include=['number'])\n\n# Vẽ heatmap\nplt.figure(figsize=(25, 10))\nsns.heatmap(numeric_cols.corr(), annot=True, cmap='coolwarm', fmt=\".2f\")\nplt.title(\"Heatmap của ma trận tương quan giữa các biến số\")\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột đa cộng tuyến\nA = A.drop(columns=['SUPPLIER INV AMOUNT', 'Stock class', 'ALLOCATION QTY'])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"A.columns = A.columns.str.strip().str.lower().str.replace(r'\\s+', '_', regex=True)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Xử lí tập B","metadata":{}},{"cell_type":"code","source":"if B[\"SPECIAL_DIV\"].equals(B[\"SPECIAL DIV\"]): \n    print('Hai cột giống nhau, chỉ giữ lại một cột')\n    B.drop(columns=[\"SPECIAL DIV\"], inplace=True) ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển cột 'Order date' sang kiểu datetime\nB['Order date'] = pd.to_datetime(B['Order date'])\n\n# Chuyển cột 'VSD' sang kiểu datetime\nB['VSD'] = pd.to_datetime(B['VSD'])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"B['Order_Year'] = B['Order date'].dt.year\nB['Order_Month'] = B['Order date'].dt.month\nB['Time_to_Ship'] = (B['VSD'] - B['Order date']).dt.days\n\n# Loại bỏ cột gốc sau khi trích xuất\nB.drop(columns=['Order date', 'VSD'], inplace=True) ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kiểm tra missing values\ntotal_missing = B.isnull().sum()\ntotal_cells = B.size\n\n# Tính phần trăm giá trị thiếu cho mỗi cột\npercentage_missing = (total_missing / len(B)) * 100\n\nfor col, missing, percent in zip(B.columns, total_missing, percentage_missing):\n    print(f\"- {col}: {missing} giá trị thiếu ({percent:.2f}%)\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột có quá nhiều missing values\ncolumns_to_drop = [\"SOUF_RCV_NO\", \"QTUF_RCV_NO\", \"REASON_CD\"]\n\nB = B.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Thay thế các khoảng trắng thành 0\nB[\"OTHER AREA SHIP DIV\"] = B[\"OTHER AREA SHIP DIV\"].astype(str).str.strip().replace(\"\", \"0\").fillna(\"0\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kiểm tra thuộc tính chỉ có khoảng trắng\nstr_cols = B.select_dtypes(include='object').columns\n\n# Tạo dictionary để lưu kết quả\nblankspace_counts = {}\n\nfor col in str_cols:\n    series = B[col].dropna()\n\n    count = series.apply(lambda x: isinstance(x, str) and (\n        x.strip() == ''              # chỉ chứa khoảng trắng\n\n    )).sum()\n\n    blankspace_counts[col] = count\n\nfor col, count in blankspace_counts.items():\n    print(f\"{col}: {count} ô có khoảng trắng\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kiểm tra các cột chỉ có một giá trị\nunique_value_counts = B.apply(lambda col: len(col.unique()))\nsingle_value_cols = unique_value_counts[unique_value_counts == 1].index\n\nfor col in single_value_cols:\n    print(f\"- {col}: {B[col].unique()[0]}\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột chỉ có một giá trị\ncolumns_to_drop = [\"SUBSIDIARY_CD\", \"Order_Year\"]\n\nB = B.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Lọc ra các cột có kiểu dữ liệu object\nobject_columns = B.select_dtypes(include=['object'])\n\nfor column in object_columns.columns:\n    print(f\"Cột {column}: {object_columns[column].unique()}\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển đổi cột có thể thành số \nnumeric_columns = ['OTHER AREA SHIP DIV']\nfor column in numeric_columns:\n    B[column] = pd.to_numeric(B[column], errors='coerce')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển đổi cột có thể thành category \ncategory_columns = ['PACKING RANK', 'DELI_DIV', 'Ship Mode']\nfor column in category_columns:\n    B[column] = B[column].astype('category')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"category_features = B.select_dtypes(include=['object', 'category']).columns\n\n# Chỉ chọn những cột có số lượng giá trị duy nhất nhỏ hơn 100\nselected_categories = [col for col in category_features if B[col].nunique() < 100]\nB = pd.get_dummies(B, columns=selected_categories)\n\n# Nếu số lượng giá trị duy nhất lớn, dùng Label Encoding\nfrom sklearn.preprocessing import LabelEncoder\n\nle = LabelEncoder()\nfor col in category_features:\n    if B[col].nunique() >= 100:\n        B[col] = le.fit_transform(B[col])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chỉ lấy các cột kiểu số\nnumeric_cols = B.select_dtypes(include=['number'])\n\n# Vẽ heatmap\nplt.figure(figsize=(25, 10))\nsns.heatmap(numeric_cols.corr(), annot=True, cmap='coolwarm', fmt=\".2f\")\nplt.title(\"Heatmap của ma trận tương quan giữa các biến số\")\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột đa cộng tuyến\nB = B.drop(columns=['SUPPLIER INV AMOUNT', 'Stock class', 'ALLOCATION QTY'])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"B.columns = B.columns.str.strip().str.lower().str.replace(r'\\s+', '_', regex=True)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = pd.concat([A, B])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Drop các cột tương tự ở tập test","metadata":{}},{"cell_type":"code","source":"test = pd.read_csv('PILOT_10.csv')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if test[\"SPECIAL_DIV\"].equals(test[\"SPECIAL DIV\"]): \n    print('Hai cột giống nhau, chỉ giữ lại một cột')\n    test.drop(columns=[\"SPECIAL DIV\"], inplace=True) ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển cột 'Order date' sang kiểu datetime\ntest['Order date'] = pd.to_datetime(test['Order date'])\n\n# Chuyển cột 'VSD' sang kiểu datetime\ntest['VSD'] = pd.to_datetime(test['VSD'])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test['Order_Year'] = test['Order date'].dt.year\ntest['Order_Month'] = test['Order date'].dt.month\ntest['Time_to_Ship'] = (test['VSD'] - test['Order date']).dt.days\n\n# Loại bỏ cột gốc sau khi trích xuất\ntest.drop(columns=['Order date', 'VSD'], inplace=True) ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột có quá nhiều missing values\ncolumns_to_drop = [ \"SOUF_RCV_NO\", \"QTUF_RCV_NO\"]\n\ntest = test.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột chỉ chứa khoảng trống\ntest = test.drop(columns=[\"PRODUCT_ASSORT\", \"REASON_CD\"], errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Thay thế các khoảng trắng ở thuộc tính OTHER AREA SHIP DIV thành 0\ntest[\"OTHER AREA SHIP DIV\"] = test[\"OTHER AREA SHIP DIV\"].astype(str).str.strip().replace(\"\", \"0\").fillna(\"0\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop các cột chỉ có một giá trị\ncolumns_to_drop = [\"SUBSIDIARY_CD\", \"HAZARD_FLG\", \"Order_Year\"]\n\ntest = test.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"columns_to_drop = ['Stock class', 'ALLOCATION QTY', 'SUPPLIER INV AMOUNT'] \n\ntest = test.drop(columns=columns_to_drop, errors='ignore')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển đổi cột có thể thành số \nnumeric_columns = ['Consider count hodiday Saturday', 'OTHER AREA SHIP DIV']\nfor column in numeric_columns:\n    test[column] = pd.to_numeric(test[column], errors='coerce') ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Chuyển đổi cột có thể thành category \ncategory_columns = ['PACKING RANK', 'DELI_DIV', 'Ship Mode']\nfor column in category_columns:\n    test[column] = test[column].astype('category')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"category_features = test.select_dtypes(include=['object', 'category']).columns\n\n# Chỉ chọn những cột có số lượng giá trị duy nhất nhỏ hơn 100\nselected_categories = [col for col in category_features if test[col].nunique() < 100]\ntest = pd.get_dummies(test, columns=selected_categories)\n\n# Nếu số lượng giá trị duy nhất lớn, dùng Label Encoding\nfrom sklearn.preprocessing import LabelEncoder\n\nle = LabelEncoder()\nfor col in category_features:\n    if test[col].nunique() >= 100:\n        test[col] = le.fit_transform(test[col])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.columns = test.columns.str.strip().str.lower().str.replace(r'\\s+', '_', regex=True)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"columns_to_add = ['ship_mode_w', 'ship_mode_o', 'ship_mode_f', 'deli_div_0l'] \n\ntest[columns_to_add] = False","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = test[sorted(test.columns)]\ndata = data[sorted(data.columns)]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = test.rename(columns={\"deli_div_0\": \"deli_div_00\"})","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Chia dữ liệu ","metadata":{}},{"cell_type":"code","source":"X_train = data.drop(columns = ['label'])\ny_train = data['label']\n\nX_test = test.drop(columns = ['id'])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nfrom xgboost import XGBClassifier\nfrom catboost import CatBoostClassifier \nfrom lightgbm import LGBMClassifier\n\nxgb = XGBClassifier() \ncat = CatBoostClassifier() \nlgb = LGBMClassifier()\n\nxgb.fit(X_train, y_train) \ncat.fit(X_train, y_train) \nlgb.fit(X_train, y_train)\n\nxgb_pred = xgb.predict_proba(X_test)[:, 1] \ncat_pred = cat.predict_proba(X_test)[:, 1] \nlgb_pred = lgb.predict_proba(X_test)[:, 1]\n\navg_pred = (xgb_pred + cat_pred + lgb_pred) / 3\ny_pred = (avg_pred > 0.5).astype(int)\n","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred = pd.DataFrame(y_pred)\npred.columns = [\"label\"]\npred.index = range(1, len(pred) + 1)\npred.index.name = \"ID\"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred.to_csv('23520078.csv')","metadata":{},"outputs":[],"execution_count":null}]}