Hướng dẫn pbpython record linking - liên kết bản ghi pbpython

Giới thiệu

Liên kết ghi và kết hợp mờ là các thuật ngữ được sử dụng để mô tả quá trình kết hợp hai bộ dữ liệu với nhau không có mã định danh duy nhất phổ biến. Các ví dụ bao gồm cố gắng tham gia các tệp dựa trên tên của mọi người hoặc hợp nhất dữ liệu chỉ có tên tổ chức và & nbsp; địa chỉ.

Vấn đề này là một thách thức kinh doanh phổ biến và khó giải quyết một cách có hệ thống - đặc biệt là khi các bộ dữ liệu lớn. Một cách tiếp cận ngây thơ bằng cách sử dụng các tuyên bố Excel và Vlookup có thể hoạt động nhưng đòi hỏi nhiều sự can thiệp của con người. May mắn thay, Python cung cấp hai thư viện hữu ích cho các loại vấn đề này và có thể hỗ trợ các thuật toán phù hợp phức tạp với API tương đối đơn giản.API.

Cái đầu tiên được gọi là fuzzymatcher và cung cấp một giao diện đơn giản để liên kết hai khung dữ liệu gấu trúc với nhau bằng cách sử dụng liên kết bản ghi xác suất. Tùy chọn thứ hai là bộ công cụ liên kết bản ghi Python có tên phù hợp, cung cấp một bộ công cụ mạnh mẽ để tự động hóa liên kết bản ghi và thực hiện dữ liệu & nbsp; sao chép.

Bài viết này sẽ thảo luận về cách sử dụng hai công cụ này để phù hợp với hai bộ dữ liệu khác nhau dựa trên thông tin tên và địa chỉ. Ngoài ra, các kỹ thuật được sử dụng để phù hợp có thể được áp dụng cho sự trùng lặp dữ liệu và sẽ được ngắn gọn & NBSP; được thảo luận.

The problem

Bất cứ ai đã cố gắng hợp nhất các bộ dữ liệu khác nhau có khả năng chạy qua một số biến thể của thách thức này. Trong ví dụ đơn giản dưới đây, chúng tôi có một hồ sơ khách hàng trong hệ thống của chúng tôi và cần xác định các khớp dữ liệu - mà không cần sử dụng một định danh thông thường & nbsp;

Với một bộ mẫu nhỏ và trực giác của chúng tôi, có vẻ như tài khoản 18763 giống như số tài khoản A1278. Chúng tôi biết rằng anh em và người anh em cũng như Lane và LN tương đương nên quá trình này tương đối dễ dàng cho một người. Tuy nhiên, cố gắng lập trình logic để xử lý điều này là thử thách A & nbsp;LN are equivalent so this process is relatively easy for a person. However, trying to program logic to handle this is a challenge.

Theo kinh nghiệm của tôi, hầu hết mọi người bắt đầu sử dụng Excel đến vlookup các thành phần khác nhau của địa chỉ và cố gắng tìm trận đấu tốt nhất dựa trên trạng thái, số đường phố hoặc mã zip. Trong một số trường hợp, điều này có thể hoạt động. Tuy nhiên, có nhiều cách tinh vi hơn để thực hiện so sánh chuỗi mà chúng ta có thể muốn sử dụng. Ví dụ, tôi đã viết ngắn gọn về một gói có tên Fuzzy Wuzzy vài năm & nbsp; trước đây.

Thách thức là các thuật toán này [ví dụ: Levenshtein, Damerau-Levenshtein, Jaro-Winkler, Q-gram, cosine] rất chuyên sâu về mặt tính toán. Cố gắng thực hiện nhiều khớp trên các bộ dữ liệu lớn là không & nbsp; có thể mở rộng.

