Lập trình
xử lý dữ liệu

Học kì 1, năm học 2026–2027

Viện Trí tuệ nhân tạo, Trường ĐH Công nghệ, ĐHQGHN

Bài 2
Python cơ bản
cho xử lý dữ liệu

Ôn nhanh Python theo nhu cầu xử lý dữ liệu.

Bài trước

  • Bức tranh môn học: pipeline từ dữ liệu thô đến kết luận.
  • Chính sách AI: 🚫 đóng / ✅ mở, ba trách nhiệm khi dùng AI.

Bạn đã học Python ở Tư duy tính toán — bài này không học lại, mà xem phần nào của Python phục vụ trực tiếp việc xử lý dữ liệu.

Tổng quan

  1. Kiểu dữ liệu trong xử lý dữ liệu
  2. Vòng lặp & comprehension
  3. Hàm — đơn vị của pipeline
  4. Đọc & ghi file
  5. Làm việc với AI thì sao?

1.
Kiểu dữ liệu

Mỗi ô trong một bảng dữ liệu là một giá trị Python — kiểu của nó quyết định bạn làm được gì.

Số và chuỗi: định dạng

Người đọc báo cáo cần số đọc được — f-string là công cụ tiêu chuẩn:

Hai đuôi định dạng đáng nhớ: :,.0f (phân cách nghìn) và :.1% (phần trăm).

None là một giá trị

Quan trọng None ≠ 0 ≠ "".
"Thiếu" là thông tin, không phải số không. Toàn bộ bài 10 (missing values) sẽ dựa trên tính chất quan trọng này.

list: dãy có thứ tự — Slicing: cắt lát

Cú pháp lát cắt [bắt_đầu:kết_thúc] cũng được dùng trong NumPy và pandas.

dict: "dòng dữ liệu"

Trong Python thuần, một bảng dữ liệu có thể được biểu diễn bằng một list các dict. Từ bài 4, DataFrame sẽ cung cấp các thao tác thuận tiện hơn.

set: khử trùng lặp và so khớp

Hai snapshot dữ liệu — phòng nào biến mất?

Phép trừ, giao (&), hợp (|) trên set là cách trực tiếp để so sánh hai danh sách ID.

Chọn cấu trúc nào?

Bạn cần… Dùng Ví dụ trong môn
dãy có thứ tự, lát cắt list giá 7 ngày liên tiếp
tra cứu theo tên/khoá dict một dòng dữ liệu, cấu hình pipeline
khử trùng, so thành viên set so ID giữa hai snapshot
bộ giá trị không đổi tuple toạ độ (lat, lon)

2.
Vòng lặp & comprehension

Tư duy "biến đổi cả dãy" — bước đệm sang NumPy.

for + if: lọc dữ liệu thủ công

Comprehension: lặp&lọc trên 1 dòng

Cách đọc: "lấy g cho mỗi g trong dãy, nếu…". Câu lệnh ngắn hơn, ít chỗ sai hơn — và đúng cách tư duy trong NumPy: thao tác trên cả dãy, không trên từng phần tử.

dict comprehension & zip

zip ghép hai dãy song song thành từng cặp; thao tác này thường được dùng khi ghép cột.

Cạm bẫy 1: gán không phải là sao chép

Cẩn thận Muốn có bản sao độc lập, dùng ban_sao = goc.copy(). Lỗi một biến thay đổi ngoài ý muốn có cùng nguyên nhân với vấn đề view vs copy trong pandas.

Khi nào dừng viết vòng lặp?

  • Lọc/biến đổi đơn giản → comprehension.
  • Dữ liệu số, cùng kiểu, hàng nghìn dòng trở lên → bài sau: NumPy xử lý cả dãy bằng một lệnh, nhanh hơn hàng chục lần.
Quan trọng Trong môn này, thấy mình viết for qua từng dòng dữ liệu là tín hiệu để dừng lại và hỏi: "có công cụ cả-dãy nào làm được việc này không?"

3.
Hàm — đơn vị của pipeline

Mỗi bước xử lý là một hàm nhỏ, gọi được, thử được.

Đóng gói một bước làm sạch

Còn nhớ cột giá "$45,647.00" của Airbnb? Ta viết một hàm để làm sạch chuỗi này:

