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

Truy vấn Cắt lát Phân cấp MultiIndex & Tái cấu trúc Unstack

Một tập đoàn bán lẻ quản lý dữ liệu bán hàng dưới dạng DataFrame với MultiIndex 3 tầng trên trục dòng (Rows): ['Region', 'StoreType', 'Date']. Bảng chứa hai cột số liệu: 'revenue'…

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ủ đề

pandasmultiindexunstackcross sectionhierarchical indexing

Kiến thức tiên quyết: dataframe basics, multiindex levels, xs method, unstack reshaping.

Nội dung đề bài

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

  • Sử dụng phương thức cắt lát mặt cắt ngang DataFrame.xs() trên MultiIndex đa tầng với tham số level.
  • Chuyển đổi dữ liệu dạng dài (Long format) sang dạng rộng (Wide format) bằng unstack(), tạo ra MultiIndex trên trục cột.
  • Thao tác gán cột mới trên hệ thống cột đa cấp (MultiIndex columns) mà không làm mất cấu trúc phân tầng.

Mô tả bài toán

Một tập đoàn bán lẻ quản lý dữ liệu bán hàng dưới dạng DataFrame với MultiIndex 3 tầng trên trục dòng (Rows): ['Region', 'StoreType', 'Date']. Bảng chứa hai cột số liệu: 'revenue' (Doanh thu) và 'units_sold' (Số lượng bán).

Hãy viết hàm: analyze_hierarchical_sales(df: pd.DataFrame, region: str, fill_missing: float = 0.0) -> pd.DataFrame

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

  • Kiểm tra đầu vào:
  • df.index phải là pd.MultiIndex và chứa đủ 3 cấp: 'Region', 'StoreType', 'Date'. Nếu không, ném ValueError("Index must have Region, StoreType, Date levels").
  • Nếu region không xuất hiện trong các giá trị của cấp 'Region', ném KeyError(f"Region '{region}' not found").
  • Trích xuất mặt cắt ngang (Cross-Section):
  • Sử dụng phương thức df.xs(region, level='Region') để lấy toàn bộ dữ liệu thuộc vùng region. Bảng kết quả sẽ còn lại MultiIndex 2 cấp trên dòng: ['StoreType', 'Date'].
  • Tái định hình bằng unstack:
  • Đưa cấp 'StoreType' từ trục dòng lên trục cột bằng unstack(level='StoreType').
  • Trục dòng hiện tại chỉ còn lại Date.
  • Trục cột trở thành MultiIndex 2 tầng: tầng 0 là tên chỉ số ('revenue', 'units_sold'), tầng 1 là các loại cửa hàng (StoreType).
  • Xử lý ô khuyết & Tính tổng:
  • Điền toàn bộ ô khuyết NaN bằng giá trị fill_missing.
  • Tính tổng doanh thu của tất cả các loại cửa hàng trong mỗi ngày:

daily_total_revenue = unstacked['revenue'].sum(axis=1)

  • Thêm cột tổng hợp này vào trục cột đa cấp dưới dạng nhãn: ('revenue', 'ALL_STORES').
  • Chuẩn hóa đầu ra:
  • Sắp xếp trục cột theo thứ tự từ điển ở cả hai cấp (sort_index(axis=1)).
  • Đảm bảo toàn bộ giá trị số trong bảng có kiểu float64.
  • Trả về DataFrame kết quả.

Input

  • Các tham số truyền vào hàm/lớp analyze_hierarchical_sales 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 analyze_hierarchical_sales 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 ≤ 50,000.
  • Không làm thay đổi DataFrame df gốc.

Ví dụ 1

Input

analyze_hierarchical_sales(records=[['North', 'Retail', '2026-01-01', 100.0, 10.0], ['North', 'Online', '2026-01-01', 150.0, 15.0], ['North', 'Retail', '2026-01-02', 120.0, 12.0], ['North', 'Online', '2026-01-02', 180.0, 18.0], ['South', 'Retail', '2026-01-01', 80.0, 8.0]], region='North', fill_missing=0.0)

Output

{'2026-01-01': 250.0, '2026-01-02': 300.0}

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

analyze_hierarchical_sales(records=[['Asia', 'Kiosk', '2026-02-01', 50.0, 5.0], ['Asia', 'Flagship', '2026-02-01', 300.0, 20.0], ['Asia', 'Flagship', '2026-02-02', 350.0, 25.0]], region='Asia', fill_missing=0.0)

Output

{'2026-02-01': 350.0, '2026-02-02': 350.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.