python-043Đọc toàn bộ đề miễn phí

Pipeline Điền Khuyết Dữ liệu Cảm biến với Cờ Chỉ báo Missing Indicator

Trong hệ thống giám sát IoT công nghiệp, các cảm biến gửi dữ liệu đo đạc (nhiệt độ, áp suất, độ rung) định kỳ. Tuy nhiên, sự cố mất mạng có thể gây ra hiện tượng khuyết dữ liệu (Na…

PythonTrung bình25 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

pandasdata cleaningmissing dataffillgroup medianimputation

Kiến thức tiên quyết: dataframe copy, groupby transform, isna mask, ffill limit.

Nội dung đề bài

Mục tiêu kiến thức

  • Áp dụng kỹ thuật điền tiến (ffill) có giới hạn (limit) theo từng nhóm thiết bị để tránh truyền bá dữ liệu cũ quá xa.
  • Kết hợp điền bù giá trị trung vị nội nhóm (group-wise median) cho các khoảng khuyết vượt quá ngưỡng limit hoặc khuyết ở đầu chuỗi.
  • Sinh cờ nhị phân (Missing Indicator Feature) phục vụ các mô hình Machine Learning phát hiện sự cố cảm biến.
  • Đảm bảo tính bất biến (Immutability): không làm biến đổi DataFrame gốc.

Mô tả bài toán

Trong hệ thống giám sát IoT công nghiệp, các cảm biến gửi dữ liệu đo đạc (nhiệt độ, áp suất, độ rung) định kỳ. Tuy nhiên, sự cố mất mạng có thể gây ra hiện tượng khuyết dữ liệu (NaN). Trong kỹ thuật Feature Engineering cho AI, việc chỉ đơn giản điền 0 hoặc trung bình toàn cục sẽ làm méo mó tín hiệu.

Hãy viết hàm: impute_sensor_timeseries(df: pd.DataFrame, group_col: str, metric_cols: list[str], max_ffill_gap: int = 2) -> pd.DataFrame

Yêu cầu thực hiện:

  • Kiểm tra đầu vào:
  • df phải chứa cột group_col và toàn bộ các cột trong metric_cols. Nếu thiếu bất kỳ cột nào, ném ngoại lệ ValueError("Missing required columns").
  • max_ffill_gap phải là số nguyên ≥ 1. Nếu không, ném ValueError("max_ffill_gap must be >= 1").
  • Khởi tạo bản sao:
  • Tạo bản sao sâu clean_df = df.copy() để tuyệt đối không làm thay đổi df gốc.
  • Điền khuyết cho từng cột số liệu (metric_cols):
  • Tạo cột boolean đánh dấu: clean_df[f"{col}_was_missing"] = clean_df[col].isna() TRƯỚC KHI thực hiện bất kỳ thao tác điền nào.
  • Nhóm theo group_col, áp dụng phương thức ffill(limit=max_ffill_gap) cho từng nhóm:

clean_df[col] = clean_df.groupby(group_col)[col].ffill(limit=max_ffill_gap)

  • Với những ô vẫn còn NaN (ví dụ: khuyết ngay tại điểm đầu tiên của cảm biến, hoặc khoảng khuyết dài hơn max_ffill_gap), điền bằng giá trị Trung vị (Median) của nhóm thiết bị đó:

group_median = clean_df.groupby(group_col)[col].transform('median') clean_df[col] = clean_df[col].fillna(group_median)

  • Nếu toàn bộ một nhóm cảm biến không có bất kỳ giá trị hợp lệ nào (khiến trung vị vẫn là NaN), điền giá trị an toàn cuối cùng là 0.0.
  • Đầu ra:
  • Trả về clean_df đã được điền khuyết hoàn toàn không còn NaN ở các metric_cols.

Input

  • Các tham số truyền vào hàm/lớp impute_sensor_timeseries hoặc dữ liệu đầu vào theo định dạng mô tả.

Output

  • Kết quả trả về của hàm/lớp impute_sensor_timeseries hoặc dữ liệu in ra màn hình theo đúng đặc tả.

Ràng buộc

  • Số dòng dữ liệu: 1 ≤ N ≤ 105.
  • metric_cols chứa từ 1 đến 10 tên cột.
  • df gốc không được thay đổi (Kiểm tra nghiêm ngặt df.equals(original_df)).

Ví dụ 1

Input

impute_sensor_timeseries(data=[{'device': 'D1', 'temp': 20.0, 'vibe': None}, {'device': 'D1', 'temp': None, 'vibe': 1.0}, {'device': 'D1', 'temp': 22.0, 'vibe': 1.2}, {'device': 'D2', 'temp': 10.0, 'vibe': 2.0}, {'device': 'D2', 'temp': None, 'vibe': 2.1}, {'device': 'D2', 'temp': None, 'vibe': 2.2}, {'device': 'D2', 'temp': None, 'vibe': 2.3}, {'device': 'D2', 'temp': 40.0, 'vibe': 2.4}], group_col='device', metric_cols=['temp', 'vibe'], max_ffill_gap=2)

Output

{'temp': [20.0, 20.0, 22.0, 10.0, 10.0, 10.0, 25.0, 40.0], 'vibe': [1.1, 1.0, 1.2, 2.0, 2.1, 2.2, 2.3, 2.4]}

Giải thích

Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.

Ví dụ 2

Input

impute_sensor_timeseries(data=[{'device': 'A', 'val': None}, {'device': 'A', 'val': 10.0}, {'device': 'A', 'val': 20.0}], group_col='device', metric_cols=['val'], max_ffill_gap=1)

Output

{'val': [15.0, 10.0, 20.0]}

Giải thích

Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.