Kiến thức cơ bản NumPy & Pandas

Nội dung

    Đây là một giải thích dễ hiểu và tập trung về NumPy và Pandas. Nhiều người có thể sử dụng NumPy và Pandas. Tuy nhiên, chỉ một số ít thực sự hiểu chúng. Đây là lý do tại sao nhiều người gặp khó khăn trong các cuộc phỏng vấn ML. Điều này không phải vì NumPy/Pandas khó. Mà là vì chưa có ai giải thích chúng một cách dễ nhớ.

    Bài viết này sẽ khắc phục điều đó. Bạn sẽ hiểu được lý do tồn tại, cách hoạt động, các trường hợp sử dụng thực tế. Bạn cũng sẽ biết các mẫu mã hóa cần thiết cho các vai trò ML/Khoa học dữ liệu. Hãy bắt đầu.

    1. NUMPY

    Lý do NumPy tồn tại (Câu chuyện ít được kể)

    Hãy tưởng tượng lưu trữ một triệu số trong một danh sách Python.

    Một danh sách Python có những hạn chế sau:

    • Nó lưu trữ các số rải rác trong bộ nhớ, không liên tục.
    • Mỗi số là một đối tượng Python.
    • Mỗi đối tượng có siêu dữ liệu, gây ra chi phí chung.
    • Các thao tác diễn ra từng phần tử một, dẫn đến tốc độ chậm.

    Ví dụ, bạn muốn cộng 10 vào mỗi số. Nếu bạn chạy đoạn mã sau:

    for i in range(len(arr)):
        arr[i] += 10

    Python sẽ lặp lại một triệu lần. Điều này rất chậm.

    NumPy khắc phục tất cả những vấn đề này.

    Các mảng NumPy có những ưu điểm sau:

    1. Chúng lưu trữ các số trong bộ nhớ liên tục.
    2. Tất cả các số có cùng kiểu dữ liệu, không có chi phí chung.
    3. Các thao tác được thực hiện bằng mã C nhanh.
    4. Các thao tác trên mảng được “vector hóa”. Một dòng mã có thể thực hiện một triệu thao tác.

    Đây là lý do tại sao NumPy là nền tảng cho:

    • TensorFlow
    • PyTorch
    • Scikit-Learn

    Tạo mảng NumPy (3 hàm bạn sẽ sử dụng mãi mãi)

    Bạn cần nhập thư viện NumPy:

    import numpy as np

    Các hàm chính để tạo mảng là:

    • a = np.array([1, 2, 3]): Tạo một mảng cơ bản thủ công.
    • b = np.arange(5): Tạo một mảng với các số từ 0 đến 4.
    • c = np.linspace(0, 1, 5): Tạo 5 số cách đều nhau giữa 0 và 1.

    Hãy hiểu rõ các hàm này:

    • np.array: Dùng để tạo mảng thủ công.
    • np.arange(n): Tạo các số từ 0 đến n-1.
    • np.linspace(start, end, count): Tạo các số cách đều nhau giữa ‘start’ và ‘end’, với ‘count’ phần tử.

    Hình dạng (Shape), Kích thước (Size), Chiều (Dimensions)

    Xem xét một mảng ví dụ:

    arr = np.array([[1,2,3],
                    [4,5,6]])

    Các thuộc tính của mảng bao gồm:

    • print(arr.shape): Trả về (2, 3). Đây là số hàng nhân số cột.
    • print(arr.ndim): Trả về 2. Đây là số chiều của mảng.
    • print(arr.size): Trả về 6. Đây là tổng số phần tử trong mảng.

    Tóm tắt:

    • shape: Biểu thị số hàng và số cột.
    • ndim: Biểu thị số chiều.
    • size: Biểu thị tổng số phần tử.

    Cắt và Lấy chỉ mục (Indexing & Slicing)

    Đối với mảng 1D:

    arr = np.array([10,20,30,40,50])
    print(arr[0])      # Kết quả là 10
    print(arr[1:4])    # Kết quả là [20 30 40]

    Đối với mảng 2D (cắt):

    mat[:, 1]      # Lấy toàn bộ cột thứ 2
    mat[1:, :2]    # Lấy một ma trận con (từ hàng thứ 2 trở đi, 2 cột đầu tiên)

    Cắt mảng NumPy hoạt động theo cú pháp: hàng, cột.

    Các phép toán Vector hóa – Phép màu thực sự của NumPy

    Các phép toán vector hóa cho phép thực hiện các phép tính trên toàn bộ mảng một cách hiệu quả.

    a = np.array([1,2,3])
    b = np.array([4,5,6])
    
    a + b        # Kết quả là [5 7 9] (cộng từng phần tử)
    a * b        # Kết quả là [4 10 18] (nhân từng phần tử)
    np.sqrt(a)   # Kết quả là [1.   1.41 1.73] (căn bậc hai từng phần tử)

    Tại sao vector hóa lại mạnh mẽ?

    Vì một phép toán như a + 10. Nó sử dụng các vòng lặp C được tối ưu hóa bên trong. Nó không sử dụng các vòng lặp Python chậm.

    Các ứng dụng thực tế trong ML:

    • Mở rộng đặc trưng (feature scaling).
    • Phép nhân ma trận.

    Thay đổi hình dạng (Reshaping) – Quan trọng nhất cho ML

    Mỗi mô hình ML đều sử dụng mảng 2D.

    Ví dụ thay đổi hình dạng:

    arr = np.arange(12)
    arr.reshape(3,4)

    Lệnh này tạo ra một ma trận 3×4 từ mảng 1D có 12 phần tử.

    Thay đổi hình dạng không bao giờ thay đổi dữ liệu gốc. Nó chỉ thay đổi cách nhìn dữ liệu.

    Thay đổi hình dạng chỉ hoạt động nếu tổng số phần tử khớp với hình dạng mới.

    Các phép tổng hợp (Aggregations)

    Các hàm tổng hợp phổ biến bao gồm:

    • a.sum(): Tính tổng tất cả các phần tử.
    • a.mean(): Tính giá trị trung bình.
    • a.max(): Tìm giá trị lớn nhất.
    • a.min(): Tìm giá trị nhỏ nhất.

    Các phép toán này được sử dụng hàng ngày cho:

    • Tiền xử lý dữ liệu (pre-processing).
    • Kỹ thuật đặc trưng (feature engineering).

    CÂU HỎI PHỎNG VẤN VỀ NUMPY

    Q1: Tại sao mảng NumPy nhanh hơn danh sách Python?

    • Bộ nhớ liên tục.
    • Kiểu dữ liệu đơn nhất.
    • Các phép toán vector hóa.
    • Sử dụng mã C ở phía sau.

    Q2: Broadcasting là gì?

    a = np.array([1,2,3])
    b = 5
    
    print(a + b)    # Kết quả là [6 7 8]

    NumPy tự động mở rộng các mảng nhỏ hơn để khớp với kích thước của mảng lớn hơn trong các phép toán.

    Q3: Làm thế nào để tìm các giá trị duy nhất?

    np.unique(arr)

    Q4: Làm thế nào để xử lý các giá trị NaN (Not a Number)?

    np.isnan(arr)       # Kiểm tra các giá trị NaN
    np.nan_to_num(arr)  # Chuyển đổi NaN thành số (ví dụ: 0)

    2. PANDAS

    Lý do Pandas tồn tại

    NumPy rất tuyệt vời cho các phép toán số học.

    Tuy nhiên, dữ liệu thực tế thường lộn xộn. Nó có thể bao gồm:

    • Các giá trị bị thiếu.
    • Các cột phân loại.
    • Dữ liệu ngày tháng.
    • Các bản ghi trùng lặp.
    • Nhu cầu về các thao tác giống SQL.

    NumPy không thể xử lý tốt những vấn đề này.

    Vì vậy, Pandas đã được tạo ra.

    Pandas là sự kết hợp của Excel, SQL và NumPy trong Python.

    Hiểu về Pandas: DataFrame & Series

    • Series: Là một cột dữ liệu duy nhất.
    • DataFrame: Là một bảng dữ liệu.

    Ví dụ tạo DataFrame:

    import pandas as pd
    
    df = pd.DataFrame({
        "name": ["A", "B", "C"],
        "age": [20, 25, 30]
    })

    Kiểm tra dữ liệu (Sử dụng hàng ngày)

    Các hàm sau được sử dụng để hiểu dữ liệu của bạn:

    • df.head(): Hiển thị 5 hàng đầu tiên.
    • df.tail(): Hiển thị 5 hàng cuối cùng.
    • df.info(): Cung cấp tóm tắt về DataFrame, bao gồm kiểu dữ liệu và số lượng giá trị không null.
    • df.describe(): Tạo thống kê mô tả, bao gồm giá trị trung bình, độ lệch chuẩn, v.v.

    Mẹo phỏng vấn: Khi được hỏi “Làm thế nào để bạn hiểu một tập dữ liệu?”, hãy đề cập đến 4 hàm này.

    Chọn dữ liệu (Selecting Data)

    Để chọn dữ liệu:

    • Chọn một cột: df["age"]
    • Chọn nhiều cột: df[["name", "age"]]
    • Chọn hàng theo nhãn: df.loc[0]
    • Chọn hàng theo vị trí: df.iloc[0:2]

    Lọc hàng (Filtering Rows) – Thao tác phổ biến nhất

    Lọc hàng là một thao tác cơ bản:

    • Lọc theo một điều kiện: df[df["age"] > 25]
    • Lọc theo nhiều điều kiện: df[(df["age"] > 25) & (df["dept"] == "IT")]

    Đây là cách 90% việc làm sạch dữ liệu được thực hiện.

    Thêm, xóa cột

    Để thêm một cột mới:

    df["score"] = [90, 85, 88]

    Để xóa một cột:

    df.drop("score", axis=1)

    Groupby (Yêu thích trong phỏng vấn)

    Hàm groupby được sử dụng để nhóm dữ liệu dựa trên một hoặc nhiều cột.

    df.groupby("department")["salary"].mean()

    Sử dụng groupby để:

    • Tìm giá trị trung bình.
    • Đếm bản ghi.
    • Phân đoạn khách hàng.

    Merge / Join (Kỹ năng quan trọng nhất trong thế giới thực)

    Hợp nhất (merge) hoặc nối (join) các DataFrame là một kỹ năng thiết yếu.

    pd.merge(df1, df2, on="id")

    Tại sao nó quan trọng?

    Mọi công ty đều có nhiều bảng dữ liệu, ví dụ:

    • Khách hàng.
    • Giao dịch.
    • Nhật ký.

    Nối dữ liệu là công việc cốt lõi của bạn.

    CÂU HỎI PHỎNG VẤN VỀ PANDAS

    Q1: Sự khác biệt giữa lociloc?

    • loc: Lấy chỉ mục dựa trên nhãn.
    • iloc: Lấy chỉ mục dựa trên số chỉ mục.

    Q2: Làm thế nào để xử lý các giá trị bị thiếu?

    • df.isna(): Kiểm tra các giá trị bị thiếu.
    • df.dropna(): Xóa các hàng hoặc cột có giá trị bị thiếu.
    • df.fillna(df.mean()): Điền các giá trị bị thiếu bằng giá trị trung bình của cột.

    Q3: Tại sao Pandas đôi khi chậm?

    Vì các cột có thể chứa các đối tượng Python. Điều này chậm hơn so với NumPy, vốn sử dụng các kiểu dữ liệu cố định.

    CÁC TÁC VỤ MÃ HÓA THỰC TẾ

    Nếu bạn có thể giải quyết những tác vụ này, bạn đã sẵn sàng.

    Tác vụ 1: Thay thế các giá trị bị thiếu bằng giá trị trung bình của cột.

    df["age"] = df["age"].fillna(df["age"].mean())

    Tác vụ 2: Sắp xếp theo hai cột.

    df.sort_values(["age", "salary"], ascending=[True, False])

    Tác vụ 3: Đếm số hàng trong mỗi danh mục.

    df["department"].value_counts()

    Tác vụ 4: Chuyển đổi cột sang kiểu dữ liệu datetime.

    df["date"] = pd.to_datetime(df["date"])

    Tác vụ 5: Xóa các bản ghi trùng lặp.

    df.drop_duplicates()

    Điều cần ghi nhớ cuối cùng

    Nếu bạn quên nhiều điều, hãy nhớ điều này:

    NumPy = Toán học nhanh + Kiểu dữ liệu cố định + Mảng lớn.

    Được sử dụng cho:

    1. Các phép toán ML.
    2. Tiền xử lý dữ liệu.
    3. Các phép toán ma trận.

    Pandas = Bảng thông minh + Các thao tác giống SQL.

    Được sử dụng cho:

    1. Phân tích dữ liệu thăm dò (EDA).
    2. Làm sạch dữ liệu.
    3. Nối các tập dữ liệu.
    4. Kỹ thuật đặc trưng.

    Khi bạn thành thạo hai thư viện này, bạn sẽ tự động giỏi mã hóa ML, các cuộc phỏng vấn và các tác vụ khoa học dữ liệu.

     

    Tham khảo: medium.com

    Để lại một bình luận

    Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

    Chat with us
    Hello! How can I help you today?