Các hàm Excel 365

Ngày tạo 24/05/2022

 -  3.813 Lượt xem

 

Lập kế hoạch nguyên vật liệu (MRP - Material Requirement Planning) là một trong những hoạt động quan trọng trong quản lý sản xuất - kinh doanh ở các doanh nghiệp. MRP cung cấp cho doanh nghiệp dữ liệu về số lượng tồn kho cần thiết để đáp ứng nhu cầu sản xuất - kinh doanh nhưng phải giữ mức tồn kho tối ưu, không cần giữ quá nhiều nhưng khi cần là phải có để đáp ứng cho nhu cầu. Hiểu một cách đơn giản, MRP tính toán lượng nguyên vật liệu cần thiết để đáp ứng đơn hàng của khách hàng đầy đủ và đúng thời điểm. Do đó, MRP không bị giới hạn trong phạm vi quản lý sản xuất mà còn được hiểu để áp dụng rộng hơn cho những lĩnh vực kinh doanh như Trading, Retail, …

 

1. Logic

Ta có mẩu dữ liệu Demand (nhu cầu) và Supply (cung ứng) như sau của công ty Sản xuất xe đạp (data thật nhưng đã được mã hoá tên hàng)

Giả định bài toán:

- Lượng nguyên vật liệu được đưa vào sản xuất tuân theo nguyên tắc FIFO (First In First Out)

- Chưa tính tới yếu tố Hạn sử dụng của nguyên vật liệu

- Ngày tính toán: Ngày hôm nay (Today) - thời điểm trước 28/03

 

Phân tích mẩu dữ liệu:

- Ngày 30/03 cần có 02 phụ kiện A, và Stock on hand (bằng 10) có thể đáp ứng được.

- Ngày 31/03 cần có 05 phụ kiện A. Đến ngày 31/03, tổng số demand lũy kế đạt 7 (2+5=7). Do đó, Stock on hand (bằng 10) vẫn có thể đáp ứng được demand từ 30/03 đến 31/03. 

- Ngày 01/04 cần có 06 phụ kiện A. Đến ngày 01/04, tổng số demand lũy kế đạt 13 (7+6=13). Khi này, Stock on hand (bằng 10) không thể đáp ứng hết demand từ 30/03 đến 01/04. Do đó, Supply Lot ngày 28/03 sẽ được sử dụng đến (lũy kế supply của 2 lô Stock on hand và lô 28/03 đạt 10+7=17)

- Ngày 02/04 cần có 02 phụ kiện A. Đến ngày 02/04, tổng số demand lũy kế đạt 15 (13+2=15). Khi này, Supply Lot ngày 28/03 vẫn còn đủ để đáp ứng (lũy kế supply của 2 lô Stock on hand và lô 28/03 đạt 10+7=17).

- Ngày 03/04 cần có 04 phụ kiện A. Đến ngày 03/04, tổng số demand lũy kế đạt 19 (15+4=19). Khi này, Supply Lot ngày 28/03 không thể đáp ứng hết demand đến ngày 03/04. Do đó, cần sử dụng đến Supply Lot tiếp theo.

Tuy nhiên, Supply Lot tiếp theo đến vào ngày 04/04, tức là ngày 03/04, tồn kho nguyên vật liệu không đủ để đáp ứng cho sản xuất.

 

Dựa vào phân tích trên, ERX đề xuất logic tính toán cho bài toán này: tính lũy kế Demand và Supply, sau đó chọn mức lũy kế Supply đầu tiên đáp ứng được từng mức lũy kế Demand, từ đó căn cứ vào thời gian hàng về mà xác định thời điểm tồn kho nguyên vật liệu không đủ đáp ứng cho Demand.

 

2. Dữ liệu bài toán

 

3. Ứng dụng Python

Bạn đọc tải file Excel dữ liệu tại đây. ERX gợi ý bạn đọc dùng JupyterLab từ nền tảng của Anaconda để thực hiện viết Python theo hướng dẫn bên dưới.

 

3.1. Bước 1: Import thư viện Pandas

 

3.2. Bước 2: Đọc dữ liệu

3.2.1. Đọc dữ liệu Demand

Với câu lệnh pd.read_excel, dữ liệu trả về dưới dạng DataFrame. Cụ thể df_demand là bảng dữ liệu Demand được trả về dưới dạng DataFrame (thường được viết thành ‘df’ khi đặt biến)

