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…
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ủ đề
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ưỡnglimithoặ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:
dfphải chứa cộtgroup_colvà toàn bộ các cột trongmetric_cols. Nếu thiếu bất kỳ cột nào, ném ngoại lệValueError("Missing required columns").max_ffill_gapphải là số nguyên ≥ 1. Nếu không, némValueError("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 đổidfgố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ứcffill(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ơnmax_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ònNaNở cácmetric_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_colschứa từ 1 đến 10 tên cột.dfgốc không được thay đổi (Kiểm tra nghiêm ngặtdf.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ế.
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.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
