{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Splink data linking and deduplication demo \n", "\n", "In this demo we link and simultaneously dedupe two datasets which themselves contain duplicates.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 1: Imports and setup\n", "\n", "The following is just boilerplate code that sets up the Spark session and sets some other non-essential configuration options" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RendererRegistry.enable('mimetype')" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd \n", "pd.options.display.max_columns = 500\n", "pd.options.display.max_rows = 100\n", "import altair as alt\n", "alt.renderers.enable('mimetype')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import logging \n", "logging.basicConfig() # Means logs will print in Jupyter Lab\n", "\n", "# Set to DEBUG if you want splink to log the SQL statements it's executing under the hood\n", "logging.getLogger(\"splink\").setLevel(logging.INFO)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from utility_functions.demo_utils import get_spark\n", "spark = get_spark()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 2: Read in data\n", "\n", "In this example, we read in two datasets, `df_1` and `df_2`. These will be provided to `Splink` as a list like `[df_1, df_2]`. By adding additional elements to this link, you can use `Splink` to link and deduplicate as many datasets as you like.\n", "\n", "⚠️ Note that `splink` makes the following assumptions about your data:\n", "\n", "- There is a field containing a unique record identifier in each dataset\n", "- There is a field containing a dataset name in each dataset, to disambiguate the `unique_id` column if the same id values occur in more than one dataset. By default, this column is called `source_dataset`, but you can change this in the settings.\n", "- The two datasets being linked have common column names - e.g. date of birth is represented in both datasets in a field of the same name. In many cases, this means that the user needs to rename columns prior to using `splink`\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+---------+----------+-------+----------+------------+--------------------+-----+--------------+\n", "|unique_id|first_name|surname| dob| city| email|group|source_dataset|\n", "+---------+----------+-------+----------+------------+--------------------+-----+--------------+\n", "| 0| Julia | null|2015-10-29| London| hannah88@powers.com| 0| df_1|\n", "| 1| Julia | Taylor|2015-07-31| London| hannah88@powers.com| 0| df_1|\n", "| 2| oNah| Watson|2008-03-23| Bolton|matthew78@ballard...| 1| df_1|\n", "| 3| Noah | Watson|2008-03-23| Bolton|matthew78@ballard...| 1| df_1|\n", "| 4| Molly | Bell|2002-01-05|Peterborough| null| 2| df_1|\n", "+---------+----------+-------+----------+------------+--------------------+-----+--------------+\n", "only showing top 5 rows\n", "\n", "+---------+----------+-------+----------+------+--------------------+-----+--------------+\n", "|unique_id|first_name|surname| dob| city| email|group|source_dataset|\n", "+---------+----------+-------+----------+------+--------------------+-----+--------------+\n", "| 0| Julia | Taylor|2016-01-27|London| hannah88@powers.com| 0| df_2|\n", "| 1| Julia | Taylor|2015-10-29| null| hannah88opowersc@m| 0| df_2|\n", "| 2| Watson| Noah |2008-03-23| null|matthew78@ballard...| 1| df_2|\n", "| 3| Noah | Watson|2008-02-05| tolon|matthew78@ballard...| 1| df_2|\n", "| 4| Watson| Noah |2008-06-15|Bolton|matthew78@ballard...| 1| df_2|\n", "+---------+----------+-------+----------+------+--------------------+-----+--------------+\n", "only showing top 5 rows\n", "\n" ] } ], "source": [ "from pyspark.sql.functions import lit \n", "from pyspark.sql import functions as f\n", "df_1 = spark.read.parquet(\"data/fake_df_l_link_dedupe_test.parquet\")\n", "df_1 = df_1.withColumn(\"source_dataset\", lit(\"df_1\"))\n", "df_2 = spark.read.parquet(\"data/fake_df_r_link_dedupe_test.parquet\")\n", "df_2 = df_2.withColumn(\"source_dataset\", lit(\"df_2\"))\n", "df_1.show(5)\n", "df_2.show(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 3: Configure splink using the `settings` object\n", "\n", "Most of `splink` configuration options are stored in a settings dictionary. This dictionary allows significant customisation, and can therefore get quite complex. \n", "\n", "💥 We provide an tool for helping to author valid settings dictionaries, which includes tooltips and autocomplete, which you can find [here](http://robinlinacre.com/splink_settings_editor/).\n", "\n", "Customisation overrides default values built into splink. For the purposes of this demo, we will specify a simple settings dictionary, which means we will be relying on these sensible defaults.\n", "\n", "To help with authoring and validation of the settings dictionary, we have written a [json schema](https://json-schema.org/), which can be found [here](https://github.com/moj-analytical-services/splink/blob/master/splink/files/settings_jsonschema.json). \n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "settings = {\n", " \"link_type\": \"link_and_dedupe\",\n", " \"blocking_rules\": [\n", " \"l.city = r.city\"\n", " ],\n", " \"comparison_columns\": [\n", " {\n", " \"col_name\": \"first_name\",\n", " \"num_levels\": 3,\n", " \"term_frequency_adjustments\": True\n", " },\n", " {\n", " \"col_name\": \"surname\",\n", " \"num_levels\": 3,\n", " \"term_frequency_adjustments\": True\n", " },\n", " {\n", " \"col_name\": \"dob\"\n", " },\n", " {\n", " \"col_name\": \"email\"\n", " }\n", " ],\n", " \"additional_columns_to_retain\": [\"group\"]\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In words, this setting dictionary says:\n", "- We are performing a link and deduplication task (the other options are `link_only`, or `dedupe_only`)\n", "- We are going generate comparisons subject to the blocking rule `l.city = r.city` i.e. all pairwise record comparisons (both within and between datasets) where the city field matches\n", "- When comparing records, we will use information from the `first_name`, `surname`, `dob` and `email` columns to compute a match score.\n", "- For `first_name` and `surname`, string comparisons will have three levels:\n", " - Level 2: Strings are (almost) exactly the same\n", " - Level 1: Strings are similar \n", " - Level 0: No match\n", "- We will make adjustments for term frequencies on the `first_name` and `surname` columns\n", "- We will retain the `group` column in the results even though this is not used as part of comparisons. This is a labelled dataset and `group` contains the true match - i.e. where group matches, the records pertain to the same person" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 4: Estimate match scores using the Expectation Maximisation algorithm\n", "Columns are assumed to be strings by default. See the 'comparison vector settings' notebook for details of configuration options." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:splink.iterate:Iteration 0 complete\n", "INFO:splink.model:The maximum change in parameters was 0.28655259609222417 for key first_name, level 0\n", "INFO:splink.iterate:Iteration 1 complete\n", "INFO:splink.model:The maximum change in parameters was 0.07504022121429443 for key surname, level 2\n", "INFO:splink.iterate:Iteration 2 complete\n", "INFO:splink.model:The maximum change in parameters was 0.032610535621643066 for key surname, level 0\n", "INFO:splink.iterate:Iteration 3 complete\n", "INFO:splink.model:The maximum change in parameters was 0.018751978874206543 for key surname, level 0\n", "INFO:splink.iterate:Iteration 4 complete\n", "INFO:splink.model:The maximum change in parameters was 0.01141306757926941 for key surname, level 0\n", "INFO:splink.iterate:Iteration 5 complete\n", "INFO:splink.model:The maximum change in parameters was 0.007352173328399658 for key surname, level 0\n", "INFO:splink.iterate:Iteration 6 complete\n", "INFO:splink.model:The maximum change in parameters was 0.004936426877975464 for key surname, level 0\n", "INFO:splink.iterate:Iteration 7 complete\n", "INFO:splink.model:The maximum change in parameters was 0.003407001495361328 for key surname, level 0\n", "INFO:splink.iterate:Iteration 8 complete\n", "INFO:splink.model:The maximum change in parameters was 0.0023947954177856445 for key surname, level 0\n", "INFO:splink.iterate:Iteration 9 complete\n", "INFO:splink.model:The maximum change in parameters was 0.0017041563987731934 for key surname, level 0\n", "INFO:splink.iterate:Iteration 10 complete\n", "INFO:splink.model:The maximum change in parameters was 0.0012229979038238525 for key surname, level 0\n", "INFO:splink.iterate:Iteration 11 complete\n", "INFO:splink.model:The maximum change in parameters was 0.0008828639984130859 for key surname, level 0\n", "INFO:splink.iterate:Iteration 12 complete\n", "INFO:splink.model:The maximum change in parameters was 0.0006399154663085938 for key surname, level 0\n", "INFO:splink.iterate:Iteration 13 complete\n", "INFO:splink.model:The maximum change in parameters was 0.00046521425247192383 for key surname, level 0\n", "INFO:splink.iterate:Iteration 14 complete\n", "INFO:splink.model:The maximum change in parameters was 0.0003389120101928711 for key surname, level 0\n", "INFO:splink.iterate:Iteration 15 complete\n", "INFO:splink.model:The maximum change in parameters was 0.000247269868850708 for key surname, level 0\n", "INFO:splink.iterate:Iteration 16 complete\n", "INFO:splink.model:The maximum change in parameters was 0.0001805722713470459 for key surname, level 0\n", "INFO:splink.iterate:Iteration 17 complete\n", "INFO:splink.model:The maximum change in parameters was 0.00013199448585510254 for key surname, level 0\n", "INFO:splink.iterate:Iteration 18 complete\n", "INFO:splink.model:The maximum change in parameters was 9.652972221374512e-05 for key surname, level 0\n", "INFO:splink.iterate:EM algorithm has converged\n" ] } ], "source": [ "from splink import Splink\n", "\n", "linker = Splink(settings, [df_1, df_2], spark)\n", "df_e = linker.get_scored_comparisons()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 5: Inspect results \n", "\n", "Each row in the results table represents a comparison of two input records.\n", "\n", "Note that since this is a link and dedupe task, there will be record comparisons of three types:\n", "- Comparison between two records both originating from `df_l`. \n", "- Comparison between two records both originating from `df_r`. \n", "- Comparison between one record from `df_l` and one record from `df_r`\n", "\n", "Information about the source table is included in the `_source_table_l` and `_source_table_r` fields." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
match_probabilityunique_id_lsource_dataset_lunique_id_rsource_dataset_rgroup_lgroup_rfirst_name_lfirst_name_rsurname_lsurname_rdob_ldob_remail_lemail_r
1630.9968440df_10df_200JuliaJuliaNoneTaylor2015-10-292016-01-27hannah88@powers.comhannah88@powers.com
2550.9968440df_11df_100JuliaJuliaNoneTaylor2015-10-292015-07-31hannah88@powers.comhannah88@powers.com
2540.0015000df_112df_106JuliaMatildaNoneHsrir2015-10-291983-04-30hannah88@powers.compatrcio47@davis.cam
2530.0015000df_113df_106JuliaMatildaNoneNone2015-10-291983-04-30hannah88@powers.compatricia47@davis.com
2520.0015000df_114df_107JuliaBaxterNoneAria2015-10-291992-09-07hannah88@powers.comchristineshepherd@allen.com
1620.0015000df_115df_206JuliaHarrisNoneMatilda2015-10-291983-04-30hannah88@powers.compatricia47@davis.com
2510.0015000df_115df_107JuliaAriaNoneBaxter2015-10-291992-09-07hannah88@powers.comchristineshepherd@allen.com
218470.0005250df_215df_206JuliaHarrisTaylorMatilda2016-01-271983-04-30hannah88@powers.compatricia47@davis.com
1610.0015000df_116df_206JuliaMatildaNoneHarris2015-10-291983-03-03hannah88@powers.compatricia47@davis.com
2500.0015000df_116df_108JuliaWilsonNoneCharlie2015-10-291998-09-15hannah88@powers.comsamantha81@henry.com
\n", "
" ], "text/plain": [ " match_probability unique_id_l source_dataset_l unique_id_r \\\n", "163 0.996844 0 df_1 0 \n", "255 0.996844 0 df_1 1 \n", "254 0.001500 0 df_1 12 \n", "253 0.001500 0 df_1 13 \n", "252 0.001500 0 df_1 14 \n", "162 0.001500 0 df_1 15 \n", "251 0.001500 0 df_1 15 \n", "21847 0.000525 0 df_2 15 \n", "161 0.001500 0 df_1 16 \n", "250 0.001500 0 df_1 16 \n", "\n", " source_dataset_r group_l group_r first_name_l first_name_r surname_l \\\n", "163 df_2 0 0 Julia Julia None \n", "255 df_1 0 0 Julia Julia None \n", "254 df_1 0 6 Julia Matilda None \n", "253 df_1 0 6 Julia Matilda None \n", "252 df_1 0 7 Julia Baxter None \n", "162 df_2 0 6 Julia Harris None \n", "251 df_1 0 7 Julia Aria None \n", "21847 df_2 0 6 Julia Harris Taylor \n", "161 df_2 0 6 Julia Matilda None \n", "250 df_1 0 8 Julia Wilson None \n", "\n", " surname_r dob_l dob_r email_l \\\n", "163 Taylor 2015-10-29 2016-01-27 hannah88@powers.com \n", "255 Taylor 2015-10-29 2015-07-31 hannah88@powers.com \n", "254 Hsrir 2015-10-29 1983-04-30 hannah88@powers.com \n", "253 None 2015-10-29 1983-04-30 hannah88@powers.com \n", "252 Aria 2015-10-29 1992-09-07 hannah88@powers.com \n", "162 Matilda 2015-10-29 1983-04-30 hannah88@powers.com \n", "251 Baxter 2015-10-29 1992-09-07 hannah88@powers.com \n", "21847 Matilda 2016-01-27 1983-04-30 hannah88@powers.com \n", "161 Harris 2015-10-29 1983-03-03 hannah88@powers.com \n", "250 Charlie 2015-10-29 1998-09-15 hannah88@powers.com \n", "\n", " email_r \n", "163 hannah88@powers.com \n", "255 hannah88@powers.com \n", "254 patrcio47@davis.cam \n", "253 patricia47@davis.com \n", "252 christineshepherd@allen.com \n", "162 patricia47@davis.com \n", "251 christineshepherd@allen.com \n", "21847 patricia47@davis.com \n", "161 patricia47@davis.com \n", "250 samantha81@henry.com " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Inspect main dataframe that contains the match scores\n", "cols_to_inspect = [\"match_probability\",\"unique_id_l\", \"source_dataset_l\",\"unique_id_r\",\"source_dataset_r\",\"group_l\", \"group_r\", \"first_name_l\",\"first_name_r\",\"surname_l\",\"surname_r\",\"dob_l\",\"dob_r\",\"email_l\",\"email_r\"]\n", "\n", "df_e.toPandas()[cols_to_inspect].sort_values([\"unique_id_l\", \"unique_id_r\"]).head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `params` property of the `linker` is an object that contains a lot of diagnostic information about how the match probability was computed. The following cells demonstrate some of its functionality" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.vegalite.v4+json": { "$schema": "https://vega.github.io/schema/vega-lite/v4.json", "config": { "header": { "title": null }, "title": { "anchor": "middle", "offset": 10 }, "view": { "continuousHeight": 300, "continuousWidth": 400, "height": 300, "width": 400 } }, "data": { "name": "data-e960b8b083fa56b5a9d535453e7af0e8" }, "datasets": { "data-e960b8b083fa56b5a9d535453e7af0e8": [ { "bayes_factor": 0.3601818234308759, "column_name": "first_name", "gamma_column_name": "gamma_first_name", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9693870484180609, "log2_bayes_factor": -1.4732027173849902, "m_probability": 0.3576868176460266, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.9930729269981384 }, { "bayes_factor": 64.68185565350407, "column_name": "first_name", "gamma_column_name": "gamma_first_name", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.009552881298058357, "log2_bayes_factor": 6.015289163675829, "m_probability": 0.18313910067081451, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.0028313829097896814 }, { "bayes_factor": 112.11141778531503, "column_name": "first_name", "gamma_column_name": "gamma_first_name", "gamma_index": 2, "level_name": "level_2", "level_proportion": 0.021060073538966703, "log2_bayes_factor": 6.80878940407706, "m_probability": 0.4591740667819977, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.004095694050192833 }, { "bayes_factor": 0.3498540949211502, "column_name": "surname", "gamma_column_name": "gamma_surname", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9663043473461412, "log2_bayes_factor": -1.515174716889511, "m_probability": 0.3464624285697937, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.990305483341217 }, { "bayes_factor": 42.05144602735033, "column_name": "surname", "gamma_column_name": "gamma_surname", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.007511362059035971, "log2_bayes_factor": 5.39408350632184, "m_probability": 0.12483184784650803, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.0029685506597161293 }, { "bayes_factor": 78.60695838165553, "column_name": "surname", "gamma_column_name": "gamma_surname", "gamma_index": 2, "level_name": "level_2", "level_proportion": 0.02618426566044865, "log2_bayes_factor": 6.296585122108771, "m_probability": 0.5287057161331177, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.006725940387696028 }, { "bayes_factor": 0.37169604261745076, "column_name": "dob", "gamma_column_name": "gamma_dob", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9735266021285711, "log2_bayes_factor": -1.427804766726894, "m_probability": 0.37053459882736206, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.9968752861022949 }, { "bayes_factor": 201.4487523967151, "column_name": "dob", "gamma_column_name": "gamma_dob", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.026473377249518544, "log2_bayes_factor": 7.65426906045535, "m_probability": 0.6294654011726379, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.003124692477285862 }, { "bayes_factor": 0.2897675740810544, "column_name": "email", "gamma_column_name": "gamma_email", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9699864169331069, "log2_bayes_factor": -1.7870319331526896, "m_probability": 0.28871461749076843, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.9963662028312683 }, { "bayes_factor": 195.74210269582187, "column_name": "email", "gamma_column_name": "gamma_email", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.030013575884267556, "log2_bayes_factor": 7.612810292277467, "m_probability": 0.711285412311554, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.0036337885539978743 } ] }, "hconcat": [ { "encoding": { "color": { "value": "red" }, "row": { "field": "column_name", "header": { "labelAlign": "left", "labelAnchor": "middle", "labelAngle": 0 }, "sort": { "field": "gamma_index" }, "type": "nominal" }, "tooltip": [ { "field": "column_name", "type": "nominal" }, { "field": "level_name", "type": "ordinal" }, { "field": "u_probability", "format": ".4f", "type": "quantitative" }, { "field": "bayes_factor", "format": ".4f", "type": "quantitative" }, { "field": "level_proportion", "format": ".2%", "title": "Percentage of record comparisons in this level", "type": "nominal" }, { "field": "log2_bayes_factor", "format": ".4f", "type": "quantitative" } ], "x": { "axis": { "title": "proportion" }, "field": "u_probability", "type": "quantitative" }, "y": { "axis": { "title": null }, "field": "level_name", "type": "nominal" } }, "height": 50, "mark": "bar", "resolve": { "scale": { "y": "independent" } }, "title": { "fontWeight": "normal", "text": "Non-matches" }, "transform": [ { "filter": "(datum.bayes_factor != 'unnecessary filter2 due to vega lite issue 4680')" } ], "width": 150 }, { "encoding": { "color": { "value": "green" }, "row": { "field": "column_name", "header": { "labels": false }, "sort": { "field": "gamma_index" }, "type": "nominal" }, "tooltip": [ { "field": "column_name", "type": "nominal" }, { "field": "level_name", "type": "ordinal" }, { "field": "m_probability", "format": ".4f", "type": "quantitative" }, { "field": "bayes_factor", "format": ".4f", "type": "quantitative" }, { "field": "level_proportion", "format": ".2%", "title": "Percentage of record comparisons in this level", "type": "nominal" }, { "field": "log2_bayes_factor", "format": ".4f", "type": "quantitative" } ], "x": { "axis": { "title": "proportion" }, "field": "m_probability", "type": "quantitative" }, "y": { "axis": { "title": null }, "field": "level_name", "type": "nominal" } }, "height": 50, "mark": "bar", "resolve": { "scale": { "y": "independent" } }, "title": { "fontWeight": "normal", "text": "Matches" }, "transform": [ { "filter": "(datum.bayes_factor != 'unnecessary filter due to vega lite issue 4680')" } ], "width": 150 } ], "title": { "subtitle": "Estimated proportion of matches λ = 0.0373", "text": "Probability distributions of non-matches and matches " }, "transform": [] }, "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdUAAAFyCAYAAACjoEChAAAgAElEQVR4Xu2dC9iWU/b/V+nMoCmpJE2JJlGTUPgxY9JxxoxQaBiphIjJUE451eQwZYbShGicVaTkVAwTBuWQJppSDpEcGkTpQPpfn/2fO0+P53A/73Ofnvf57uvqqt5333vv+7v22t+91t73WlW2bNmyxVSEgBAQAkJACAiBohGoIlItGkM1IASEgBAQAkLAISBS1UQQAkJACAgBIRAQAiLVgIBUM0JACAgBISAERKqaA0JACAgBISAEAkJApJoByPS7W1WqVAkI7nCa+e677+yrr76yatWq2fbbb2/e+L1xf/nll+5nO+20UzgD+F+r6eMIorMwxx7GeIN4Z68NZPb5559bnTp1rFatWkE2rbaEgBAICQGRagZgDz30UHv++ee3/uZHP/qR9erVy373u99Z586dKySKK664wi6//HL7+9//bieffHJBbTz11FOu31NPPdUmTZr0g2cXLlxobdu2tf/7v/+zuXPnWp8+fWzKlCn27LPPGu/ikevGjRttzZo1NmPGDGvatKl16dKloHFkqkwbc+bMsVdffdW22267bcaRq/FPP/3U1zhSxz569OgKY8hYwGnevHl20EEH2b777uv+n4pb0WAE2MArr7xiv/jFL9xm6fbbb7dTTjklwNbjbYr3Qa5+3ummm26ywYMH21/+8hc755xz4h24z96//fZbq169uqsd9scVjz/+uH3wwQd29NFHW7169XKOsBSx9Al5oqqJVHOQ6pFHHmm77767vf322/bMM8+4mi+//LLtv//+BQvxsssusyuvvLJCC+STTz5pjIVFiAUpvbz//vt21VVXWcuWLe3888/fSqoQLEQ7ZMgQ27Bhg6FUCxYssAMOOMAp4YMPPljwe6Q/8Mtf/tL+8Y9/OFKtX7/+NuPI1Tg4+hlH6th5x4piyFiuv/56Gzp0qN1444121llnWTpuRYMRYAOMk/GedNJJNmzYMNtnn30CbD3epryNkh/CQVbMgT//+c923nnnxTtwn71HSapHHXWUPfzww07/fvazn+UcYSli6RPyRFUTqeYg1SeeeGKrNferX/3KHnnkEbvhhhvsxz/+sU2cONFZrhDerrvu6hbq//znP/bHP/7RWYu1a9e2ww8/3C0GWIUeqbKYL1++3P7973/bYYcd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iFQ1B4SAEBACQkAIBISASDUgINWMEBACQkAICAGRakLnwD9vuslli1ERAkEgsKVqVfvmf/OJzEflVG6aKl3y5N1ipxZWtUrVchJ/qO+aSZdEqqFCXkTjVaoU8bAeFQJpCNSpY7ZuncuVWW6kWuUK6ZI3Gz4b9pnVrVU3q3okcX4kcUwAmG1cItWkrr4i1aRKpjTHJVItTbkFPGqRanCAilSzYLl48WKrV6+eSwpcTCHh74IFC6xjx445myEROEmG8yb2FqkWIw49m45ABKSaVF2Spfr9ZBCpBrc0iFSzYHnaaadZ165d7ZhjjikK7ffee8+6dOliS5YsydjO6tWr7cQTT7Rq1aoZdc8//3w75ZRTsvcpUi1KHno4evdvUnVJpCpSDWM9EKnmIdVevXrZ6NGjbcKECdakSRMbP368rVy50mbNmmUTJ050Tw8aNMj69Olju+++u7GALFu2zPr27WsjR450dXOR6tVXX21fffWVjRo1yj766CNr1KiRYbXWwYLIVESqYehB+bYZgaXqkWrSdEmkKlINQ/FFqnlItWXLlnbCCSfYlClTbM6cOTZmzBibN2+eNW7c2NauXWubN292ZAt59uvXzzp16mSdO3e2gQMH2llnnWWHH354TlIdMGCAq3/88cfbli1bnPt3+fLl2S+NiFTD0IPybTNCUk2aLolURaphKL5INQ+pLl261J5//nljl03p37+/rVixwv09ZMgQ27hxo02bNs1uu+02Z11i0daoUcOeeuop23HHHW348OE5SbV3797Gn2OPPda1v+uuu9pLL71kzZo1k6UaxoxXm9siECGpJk2XRKoi1TCWA5FqHlKFHD/88ENncXqFM8/p06fb/PnznauWc9cOHTo4i3Xs2LFb67Vq1cpat26dk1SvvPJKR77nnnuus3rr1q1rX3zxhbNYn3vuOUfoqWXY8OFhzAO1Wa4IREiqSdOl4RukS96010Wl4BYAkWoeUq1Zs6bdcccddu+99zoXb/fu3e21116zNWvWWJs2bdzT7777rru527ZtW5s8ebK1a9fORowY4VzEPXr0yEmqM2fOtHHjxtns2bNt6tSpjpRfeOGF7BKW+ze42a+WzCIk1aTpkixVWaphLAEi1Ryk2q1bN+MPlukrr7ziPuqFAAcPHuyegjC5WDRp0iT3/xkzZtjQoUPdv2vVqmVz58515665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EBACQkAIiFQ1B4SAEBACQkAIBISASDUgINWMEBACQkAICAGRquaAEBACQkAICIGAEBCpBgSkmhECQkAICAEhIFLVHBACQkAICAEhEBACItWAgFQzQkAICAEhIAREqpoDQkAICAEhIAQCQkCkGhCQakYICAEhIASEgEg1oXPgnzfdZC1atEjo6DSsUkNgc926trl+fTfs5s2bl9rwixrvTVPLW5eqVqlqLXbSWlLUJMrycCZdEqmGgXQQbVapEkQrakMI/H8E/vhHs+uus7fffrvsSLXKFeWtS3Wq17F1F63zpQlJnB9JHBNgZhuXSNXXVIuhkkg1BtArcZci1Uos3NyvJlINR/Qi1Sy4Ll682OrVq2cNGjQoCvkNGzbYggULrGPHjjnbWbdundWuXduqVq2auz+RalHy0MNpCERAqknVJVmqslTDWA9EqllQPe2006xr1652zDHHFIX7e++9Z126dLElS5ZkbGf16tV24oknWrVq1Yy6559/vp1yyinZ+xSpFiUPPRw9qSZVl0SqItUw1gORah5S7dWrl40ePdomTJhgTZo0sfHjx9vKlStt1qxZNnHiRPf0oEGDrE+fPrb77rsbC8iyZcusb9++NnLkSFc3F6leffXV9tVXX9moUaPso48+skaNGhlWa506dTKPTKQahh6Ub5sRWKoeqSZNl0SqItUwFF+kmodUW7ZsaSeccIJNmTLF5syZY2PGjLF58+ZZ48aNbe3atbZ582ZHtpBnv379rFOnTta5c2cbOHCgnXXWWXb44YfnJNUBAwa4+scff7xt2bLFuX+XL1+e/dKISDUMPSjfNiMk1aTpkkhVpBqG4otU85Dq0qVL7fnnnzd22ZT+/fvbihUr3N9DhgyxjRs32rRp0+y2225z1iUWbY0aNeypp56yHXfc0YYPH56TVHv37m38OfbYY137u+66q7300kvWrFkzWaphzHi1uS0CEZJq0nRJpCpSDWM5EKnmIVXI8cMPP3QWp1c485w+fbrNnz/fuWo5d+3QoYOzWMeOHbu1XqtWrax169Y5SfXKK6905Hvuuec6q7du3br2xRdfOIv1ueeec4SeWoYNHx7GPFCb5YpAhKSaNF0avqG8dUm3f8NRepFqHlKtWbOm3XHHHXbvvfc6F2/37t3ttddeszVr1libNm3c0++++667udu2bVubPHmytWvXzkaM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lO1Z3ql27dpWtWrVgtuuTA/4kX9FdSkfTvlk8O233xpy3HnnnfM1Fdjv/eARhh7me4F8WBEE8IsvvrC6devma6qg3/vBw4+eilQLgj3ayrfffrv95S9/sd12281Qurvvvtt22WWXrYN45ZVX7NRTT7U99tjD3nvvPZs0aZJ16NDB1yDztb1ixQrr06eP669atWrWvn17u+SSS3y1natSvn69Z3mffffd1x5//HE7+OCDQ+93w4YN1r9/f1uzZo0jn5/97Gd2xRVXhN4vm5aBAwc6Ev/000/t2GOPtVNOOcVXv5988oktXLjQevXqZcuWLbMGDRps89zq1atdoAfkB57nn3++77Z9DaCEKuWbd8XoUi4Y/Mhg7NixNnHiRDvooIPsyy+/dJ9q7L333qGimw+PsPSwWKxmz55tF154oe2zzz6BYpUPj0L0VKQa6tSteOOQaPWuh+X0AAAKEElEQVTq1d2ObKeddrIhQ4ZYo0aN3ITySpcuXeyPf/yj8fcDDzzgFJNJl6/4aXvkyJH2zTffOGKBcLB0Vq5caY0bN87XfNbf++mXhzdt2mS9e/e2d955xyZMmFA0qfrpd/LkyTZv3jy76aabjJ3w9OnT7Te/+U1RFrrffh999FGbMmWK/etf/7J+/frZkiVLfGGMzJ9//nm7/vrr7eOPP/4BqV599dXGznrUqFH20UcfufmDFVCnTh1f7VeWSn7kUFFdyodRPhkw1/HEeN4G9A5Z3njjjfmarvDv/eARhh7mG3A+rHh+1113NTZATZo0scWLFzuvEgRbTPGDB+uDXz0VqRYjjRCfhVA6d+5sy5cvd72gZAsWLHDWqFcIk8VCzN+vvfaadevWzSlkvuKnbVzOuBNr1aplM2bMsKFDhzprqCLuSW88fvqlLn398pe/dO88YsSIoknVT7/08/LLL29VWBa37t2754My5+/99Ltq1Spr166dHXHEEcZtwnPPPdfOO++8gvpFJplIdcCAAW4OHX/88W6jgAXOfCq32L9+5FBRXconKD8ywArClfn111+7eX/OOec4mYVV/OARhh7me598WIEPxxxHH320Pfnkk/a73/3Orr32WndsUkzxg0cheipSLUYaIT6LW++4447barXceeed9s9//tNuvfXWrb1y1olVgwVCxoTDDz/cV7xgP217O9XRo0fbmDFj7KGHHnILfzHF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", "text/plain": [ "\n", "\n", "If you see this message, it means the renderer has not been properly enabled\n", "for the frontend that you are using. For more information, see\n", "https://altair-viz.github.io/user_guide/troubleshooting.html\n" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = linker.model\n", "model.probability_distribution_chart()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An alternative representation of the parameters displays them in terms of the effect different values in the comparison vectors have on the match probability:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.vegalite.v4+json": { "$schema": "https://vega.github.io/schema/vega-lite/v4.json", "config": { "header": { "title": null }, "mark": { "tooltip": null }, "title": { "anchor": "middle" }, "view": { "continuousHeight": 300, "continuousWidth": 400, "height": 300, "width": 400 } }, "data": { "name": "data-e960b8b083fa56b5a9d535453e7af0e8" }, "datasets": { "data-e960b8b083fa56b5a9d535453e7af0e8": [ { "bayes_factor": 0.3601818234308759, "column_name": "first_name", "gamma_column_name": "gamma_first_name", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9693870484180609, "log2_bayes_factor": -1.4732027173849902, "m_probability": 0.3576868176460266, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.9930729269981384 }, { "bayes_factor": 64.68185565350407, "column_name": "first_name", "gamma_column_name": "gamma_first_name", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.009552881298058357, "log2_bayes_factor": 6.015289163675829, "m_probability": 0.18313910067081451, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.0028313829097896814 }, { "bayes_factor": 112.11141778531503, "column_name": "first_name", "gamma_column_name": "gamma_first_name", "gamma_index": 2, "level_name": "level_2", "level_proportion": 0.021060073538966703, "log2_bayes_factor": 6.80878940407706, "m_probability": 0.4591740667819977, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.004095694050192833 }, { "bayes_factor": 0.3498540949211502, "column_name": "surname", "gamma_column_name": "gamma_surname", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9663043473461412, "log2_bayes_factor": -1.515174716889511, "m_probability": 0.3464624285697937, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.990305483341217 }, { "bayes_factor": 42.05144602735033, "column_name": "surname", "gamma_column_name": "gamma_surname", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.007511362059035971, "log2_bayes_factor": 5.39408350632184, "m_probability": 0.12483184784650803, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.0029685506597161293 }, { "bayes_factor": 78.60695838165553, "column_name": "surname", "gamma_column_name": "gamma_surname", "gamma_index": 2, "level_name": "level_2", "level_proportion": 0.02618426566044865, "log2_bayes_factor": 6.296585122108771, "m_probability": 0.5287057161331177, "max_gamma_index": 2, "num_levels": 3, "u_probability": 0.006725940387696028 }, { "bayes_factor": 0.37169604261745076, "column_name": "dob", "gamma_column_name": "gamma_dob", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9735266021285711, "log2_bayes_factor": -1.427804766726894, "m_probability": 0.37053459882736206, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.9968752861022949 }, { "bayes_factor": 201.4487523967151, "column_name": "dob", "gamma_column_name": "gamma_dob", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.026473377249518544, "log2_bayes_factor": 7.65426906045535, "m_probability": 0.6294654011726379, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.003124692477285862 }, { "bayes_factor": 0.2897675740810544, "column_name": "email", "gamma_column_name": "gamma_email", "gamma_index": 0, "level_name": "level_0", "level_proportion": 0.9699864169331069, "log2_bayes_factor": -1.7870319331526896, "m_probability": 0.28871461749076843, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.9963662028312683 }, { "bayes_factor": 195.74210269582187, "column_name": "email", "gamma_column_name": "gamma_email", "gamma_index": 1, "level_name": "level_1", "level_proportion": 0.030013575884267556, "log2_bayes_factor": 7.612810292277467, "m_probability": 0.711285412311554, "max_gamma_index": 1, "num_levels": 2, "u_probability": 0.0036337885539978743 } ] }, "encoding": { "color": { "field": "log2_bayes_factor", "scale": { "domain": [ -10, 0, 10 ], "range": [ "red", "orange", "green" ] }, "type": "quantitative" }, "row": { "field": "column_name", "header": { "labelAlign": "left", "labelAnchor": "middle", "labelAngle": 0 }, "sort": { "field": "gamma_index" }, "type": "nominal" }, "tooltip": [ { "field": "column_name", "type": "nominal" }, { "field": "level_name", "type": "ordinal" }, { "field": "m_probability", "format": ".4f", "type": "quantitative" }, { "field": "bayes_factor", "format": ".4f", "type": "quantitative" }, { "field": "level_proportion", "format": ".2%", "title": "Percentage of record comparisons in this level", "type": "nominal" }, { "field": "log2_bayes_factor", "format": ".4f", "title": "log2(Bayes factor, K = m/u)", "type": "quantitative" } ], "x": { "axis": { "title": "log2(Bayes factor, K = m/u)", "values": [ -10, -5, 0, 5, 10 ] }, "field": "log2_bayes_factor", "scale": { "domain": [ -10, 10 ] }, "type": "quantitative" }, "y": { "axis": { "title": null }, "field": "level_name", "type": "nominal" } }, "height": 50, "mark": { "clip": true, "type": "bar" }, "resolve": { "scale": { "y": "independent" } }, "title": "Influence of comparison vector values on match probability" }, "image/png": "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", "text/plain": [ "\n", "\n", "If you see this message, it means the renderer has not been properly enabled\n", "for the frontend that you are using. For more information, see\n", "https://altair-viz.github.io/user_guide/troubleshooting.html\n" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.bayes_factor_chart()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# If charts aren't displaying correctly in your notebook, you can write them to a file (by default splink_charts.html)\n", "model.all_charts_write_html_file(\"splink_charts.html\", overwrite=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also generate a report which explains how the match probability was computed for an individual comparison row. \n", "\n", "Note that you need to convert the row to a dictionary for this to work" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Initial probability of match (prior) = λ = 0.03728\n", "------\n", "Comparison of first_name. Values are: \n", "first_name_l: Gibson\n", "first_name_r: yarH \n", "Comparison has: 3 levels\n", "Level for this comparison: gamma_first_name = 0\n", "m probability = P(level|match): 0.3577\n", "u probability = P(level|non-match): 0.9931\n", "Bayes factor = m/u: 0.3602\n", "New probability of match (updated belief): 0.01375\n", "\n", "------\n", "Comparison of surname. Values are: \n", "surname_l: Noah \n", "surname_r: None\n", "Comparison has: 3 levels\n", "Level for this comparison: gamma_surname = -1\n", "m probability = P(level|match): 1\n", "u probability = P(level|non-match): 1\n", "Bayes factor = m/u: 1\n", "New probability of match (updated belief): 0.01375\n", "\n", "------\n", "Comparison of dob. Values are: \n", "dob_l: 1987-08-24\n", "dob_r: 2017-11-24\n", "Comparison has: 2 levels\n", "Level for this comparison: gamma_dob = 0\n", "m probability = P(level|match): 0.3705\n", "u probability = P(level|non-match): 0.9969\n", "Bayes factor = m/u: 0.3717\n", "New probability of match (updated belief): 0.005157\n", "\n", "------\n", "Comparison of email. Values are: \n", "email_l: avazquez@banks.com\n", "email_r: coltonray@lee.com\n", "Comparison has: 2 levels\n", "Level for this comparison: gamma_email = 0\n", "m probability = P(level|match): 0.2887\n", "u probability = P(level|non-match): 0.9964\n", "Bayes factor = m/u: 0.2898\n", "New probability of match (updated belief): 0.0015\n", "\n", "\n", "Final probability of match = 0.0015\n", "\n", "Reminder:\n", "\n", "The m probability for a given level is the proportion of matches which are in this level.\n", "We would generally expect the highest similarity level to have the largest proportion of matches.\n", "For example, we would expect first name field to match exactly amongst most matching records, except where nicknames, aliases or typos have occurred.\n", "For a comparison column that changes through time, like address, we may expect a lower proportion of comparisons to be in the highest similarity level.\n", "\n", "The u probability for a given level is the proportion of non-matches which are in this level.\n", "We would generally expect the lowest similarity level to have the highest proportion of non-matches, but the magnitude depends on the cardinality of the field.\n", "For example, we would expect that in the vast majority of non-matching records, the date of birth field would not match. However, we would expect it to be common for gender to match amongst non-matches.\n", "\n" ] } ], "source": [ "from splink.intuition import intuition_report\n", "row_dict = df_e.toPandas().sample(1).to_dict(orient=\"records\")[0]\n", "print(intuition_report(row_dict, model))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Use graphframes to resolve links into groups" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+---------+---------+----------+---------+----------+---------------+--------------------+-----+--------------+\n", "|component|unique_id|first_name| surname| dob| city| email|group|source_dataset|\n", "+---------+---------+----------+---------+----------+---------------+--------------------+-----+--------------+\n", "| 0| 107| Gabriel | null|1977-12-21| Leds|rachelschtitm@geo...| 57| df_1|\n", "| 1| 112| Nathan | lconaMd|1996-09-09| London|birara84@robbins.baz| 29| df_2|\n", "| 1| 111| Ntaan | Mcdonald|1996-09-09| London| null| 29| df_2|\n", "| 1| 56| Nathan | Mcdonald|1996-09-09| London|barbara84@robbins...| 29| df_1|\n", "| 1| 55| Nathan | Mcdonald|1996-09-09| London|barbara84@robbins...| 29| df_1|\n", "| 1| 109| null| Mcdonald|1996-09-09| London|barbara84@robbins...| 29| df_2|\n", "| 2| 247| Taylor| Nancy |1989-07-25| London|wagnershane@landr...| 62| df_2|\n", "| 2| 118| Nancy | Taylor|1989-07-25| London|wagnershane@landr...| 62| df_1|\n", "| 2| 245| Nancy | Taylor|1989-07-25| London|wagnershane@landr...| 62| df_2|\n", "| 2| 248| Nacy | Taylor|1989-07-25| London|wagnershane@landr...| 62| df_2|\n", "| 2| 117| null| Taylor|1989-07-25| London|wagnershane@landr...| 62| df_1|\n", "| 2| 246| Nancy | Taylor|1989-08-19| London|wagnershane@landr...| 62| df_2|\n", "| 3| 119| Lewis| Freddie |1971-12-19|Southend-on-Sea|tyler28@weaver-al...| 63| df_1|\n", "| 3| 249| Freddi | Lewis|1971-12-19|Southend-on-Sea|tyler28@wecveralv...| 63| df_2|\n", "| 3| 250| null| Lewis|1971-12-19|Southend-on-Sea|tyler28@weaver-al...| 63| df_2|\n", "| 3| 120| Lewis| Freddie |1971-09-14|Southend-on-Sea|tyler28@weaver-al...| 63| df_1|\n", "| 4| 10| Amelia |Alexander|1983-05-19| Glasgow|icampbell@allen-l...| 3| df_2|\n", "| 4| 11| lmeAi |Alexander|1983-05-19| Glasgow|icampbell@allen-l...| 3| df_2|\n", "| 6| 253| Aad | Berry|1986-02-08| London|walterdunn@pham-h...| 64| df_2|\n", "| 6| 121| Adam | Berry|1986-02-08| London|walterdunn@pham-h...| 64| df_1|\n", "+---------+---------+----------+---------+----------+---------------+--------------------+-----+--------------+\n", "only showing top 20 rows\n", "\n" ] } ], "source": [ "from graphframes import GraphFrame\n", "from splink.vertically_concat import vertically_concatenate_datasets\n", "\n", "df_1.createOrReplaceTempView(\"df_1\")\n", "df_2.createOrReplaceTempView(\"df_2\")\n", "df_e.createOrReplaceTempView(\"df_e\")\n", "\n", "sql = \"\"\"\n", "select unique_id, source_dataset, concat(unique_id, '__-__', source_dataset) as id \n", "from df_1\n", "union\n", "select unique_id, source_dataset, concat(unique_id, '__-__', source_dataset) as id \n", "from df_2\n", "\"\"\"\n", "nodes = spark.sql(sql)\n", "\n", "sql = \"\"\"\n", "select\n", "concat(unique_id_l, '__-__', source_dataset_l) as src,\n", "concat(unique_id_r, '__-__', source_dataset_r) as dst,\n", "match_probability\n", "from df_e\n", "where match_probability > 0.99\n", "\"\"\"\n", "edges = spark.sql(sql)\n", "\n", "g = GraphFrame(nodes, edges)\n", "\n", "cc = g.connectedComponents()\n", "\n", "cc.createOrReplaceTempView(\"cc\")\n", "\n", "df_nodes = vertically_concatenate_datasets([df_1, df_2])\n", "df_nodes.createOrReplaceTempView(\"df_nodes\")\n", "\n", "sql = \"\"\"\n", "select cc.component, df_nodes.*\n", "from cc\n", "left join\n", "df_nodes on \n", "cc.unique_id = df_nodes.unique_id and cc.source_dataset = df_nodes.source_dataset\n", "order by component\n", "\"\"\"\n", "results = spark.sql(sql)\n", "\n", "results.toPandas().head(30)\n", "\n", "results.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 }