Nếu bạn quan tâm đến nhiều chi tiết toán học hơn về các khái niệm này, Wikipedia là một nơi tốt để bắt đầu và bài viết này chứa nhiều chi tiết bổ sung hơn. Cuối cùng, bài đăng trên blog này thảo luận về một số phương pháp khớp chuỗi trong nhiều hơn & nbsp; chi tiết.

May mắn thay, có các công cụ Python có thể giúp chúng tôi thực hiện các phương pháp này và giải quyết một số vấn đề đầy thách thức này.

The data

Đối với bài viết này, chúng tôi sẽ sử dụng dữ liệu bệnh viện của Hoa Kỳ. Tôi đã chọn bộ dữ liệu này vì dữ liệu bệnh viện có một số phẩm chất độc đáo khiến nó trở nên khó khăn với & nbsp; khớp:US hospital data. I chose this data set because hospital data has some unique qualities that make it challenging to match:

  • Nhiều bệnh viện có tên tương tự trên các thành phố khác nhau [Saint Lukes, Saint Mary, Community & NBSP; Bệnh viện]
  • Ở khu vực thành thị, các bệnh viện có thể chiếm một số khối thành phố để địa chỉ có thể là & nbsp; mơ hồ
  • Các bệnh viện có xu hướng có nhiều phòng khám và các cơ sở liên quan và liên quan khác & NBSP; gần đó
  • Các bệnh viện cũng có được và thay đổi tên là phổ biến - làm cho quá trình này trở nên nhiều hơn & NBSP; khó khăn
  • Cuối cùng, có hàng ngàn cơ sở y tế ở Mỹ nên vấn đề là thách thức đối với & NBSP;US so the problem is challenging to scale

Trong các ví dụ này, tôi có hai bộ dữ liệu. Đầu tiên là bộ dữ liệu nội bộ có chứa số tài khoản bệnh viện cơ bản, tên và quyền sở hữu & nbsp; thông tin.

Bộ dữ liệu thứ hai chứa thông tin bệnh viện [được gọi là nhà cung cấp] cũng như số lượng xuất viện và thanh toán Medicare cho một suy tim cụ thể & NBSP; thủ tục.

Các bộ dữ liệu đầy đủ có sẵn từ Medicare.gov và CMS.gov và phiên bản đơn giản và được làm sạch có sẵn trên GitHub.CMS.gov and the simplified and cleaned version are available on github.

Kịch bản kinh doanh là chúng tôi muốn kết hợp thông tin hoàn trả bệnh viện với dữ liệu tài khoản nội bộ của chúng tôi để chúng tôi có thêm thông tin để phân tích khách hàng bệnh viện của chúng tôi. Trong trường hợp này, chúng tôi có 5339 tài khoản bệnh viện và 2697 bệnh viện có thông tin hoàn trả. Thật không may, chúng tôi không có ID chung để tham gia vì vậy chúng tôi sẽ xem liệu chúng tôi có thể sử dụng các công cụ Python này để hợp nhất dữ liệu với nhau dựa trên sự kết hợp của Tên và Địa chỉ & NBSP; Thông tin.ID to join on so we will see if we can use these python tools to merge the data together based on a combination of name and address information.

Tiếp cận 1 -& nbsp; fuzzymatcher

Đối với cách tiếp cận đầu tiên, chúng tôi sẽ thử sử dụng Fuzzymatcher. Gói này tận dụng khả năng tìm kiếm văn bản đầy đủ của SQLite để cố gắng khớp các bản ghi trong hai & nbsp; DataFrames.

Để cài đặt trình kết hợp mờ, tôi thấy conda cài đặt các phụ thuộc [gấu trúc, metaphone, fuzzywuzzy] sau đó sử dụng pip để cài đặt fuzzymatcher. Với gánh nặng tính toán của các thuật toán này, bạn sẽ muốn sử dụng các thành phần C được biên dịch càng nhiều càng tốt và Conda đã làm cho điều đó dễ dàng nhất cho & nbsp; tôi.