Dữ liệu Demand có thêm một cột phụ là Job_No (cột B). Vì ta không có nhu cầu sử dụng đến cột B nên ta sẽ không lấy cột này, thay vào đó, chỉ lấy các cột A, C và D (sử dụng tham số ‘usecols’). 

Sử dụng tham số ‘sheet_name’ để chỉ định trang dữ liệu muốn đọc/lấy.

 

3.2.2. Đọc dữ liệu Supply

Trong dữ liệu Supply, có dòng đầu tiên được sử dụng như gợi ý nội dung của bảng (Estimated time of arrival) và ta không muốn lấy dòng này vào dữ liệu đọc. Do đó, ta sử dụng tham số ‘header’ để chỉ định dòng đầu tiên mà pandas sẽ đọc trong dữ liệu Supply.

Trong Python, chỉ số (index) dòng đầu tiên của bảng là 0. Do đó, để bỏ qua dòng đầu tiên và bắt đầu đọc từ dòng thứ hai, đặt tham số ‘header’ bằng 1.

 

3.3. Bước 3: Tính lũy kế Demand

Trước khi tính lũy kế Demand, ta cần sắp xếp lại dữ liệu theo 2 trường dữ liệu ‘Part_No’ và ‘Job start date’ với câu lệnh df.sort_values.

Sau đó, tạo thêm cột Lũy kế Demand (đặt tên là ‘cumsum_demand’). Để làm được điều đó, sử dụng câu lệnh 

Câu lệnh trên sẽ tính giá trị tích lũy của ‘col2’, group dữ liệu theo ‘col1’ và hiển thị dữ liệu này trong cột ‘cumsum_col’.

 

 

3.4. Bước 4: Unpivot dữ liệu Supply

Tại bước này, thực hiện những câu lệnh sau:

- Đổi tên cột ‘Stock on hand’ thành 1 ngày cụ thể (có thể là ngày hôm nay hoặc một ngày trong quá khứ)

- Unpivot dữ liệu Supply và sắp xếp lại dữ liệu: 

Sử dụng câu lệnh df.melt, đặt tham số ‘id_vars’ để không chuyển “Part_No” thành hàng, và lần lượt đặt tên cho 2 cột không định danh

> Cột sau khi Unpivot dòng 2000-01-01…2022-03-28…: đặt tên là “supply_week” tại tham số ‘var_name’

> Cột sau khi Unpivot dữ liệu supply quantity theo ‘id_vars’‘var_name’: đặt tên là “value_name” tại tham số ‘value_name’

- Tính lũy kế Supply: tương tự với cách tính lũy kế Demand

 

3.4. Bước 4: Join dữ liệu bảng Demand và Supply

Sử dụng câu lệnh df.merge:

Ở bước này, chỉ cần sử dụng đến 3 tham số:

- Right_df: là bảng bên phải, cần ghép với bảng bên trái (dataframe). Trong trường hợp này, bảng bên trái là df_demand (bảng dữ liệu demand đã cumsum) và bảng bên phải là df_supply_melted (bảng dữ liệu supply đã unpivot và cumsum)

- How: là kiểu ghép dữ liệu. Trong trường hợp này, ta không quy định kiểu ghép nên mặc định sẽ là kiểu “Inner”. Tại tham số này, không cần lo lắng nếu có Part_No nào đó có dữ liệu trong bảng Demand mà không có trong bảng Supply vì ở bước cuối sẽ xử lý chuyện này.

- On: là cột chung để ghép hai bảng dữ liệu lại với nhau. Trong trường hợp này, tham số ‘on’ là “Part_No” (cột này có ở cả 2 bảng dữ liệu)

 

3.5. Bước 5: Chọn supply week đầu tiên đáp ứng demand

- Bỏ các dòng mà tại đó cumsum_supply < cumsum_demand

- Trong số những dòng dữ liệu được giữ lại, với mỗi Part_No, hoàn toàn có khả năng có trên 2 Supply Lot có thể đáp ứng được demand (vì ta đang giữ lại cumsum_supply > cumsum_demand). Do đó, ta chỉ lấy dòng Supply đầu tiên đáp ứng được Demand.

- Giữ lại những cột cần thiết cho bảng dữ liệu.

 

