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

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;

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

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.

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

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.

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

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:

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

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

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

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)

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

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:

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

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 <= .80").sort_values(
    by=['best_match_score'], ascending=False).head(5)

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

Ví dụ này cho thấy một số trận đấu trở nên mơ hồ hơn một chút. Ví dụ, Adventisthealthukiahvalley có giống như ukiahvalleymedicalcenter không? Tùy thuộc vào bộ dữ liệu của bạn và nhu cầu của bạn, bạn sẽ cần tìm sự cân bằng phù hợp của việc kết hợp tự động và thủ công & nbsp; đánh giá.ADVENTIST HEALTH UKIAH VALLEY the same as UKIAH VALLEY MEDICAL CENTER? Depending on your data set and your needs, you will need to find the right balance of automated and manual match review.

Nhìn chung, Fuzzymatcher là một công cụ hữu ích để có cho các bộ dữ liệu có kích thước trung bình. Khi bạn bắt đầu có được 10.000 hàng hàng, sẽ mất rất nhiều thời gian để tính toán, vì vậy hãy lên kế hoạch cho phù hợp. Tuy nhiên, sự dễ sử dụng - đặc biệt là khi làm việc với gấu trúc làm cho nó trở thành nơi đầu tiên tuyệt vời cho & nbsp; bắt đầu.

Advanced Usage

Ngoài các phương pháp phù hợp được hiển thị ở đây, bộ công cụ liên kết bản ghi chứa một số phương pháp học máy để các bản ghi phù hợp. Tôi khuyến khích độc giả quan tâm xem xét các tài liệu cho các ví dụ.

Một trong những khả năng khá tiện dụng là có một công cụ dựa trên trình duyệt mà bạn có thể sử dụng để tạo các cặp bản ghi cho các thuật toán học máy & NBSP;

Cả hai công cụ bao gồm một số khả năng xử lý trước dữ liệu để làm cho sự phù hợp đáng tin cậy hơn. Dưới đây là nội dung tiền xử lý trong bộ công cụ liên kết bản ghi. Dữ liệu ví dụ này khá sạch sẽ, vì vậy bạn có thể sẽ cần khám phá một số khả năng này cho dữ liệu & nbsp; dữ liệu của riêng bạn.

Bản tóm tắt

Liên kết các tập bản ghi khác nhau trên các trường văn bản như tên và địa chỉ là một vấn đề dữ liệu phổ biến nhưng đầy thách thức. Hệ sinh thái Python chứa hai thư viện hữu ích có thể lấy tập dữ liệu và sử dụng nhiều thuật toán để cố gắng khớp chúng & nbsp;

Fuzzymatcher sử dụng tìm kiếm văn bản đầy đủ của SQLite để chỉ đơn giản là kết hợp 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. Nếu bạn có một tập dữ liệu lớn hơn hoặc cần sử dụng logic phù hợp phức tạp hơn, thì bộ công cụ liên kết bản ghi Python là một bộ công cụ rất mạnh để tham gia dữ liệu và xóa & nbsp; trùng lặp.

Một phần động lực của tôi để viết bài viết dài này là có rất nhiều lựa chọn thương mại ngoài kia cho những vấn đề này và tôi muốn nâng cao nhận thức về các tùy chọn Python này. Trước khi bạn tham gia với một chuyên gia tư vấn đắt tiền hoặc cố gắng trả tiền cho giải pháp, bạn nên dành một buổi chiều với hai lựa chọn này và xem liệu nó có giúp bạn ra ngoài không. Tất cả các ví dụ mã có liên quan để bạn bắt đầu có trong sổ ghi chép này.

Tôi luôn muốn nghe nếu bạn thấy những chủ đề này hữu ích và áp dụng cho nhu cầu của riêng bạn. Hãy bình luận bên dưới và cho tôi biết nếu bạn sử dụng những công cụ này hoặc bất kỳ công cụ tương tự & nbsp;

Tín dụng: Hình ảnh tiêu đề - Một nhà soạn nhạc trong & NBSP của anh ấy;