Nếu bạn muốn theo dõi, máy tính xách tay này chứa một bản tóm tắt của tất cả các mã & nbsp;

Sau khi mọi thứ được thiết lập, hãy để nhập và nhập dữ liệu vào & NBSP; DataFrames:

import pandas as pd
from pathlib import Path
import fuzzymatcher
hospital_accounts = pd.read_csv['hospital_account_info.csv']
hospital_reimbursement = pd.read_csv['hospital_reimbursement.csv']

Đây là tài khoản bệnh viện & nbsp; thông tin:

Đây là khoản hoàn trả & NBSP; Thông tin:

Vì các cột có các tên khác nhau, chúng ta cần xác định các cột nào để khớp với các khung dữ liệu bên trái và phải. Trong trường hợp này, thông tin tài khoản bệnh viện của chúng tôi sẽ là DataFrame bên trái và thông tin hoàn trả sẽ là & nbsp; phải.

left_on = ["Facility Name", "Address", "City", "State"]

right_on = [
    "Provider Name", "Provider Street Address", "Provider City",
    "Provider State"
]

Bây giờ chúng tôi để Fuzzymatcher cố gắng tìm ra các trận đấu bằng cách sử dụng fuzzy_left_join:

matched_results = fuzzymatcher.fuzzy_left_join[hospital_accounts,
                                            hospital_reimbursement,
                                            left_on,
                                            right_on,
                                            left_id_col='Account_Num',
                                            right_id_col='Provider_Num']

Đằng sau hậu trường, Fuzzymatcher xác định phù hợp nhất cho mỗi kết hợp. Đối với bộ dữ liệu này, chúng tôi đang phân tích hơn 14 triệu kết hợp. Trên máy tính xách tay của tôi, việc này mất khoảng 2 phút và 11 giây để & nbsp; chạy.

DataFrame ____10 chứa tất cả các dữ liệu được liên kết với nhau cũng như

left_on = ["Facility Name", "Address", "City", "State"]

right_on = [
    "Provider Name", "Provider Street Address", "Provider City",
    "Provider State"
]
1 cho thấy chất lượng của liên kết & nbsp;

Ở đây, một tập hợp con của các cột được sắp xếp lại ở định dạng dễ đọc hơn cho 5 trận đấu tốt nhất & nbsp;

cols = [
    "best_match_score", "Facility Name", "Provider Name", "Address", "Provider Street Address",
    "Provider City", "City", "Provider State", "State"
]

matched_results[cols].sort_values[by=['best_match_score'], ascending=False].head[5]

Mục đầu tiên có điểm trận đấu là 3.09 và chắc chắn trông giống như một trận đấu sạch sẽ. Bạn có thể thấy rằng tên cơ sở và tên nhà cung cấp cho Mayo Clinic ở Red Wing có một chút khác biệt nhưng chúng tôi vẫn có thể có được một trận đấu tốt & nbsp;

Chúng ta có thể kiểm tra ở đầu đối diện của quang phổ để xem các trận đấu don lồng trông như & nbsp; tốt: tốt:

matched_results[cols].sort_values[by=['best_match_score'], ascending=True].head[5]

Trong đó cho thấy một số điểm kém cũng như rõ ràng & NBSP; không phù hợp:

Ví dụ này nhấn mạnh rằng một phần của vấn đề là một bộ dữ liệu bao gồm dữ liệu từ Puerto Rico và phần khác thì không. Sự khác biệt này nhấn mạnh sự cần thiết phải đảm bảo bạn thực sự hiểu dữ liệu của mình và những gì làm sạch và lọc bạn có thể cần làm trước khi cố gắng & nbsp; khớp.

Chúng tôi đã xem xét các trường hợp cực đoan, hãy để xem một số trận đấu có thể khó khăn hơn một chút bằng cách nhìn vào điểm số

matched_results[cols].query["best_match_score 

Bài Viết Liên Quan

Chủ Đề