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

Tự động Căn chỉnh Chỉ số & Đối soát Số liệu Đa nguồn

Trong hệ thống tài chính và kế toán doanh nghiệp, số liệu báo cáo thường được xuất từ hai nguồn độc lập: Sổ cái chính (primary_df) và Hệ thống đối soát ngân hàng/đối tác (secondary…

PythonCơ bản20 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ủ đề

pandasindex alignmentdata reconciliationarithmetic fill

Kiến thức tiên quyết: dataframe basics, index alignment rules, combine first.

Nội dung đề bài

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

  • Hiểu sâu cơ chế tự động căn chỉnh chỉ số (Index & Column Alignment) của pandas.DataFrame khi thực hiện các phép tính số học.
  • Sử dụng phương thức số học có tham số điền khuyết (sub(..., fill_value=...)) để triệt tiêu việc sinh giá trị NaN ngoài ý muốn khi nhãn chỉ mục không khớp nhau giữa hai nguồn.
  • Áp dụng phương thức combine_first() để hợp nhất dữ liệu đa nguồn với thứ tự ưu tiên xác định.

Mô tả bài toán

Trong hệ thống tài chính và kế toán doanh nghiệp, số liệu báo cáo thường được xuất từ hai nguồn độc lập: Sổ cái chính (primary_df) và Hệ thống đối soát ngân hàng/đối tác (secondary_df). Cả hai bảng đều dùng mã định danh đối tác (account_id) làm Index và các cột đo lường chỉ số tài chính (như revenue, fees, volume).

Tuy nhiên:

  • Một số đối tác có thể chỉ xuất hiện ở một trong hai hệ thống.
  • Một số cột chỉ tiêu có thể chỉ tồn tại ở một bên.

Hãy viết hàm: reconcile_and_aggregate_metrics(primary_df: pd.DataFrame, secondary_df: pd.DataFrame, fill_value: float = 0.0) -> dict[str, pd.DataFrame]

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

  • Kiểm tra đầu vào:
  • Cả hai đối số primary_df và secondary_df phải là pd.DataFrame. Nếu không, ném ngoại lệ TypeError("Inputs must be pandas DataFrames").
  • Tính toán Bảng chênh lệch (diff):
  • Lấy primary_df trừ đi secondary_df sử dụng primary_df.sub(secondary_df, fill_value=fill_value).
  • Bảng kết quả sẽ có tập chỉ số (Index) và tập cột (Columns) là phép hợp (Union) của hai bảng gốc.
  • Thêm một cột mới mang tên 'total_abs_diff' bằng tổng giá trị tuyệt đối của tất cả các cột số liệu chênh lệch trên từng dòng:

diff_df['total_abs_diff'] = diff_df[original_metric_cols].abs().sum(axis=1)

  • Ép toàn bộ kiểu dữ liệu số về float64.
  • Sắp xếp Index của diff_df theo thứ tự tăng dần (sort_index()).
  • Tính toán Bảng hợp nhất chuẩn (combined):
  • Hợp nhất hai bảng bằng primary_df.combine_first(secondary_df). Giá trị tại primary_df được ưu tiên giữ nguyên; các ô khuyết (NaN) được bù đắp bởi giá trị từ secondary_df.
  • Nếu sau khi kết hợp vẫn còn ô NaN (do ô đó khuyết ở cả 2 bảng), điền giá trị fill_value.
  • Ép kiểu toàn bộ dữ liệu số về float64.
  • Sắp xếp Index của combined_df theo thứ tự tăng dần (sort_index()).
  • Đầu ra:
  • Trả về dictionary: {"diff": diff_df, "combined": combined_df}.

Input

  • Các tham số truyền vào hàm/lớp reconcile_and_aggregate_metrics 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 reconcile_and_aggregate_metrics hoặc dữ liệu in ra màn hình theo đúng đặc tả.

Ràng buộc

  • Số dòng của mỗi bảng: 1 ≤ N ≤ 105.
  • Giá trị số liệu: các số thực nằm trong khoảng [-109, 109].
  • Các thao tác không được làm thay đổi (mutate) dữ liệu của primary_df và secondary_df ban đầu.

Ví dụ 1

Input

reconcile_and_aggregate_metrics(primary={'ACCT_01': {'revenue': 100.0, 'cost': 40.0}, 'ACCT_02': {'revenue': 200.0, 'cost': 90.0}}, secondary={'ACCT_02': {'revenue': 190.0, 'cost': 85.0}, 'ACCT_03': {'revenue': 150.0, 'cost': 70.0}}, fill_value=0.0)

Output

{'diff': {'ACCT_01': {'revenue': 100.0, 'cost': 40.0, 'total_abs_diff': 140.0}, 'ACCT_02': {'revenue': 10.0, 'cost': 5.0, 'total_abs_diff': 15.0}, 'ACCT_03': {'revenue': -150.0, 'cost': -70.0, 'total_abs_diff': 220.0}}, 'combined': {'ACCT_01': {'revenue': 100.0, 'cost': 40.0}, 'ACCT_02': {'revenue': 200.0, 'cost': 90.0}, 'ACCT_03': {'revenue': 150.0, 'cost': 70.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

reconcile_and_aggregate_metrics(primary={'A': {'v1': 50.0, 'v2': 25.0}, 'B': {'v1': 80.0, 'v2': 40.0}}, secondary={'A': {'v1': 50.0, 'v2': 25.0}, 'B': {'v1': 80.0, 'v2': 40.0}})

Output

{'diff': {'A': {'v1': 0.0, 'v2': 0.0, 'total_abs_diff': 0.0}, 'B': {'v1': 0.0, 'v2': 0.0, 'total_abs_diff': 0.0}}, 'combined': {'A': {'v1': 50.0, 'v2': 25.0}, 'B': {'v1': 80.0, 'v2': 40.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.