Viết hàm tốt trong pipeline dữ liệu

  • Chỉ làm một việc: thể hiện trực tiếp trong tên hàm (clean_price, không phải xu_ly).
  • Đoán được: cùng đầu vào → cùng đầu ra; không sửa lén biến ngoài.
  • Chịu được dữ liệu bẩn: nói rõ dữ liệu không hợp lệ sẽ trả về gì (None hay phát sinh lỗi).

Docstring một dòng + type hint nhẹ (def clean_price(s) -> float | None) là đủ.

try/except: dữ liệu không hợp lệ phát sinh lỗi

Cẩn thận Bắt đúng loại lỗi (except ValueError). Kiểu except Exception: pass che khuất mọi loại lỗi, kể cả lỗi lập trình, nên pipeline có thể trả kết quả sai mà không báo lỗi.

Hàm là giá trị: truyền được như mọi dữ liệu khác

Truyền hàm vào hàm khác — mẫu này sẽ xuất hiện lại ở bài 5: df["price"].map(clean_price).

lambda: hàm nhỏ dùng một lần

Quy ước chung: lambda chỉ nên dài một dòng; dài hơn thì viết hàm có tên bằng def.

Vì sao code dữ liệu nhiều dấu chấm?

  • Mọi giá trị Python là đối tượng — mang theo phương thức của nó: "abc".upper(), [1,2].append(3).
  • Hãy đọc df.groupby("city").mean() như một chuỗi lời gọi phương thức nối tiếp nhau.

Cách tự viết lớp (class/OOP) xem ở mục Tự học cuối bài.

Module: gom hàm để dùng lại

📖 Tự học
  • import math · from pathlib import Path — dùng thư viện có sẵn.
  • Tự viết cleaning.py chứa các hàm làm sạch → from cleaning import clean_price — cấu trúc src/ của bài tập lớn sẽ giống vậy.

4.
Đọc & ghi file

Dữ liệu thường nằm trong file và pipeline phải tự đọc dữ liệu đầu vào.

with open: đọc văn bản an toàn

  • with tự đóng file, kể cả khi có lỗi giữa chừng.
  • encoding="utf-8" phải luôn ghi rõ — tiếng Việt vỡ chữ đa số do quên tham số này.

CSV thủ công

Để ý: mọi giá trị đều là chuỗi, kể cả id và giá. CSV không lưu kiểu dữ liệu; chương trình đọc phải tự chuyển kiểu. Từ bài 4, pandas sẽ tự suy luận kiểu dữ liệu và đôi khi có thể suy luận sai.

JSON: trao đổi dict giữa các chương trình

JSON và dict/list có cấu trúc tương ứng gần như trực tiếp. JSON là định dạng thường dùng cho API (bài 6) và dữ liệu lưu tạm của LLM (bài 11).

pathlib: xử lý đường dẫn

Đường dẫn được nối bằng / và hoạt động nhất quán trên các hệ điều hành phổ biến. Có thể dùng công cụ này để tạo cấu trúc data/raw/<city>/.

Tổng kết

  • None là dữ liệu thiếu; list/dict/set — mỗi thứ một việc.
  • Comprehension = tư duy biến đổi cả dãy — cửa ngõ vào NumPy bài sau.
  • Pipeline = chuỗi hàm nhỏ chịu được dữ liệu bẩn (try/except đúng loại lỗi).
  • File: with + encoding="utf-8"; CSV không mang kiểu, JSON ↔ dict.

Làm việc với AI thì sao?

🤖 Làm việc với AI
AI làm tốt Tạo nhanh các hàm tiện ích cho thao tác chuẩn, chẳng hạn clean_price.
AI hay sai Hay dùng except Exception: pass để code "chạy được"; hay quên encoding; code đúng với ví dụ bạn đưa nhưng sai với ca lạ (giá âm, chuỗi rỗng…).

Kiểm chứng thế nào?

🤖 Làm việc với AI
  • Đưa hàm AI viết qua bộ ca thử tự nghĩ: giá trị bình thường, rỗng, None, âm, sai định dạng.
  • Yêu cầu AI liệt kê các đầu vào có thể làm hàm sai, sau đó tự kiểm tra từng trường hợp.

Đọc thêm

  • McKinney, Python for Data Analysis, 3rd ed. — ch. 2–3 (Python built-ins).
  • 📖 Tự học OOP: Official Python Tutorial, mục Classes — cần khi đọc code thư viện, chưa cần để dùng pandas.