Trong những thao tác trên, ERX giới thiệu bạn dòng code sau:

Dòng code trên sẽ lấy dòng dữ liệu đầu tiên của mỗi grouped value theo “col1” và “col2”.

 

3.6. Bước 6: Lấy lại những dòng không có Demand hoặc Supply

- Với dữ liệu vừa lấy được ở bước 5 (df_first_supply), thực hiện ghép với bảng dữ liệu Demand (df_demand - đã cumsum nhưng chưa ghép với dữ liệu Supply). Trong đó, bảng bên trái là df_first_supply, bảng bên phải là df_demand, kiểu ghép là ‘right’ (tức là lấy tất cả các dòng có trong dữ liệu df_demand).

Ở câu lệnh bên dưới, không quy định tham số ‘on’ nên Python sẽ tự động tìm kiếm các cột giống nhau để làm cột chung ghép dữ liệu.

 

- Tính số ngày chênh lệch giữ ngày hàng về (Supply week) và ngày cần hàng (Job start date)

Late_date = Supply_week - Job start date

Nếu Late_date > 0 hoặc Late_date trả về giá trị rỗng (do Supply_week rỗng) thì khi này tồn kho nguyên vật liệu không đủ để sử dụng.

 

3.7. Bước 7: Xuất dữ liệu ra Excel

 

Như vậy, với khoảng 20 dòng code bên trên, ERX đã mang đến cho bạn hướng tiếp cận một phần của bài toán MRP với ngôn ngữ Python. Với bài toán trên, thực tế ta có thể gặp nhiều loại format bảng dữ liệu khác nhau, ví dụ, bảng dữ liệu Demand (sau khi nhân BOM) được xuất ra có sẵn cột Stock on hand (nhưng cột Stock on hand sẽ được lặp lại qua mỗi dòng Demand của từng Part_No), khi này cần thêm một vài bước để biến đổi dữ liệu trước khi thực hiện theo logic tính toán bên trên.
 

Tại ERX, Trung tâm đã hướng dẫn học viên giải bài toán trên. Trước khi áp dụng Python, mỗi bạn Supply Planner mất 10 tiếng mỗi tuần để tính toán - theo dõi MRP, và team có 15 bạn. Khi áp dụng Python, thời gian giảm xuống tính bằng ‘giây’, nên nhìn chung, mỗi bạn Supply Planner trong team hoàn toàn có thể tiết kiệm được 10 tiếng mỗi tuần (tương đương 15*10*52 = 7,800 tiếng mỗi năm). 

 

Nếu trung bình mức lương của mỗi bạn Supply Planner là 50,000/tiếng, thì giải pháp này đã giúp tiết kiệm 390,000,000đ mỗi năm.

Nếu trung bình mức lương của mỗi bạn Supply Planner là 100,000/tiếng, thì giải pháp này đã giúp tiết kiệm 780,000,000đ mỗi năm.

 

Phương pháp trên đã trả lời cho câu hỏi, khi nào thì tồn kho nguyên vật liệu không thể đáp ứng được nhu cầu sử dụng nữa. Kết quả trên sẽ giúp bạn nhận biết nhanh hơn trong những trường hợp như nhu cầu thay đổi sẽ làm ảnh hưởng đến số lượng cung ứng của nguyên vật liệu như thế nào. Bên cạnh câu hỏi về “When”, bài toán MRP còn rất nhiều câu hỏi cần được tìm hiểu tiếp và giải quyết nhanh gọn hơn bằng Python, cụ thể, cần số lượng bao nhiêu, khi nào đặt hàng, sẽ ra sao khi tính đến hạn sử dụng của nguyên vật liệu, … 

 

Hy vọng với bài viết này, bạn đọc có thể biết thêm về logic tính toán và tiếp tục tìm hiểu, xây dựng cho mình công cụ tính toán MRP nhanh hơn với ngôn ngữ Python.

 

Nguyễn Thế Anh

Technology. Supply Chain. Automation.

https://www.linkedin.com/in/anhng151/

Python ERX

Lê Ngọc Phương Trinh

Enthusiast of Supply Chain, Data Analysis & Storytelling, Automation

https://www.linkedin.com/in/kayleetrinh99/

Python ERX

 

 
 
Gọi (028) 3514 2046