{"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"},{"sourceId":12186599,"sourceType":"datasetVersion","datasetId":7675859}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Cài đặt các thư viện cần thiết\n!pip install -U scikit-learn imbalanced-learn\n\n# Nhập các thư viện\nimport pandas as pd\nfrom IPython.display import FileLink, display\n\n# Hàm tiền xử lý dữ liệu\ndef preprocess_data(df: pd.DataFrame,\n                    order_date_col: str = 'Order date',\n                    vsd_col: str = 'VSD') -> pd.DataFrame:\n    \"\"\"\n    - Chuyển đổi cột ngày thành định dạng datetime.\n    - Loại bỏ các hàng có ngày không hợp lệ.\n    \"\"\"\n    df = df.copy()\n    df[order_date_col] = pd.to_datetime(df[order_date_col], errors='coerce')\n    df[vsd_col]        = pd.to_datetime(df[vsd_col], errors='coerce')\n    df = df.dropna(subset=[order_date_col, vsd_col])\n    return df\n\n# Hàm gắn nhãn trễ giao hàng\ndef assign_delay_label(df: pd.DataFrame,\n                       order_date_col: str = 'Order date',\n                       vsd_col: str = 'VSD',\n                       threshold: int = 7) -> pd.DataFrame:\n    \"\"\"\n    - Tính delay_days = VSD - Order date.\n    - Gắn nhãn: 1 nếu delay_days > ngưỡng, ngược lại là 0.\n    \"\"\"\n    df = df.copy()\n    df['delay_days'] = (df[vsd_col] - df[order_date_col]).dt.days\n    df['label']      = (df['delay_days'] > threshold).astype(int)\n    return df\n\n# Đọc dữ liệu từ thư mục đầu vào của Kaggle\ninput_path = '/kaggle/input/pilot-10/PILOT_10.csv'\ndf_raw = pd.read_csv(input_path)\n\n# Kiểm tra trùng lặp ID trong dữ liệu gốc\nif df_raw['ID'].duplicated().any():\n    print(\"Cảnh báo: Tìm thấy ID trùng lặp trong dữ liệu đầu vào.\")\nelse:\n    print(\"Tất cả ID trong dữ liệu đầu vào là duy nhất.\")\n\n# Tiền xử lý và gắn nhãn dữ liệu\ndf_clean = preprocess_data(df_raw, order_date_col='Order date', vsd_col='VSD')\nprint(f\"Số hàng sau khi tiền xử lý: {len(df_clean)}\")\n\ndf_labeled = assign_delay_label(df_clean, order_date_col='Order date', vsd_col='VSD', threshold=7)\n\n# Chuẩn bị DataFrame đầu ra với cột 'ID' duy nhất\nout = pd.DataFrame({\n    'ID': df_labeled['ID'],  # Sử dụng cột 'ID' duy nhất\n    'label': df_labeled['label']\n})\n\n# Kiểm tra trùng lặp ID trong đầu ra\nif out['ID'].duplicated().any():\n    print(\"Cảnh báo: Tìm thấy ID trùng lặp sau khi xử lý.\")\nelse:\n    print(\"Không có ID trùng lặp sau khi xử lý.\")\n\n# Kiểm tra số hàng\nexpected_rows = 125516\nif len(out) != expected_rows:\n    print(f\"Lỗi: Đầu ra có {len(out)} hàng, kỳ vọng là {expected_rows}.\")\nelse:\n    print(f\"Đầu ra có {len(out)} hàng - khớp với yêu cầu.\")\n\n# Lưu file đầu ra vào thư mục làm việc của Kaggle\noutput_path = '/kaggle/working/PILOT_10_labeled.csv'\nout.to_csv(output_path, index=False)\nprint(f\"File đã được lưu: {output_path}\")\n\n\n# Hiển thị vài hàng đầu tiên để kiểm tra\nprint(out.head())","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-06-16T18:41:11.327251Z","iopub.execute_input":"2025-06-16T18:41:11.328152Z","iopub.status.idle":"2025-06-16T18:41:16.457977Z","shell.execute_reply.started":"2025-06-16T18:41:11.328120Z","shell.execute_reply":"2025-06-16T18:41:16.456921Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from IPython.display import FileLink, display\ndisplay(FileLink('PILOT_10_labeled.csv'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-16T18:41:55.809941Z","iopub.execute_input":"2025-06-16T18:41:55.810335Z","iopub.status.idle":"2025-06-16T18:41:55.817443Z","shell.execute_reply.started":"2025-06-16T18:41:55.810298Z","shell.execute_reply":"2025-06-16T18:41:55.816476Z"}},"outputs":[],"execution_count":null}]}