Blog post featured image

Python gebruiken in RevOps: zo update je jouw CRM en voorkom je duplicaten

Ontdek via een praktijkcase hoe je met Python RevOps-taken stroomlijnt, zoals CRM-updates en ontdubbeling.

A close-up of a person with yellow eyes and hair.

Haris Odobasic

Python kan heel nuttig zijn in Revenue Operations. Ik gebruik het graag als ik data moet verwerken.

Probleem: 300 miljoen paren om te controleren

Onlangs hadden we een case waarin we een lijst van 30.000 accounts moesten matchen met een CRM dat al 10.000 accounts bevatte. Je kunt er vergif op innemen dat er enorm veel duplicaten tussen zaten.

Het grootste probleem was dat het CRM vaak de merknaam gebruikte (The Lego Group) versus de statutaire naam (Lego A/S). Het nieuwe bestand bevatte alleen statutaire namen. Jammer.

Het probleem is dat we 300 miljoen mogelijke paren moeten vergelijken. Dit laat grafische tools zoals Excel of Google Sheets vastlopen (althans, dat gebeurde bij mij).

Tip: Voordat je data in het CRM importeert, wil je er zeker van zijn dat je dataset in de best mogelijke staat verkeert. Eenmaal in het CRM kost het veel meer tijd (en geld) om correcties door te voeren.



Oplossing: Python & ChatGPT schieten te hulp

Laat me raden: Python klinkt intimiderend? Dat dacht ik ook! Mijn kennis van coderen is verre van perfect. Vandaag de dag is het makkelijker te leren dan ooit en ChatGPT is een echte gamechanger. In een paar maanden kun je genoeg begrip opbouwen om het te gebruiken voor zakelijke cases (zoals fuzzy matching).



Aanpak

Je hebt de twee bronbestanden nodig om te matchen. In ons geval:

  • bestand 1 - brondata uit het CRM met record-ID

  • bestand 2 - nieuwe data van de dataprovider

Tip: Zorg ervoor dat er binnen elk bestand geen duplicaten staan!



Matching-variabele

Vervolgens moet elk bestand een matchingscriterium hebben. In ons voorbeeld hebben ze allemaal een veld genaamd "Account Name".



Mapstructuur

Plaats beide bestanden in dezelfde map als het script. De resultaten verschijnen later ook in deze map.



Fuzzy matching

Fuzzy matching is een methode om strings bij benadering te matchen. In gewoon Nederlands: het matcht vergelijkbare woorden. Zoals op de afbeelding:

People using a map displayed on two screens.



Hier vind je een gedetailleerde uitleg van het concept.

Voor onze doeleinden hoef je alleen te weten dat we voor een fuzzy match een matchingspercentage moeten instellen. Dit percentage geeft de maximale gelijkenis van de woorden aan. Voorbeelden:

  • Te hoog, bijv. 97%, dan mis je matches

  • Te laag, bijv. 84%, dan heb je een grotere kans op foutieve matches.

Een goede praktijk is om 90-95% te gebruiken. Zie de 90 in de code. Dat is het getal waarmee je wilt spelen.

# Performing the fuzzy matching
dict_list = []
for name in df3['Account Name']:
    match = match_name(name, df4['Accont Name'], 90)

Je kunt onder de 90 gaan, maar dan zou ik een paar testruns doen en de data handmatig controleren op vreemde matches. Het hangt allemaal af van je brondata.





Volledige code

Hieronder vind je het volledige script. Je hoeft slechts een paar wijzigingen aan te brengen:

  1. Vervang de bestandsstructuur van elk bestand

  2. Vervang de matching-variabele ('Account Name' in dit voorbeeld)

  3. Stel het fuzzy matchingspercentage in

Zodra je de code uitvoert, kan het een paar minuten duren voordat deze klaar is.

Hopelijk was dit nuttig! Het heeft mij talloze uren werk bespaard en de investering in een dure tool om dit probleem op te lossen.

import pandas as pd
from fuzzywuzzy import fuzz, process

# Function to match name using fuzzy matching
def match_name(name, list_names, min_score=0):
    max_score = -1
    max_name = ""
    for name2 in list_names:
        score = fuzz.ratio(name, name2)
        if (score > min_score) & (score > max_score):
            max_name = name2
            max_score = score
    return max_name, max_score

# Reading the data - insert your file structure in there
df3 = pd.read_csv('/Users/harisodobasic/Projects/duplication/file1', encoding='ISO-8859-1')
df4 = pd.read_csv('/Users/harisodobasic/Projects/duplication/file2', encoding='ISO-8859-1')

# Convert the 'Account Name' (insert here your matching variable) columns to strings (had to be done as in some cases strange strings in were in the name)
df3['Account Name'] = df3['Account Name'].apply(lambda x: str(x) if not pd.isnull(x) else '')
df4['Accont Name'] = df4['Accont Name'].apply(lambda x: str(x) if not pd.isnull(x) else '')

# Performing the fuzzy matching
dict_list = []
for name in df3['Account Name']:
    match = match_name(name, df4['Accont Name'], 90)
    dict_ = {
        "Account_Name_df3": name,
        "match_name_df4": match[0],
        "score": match[1]
    }
    dict_list.append(dict_)

merge_table = pd.DataFrame(dict_list)

# Merging the fuzzy match results with the original data from df3
final_data = pd.merge(merge_table, df3, how='left', left_on='Account_Name_df3', right_on='Account Name')

# Merging the above result with df4 using an 'outer' join to include unmatched rows from df4
final_data = pd.merge(final_data, df4, how='outer', left_on='match_name_df4', right_on='Accont Name')

# Removing redundant columns
final_data.drop(columns=['Account_Name_df3', 'match_name_df4'], inplace=True)

# Exporting the result to a CSV file
final_data.to_csv('result.csv', index=False)

print("Fuzzy matching completed and results saved to 'result.csv'")

Python kan heel nuttig zijn in Revenue Operations. Ik gebruik het graag als ik data moet verwerken.

Probleem: 300 miljoen paren om te controleren

Onlangs hadden we een case waarin we een lijst van 30.000 accounts moesten matchen met een CRM dat al 10.000 accounts bevatte. Je kunt er vergif op innemen dat er enorm veel duplicaten tussen zaten.

Het grootste probleem was dat het CRM vaak de merknaam gebruikte (The Lego Group) versus de statutaire naam (Lego A/S). Het nieuwe bestand bevatte alleen statutaire namen. Jammer.

Het probleem is dat we 300 miljoen mogelijke paren moeten vergelijken. Dit laat grafische tools zoals Excel of Google Sheets vastlopen (althans, dat gebeurde bij mij).

Tip: Voordat je data in het CRM importeert, wil je er zeker van zijn dat je dataset in de best mogelijke staat verkeert. Eenmaal in het CRM kost het veel meer tijd (en geld) om correcties door te voeren.



Oplossing: Python & ChatGPT schieten te hulp

Laat me raden: Python klinkt intimiderend? Dat dacht ik ook! Mijn kennis van coderen is verre van perfect. Vandaag de dag is het makkelijker te leren dan ooit en ChatGPT is een echte gamechanger. In een paar maanden kun je genoeg begrip opbouwen om het te gebruiken voor zakelijke cases (zoals fuzzy matching).



Aanpak

Je hebt de twee bronbestanden nodig om te matchen. In ons geval:

  • bestand 1 - brondata uit het CRM met record-ID

  • bestand 2 - nieuwe data van de dataprovider

Tip: Zorg ervoor dat er binnen elk bestand geen duplicaten staan!



Matching-variabele

Vervolgens moet elk bestand een matchingscriterium hebben. In ons voorbeeld hebben ze allemaal een veld genaamd "Account Name".



Mapstructuur

Plaats beide bestanden in dezelfde map als het script. De resultaten verschijnen later ook in deze map.



Fuzzy matching

Fuzzy matching is een methode om strings bij benadering te matchen. In gewoon Nederlands: het matcht vergelijkbare woorden. Zoals op de afbeelding:

People using a map displayed on two screens.



Hier vind je een gedetailleerde uitleg van het concept.

Voor onze doeleinden hoef je alleen te weten dat we voor een fuzzy match een matchingspercentage moeten instellen. Dit percentage geeft de maximale gelijkenis van de woorden aan. Voorbeelden:

  • Te hoog, bijv. 97%, dan mis je matches

  • Te laag, bijv. 84%, dan heb je een grotere kans op foutieve matches.

Een goede praktijk is om 90-95% te gebruiken. Zie de 90 in de code. Dat is het getal waarmee je wilt spelen.

# Performing the fuzzy matching
dict_list = []
for name in df3['Account Name']:
    match = match_name(name, df4['Accont Name'], 90)

Je kunt onder de 90 gaan, maar dan zou ik een paar testruns doen en de data handmatig controleren op vreemde matches. Het hangt allemaal af van je brondata.





Volledige code

Hieronder vind je het volledige script. Je hoeft slechts een paar wijzigingen aan te brengen:

  1. Vervang de bestandsstructuur van elk bestand

  2. Vervang de matching-variabele ('Account Name' in dit voorbeeld)

  3. Stel het fuzzy matchingspercentage in

Zodra je de code uitvoert, kan het een paar minuten duren voordat deze klaar is.

Hopelijk was dit nuttig! Het heeft mij talloze uren werk bespaard en de investering in een dure tool om dit probleem op te lossen.

import pandas as pd
from fuzzywuzzy import fuzz, process

# Function to match name using fuzzy matching
def match_name(name, list_names, min_score=0):
    max_score = -1
    max_name = ""
    for name2 in list_names:
        score = fuzz.ratio(name, name2)
        if (score > min_score) & (score > max_score):
            max_name = name2
            max_score = score
    return max_name, max_score

# Reading the data - insert your file structure in there
df3 = pd.read_csv('/Users/harisodobasic/Projects/duplication/file1', encoding='ISO-8859-1')
df4 = pd.read_csv('/Users/harisodobasic/Projects/duplication/file2', encoding='ISO-8859-1')

# Convert the 'Account Name' (insert here your matching variable) columns to strings (had to be done as in some cases strange strings in were in the name)
df3['Account Name'] = df3['Account Name'].apply(lambda x: str(x) if not pd.isnull(x) else '')
df4['Accont Name'] = df4['Accont Name'].apply(lambda x: str(x) if not pd.isnull(x) else '')

# Performing the fuzzy matching
dict_list = []
for name in df3['Account Name']:
    match = match_name(name, df4['Accont Name'], 90)
    dict_ = {
        "Account_Name_df3": name,
        "match_name_df4": match[0],
        "score": match[1]
    }
    dict_list.append(dict_)

merge_table = pd.DataFrame(dict_list)

# Merging the fuzzy match results with the original data from df3
final_data = pd.merge(merge_table, df3, how='left', left_on='Account_Name_df3', right_on='Account Name')

# Merging the above result with df4 using an 'outer' join to include unmatched rows from df4
final_data = pd.merge(final_data, df4, how='outer', left_on='match_name_df4', right_on='Accont Name')

# Removing redundant columns
final_data.drop(columns=['Account_Name_df3', 'match_name_df4'], inplace=True)

# Exporting the result to a CSV file
final_data.to_csv('result.csv', index=False)

print("Fuzzy matching completed and results saved to 'result.csv'")

Python kan heel nuttig zijn in Revenue Operations. Ik gebruik het graag als ik data moet verwerken.

Probleem: 300 miljoen paren om te controleren

Onlangs hadden we een case waarin we een lijst van 30.000 accounts moesten matchen met een CRM dat al 10.000 accounts bevatte. Je kunt er vergif op innemen dat er enorm veel duplicaten tussen zaten.

Het grootste probleem was dat het CRM vaak de merknaam gebruikte (The Lego Group) versus de statutaire naam (Lego A/S). Het nieuwe bestand bevatte alleen statutaire namen. Jammer.

Het probleem is dat we 300 miljoen mogelijke paren moeten vergelijken. Dit laat grafische tools zoals Excel of Google Sheets vastlopen (althans, dat gebeurde bij mij).

Tip: Voordat je data in het CRM importeert, wil je er zeker van zijn dat je dataset in de best mogelijke staat verkeert. Eenmaal in het CRM kost het veel meer tijd (en geld) om correcties door te voeren.



Oplossing: Python & ChatGPT schieten te hulp

Laat me raden: Python klinkt intimiderend? Dat dacht ik ook! Mijn kennis van coderen is verre van perfect. Vandaag de dag is het makkelijker te leren dan ooit en ChatGPT is een echte gamechanger. In een paar maanden kun je genoeg begrip opbouwen om het te gebruiken voor zakelijke cases (zoals fuzzy matching).



Aanpak

Je hebt de twee bronbestanden nodig om te matchen. In ons geval:

  • bestand 1 - brondata uit het CRM met record-ID

  • bestand 2 - nieuwe data van de dataprovider

Tip: Zorg ervoor dat er binnen elk bestand geen duplicaten staan!



Matching-variabele

Vervolgens moet elk bestand een matchingscriterium hebben. In ons voorbeeld hebben ze allemaal een veld genaamd "Account Name".



Mapstructuur

Plaats beide bestanden in dezelfde map als het script. De resultaten verschijnen later ook in deze map.



Fuzzy matching

Fuzzy matching is een methode om strings bij benadering te matchen. In gewoon Nederlands: het matcht vergelijkbare woorden. Zoals op de afbeelding:

People using a map displayed on two screens.



Hier vind je een gedetailleerde uitleg van het concept.

Voor onze doeleinden hoef je alleen te weten dat we voor een fuzzy match een matchingspercentage moeten instellen. Dit percentage geeft de maximale gelijkenis van de woorden aan. Voorbeelden:

  • Te hoog, bijv. 97%, dan mis je matches

  • Te laag, bijv. 84%, dan heb je een grotere kans op foutieve matches.

Een goede praktijk is om 90-95% te gebruiken. Zie de 90 in de code. Dat is het getal waarmee je wilt spelen.

# Performing the fuzzy matching
dict_list = []
for name in df3['Account Name']:
    match = match_name(name, df4['Accont Name'], 90)

Je kunt onder de 90 gaan, maar dan zou ik een paar testruns doen en de data handmatig controleren op vreemde matches. Het hangt allemaal af van je brondata.





Volledige code

Hieronder vind je het volledige script. Je hoeft slechts een paar wijzigingen aan te brengen:

  1. Vervang de bestandsstructuur van elk bestand

  2. Vervang de matching-variabele ('Account Name' in dit voorbeeld)

  3. Stel het fuzzy matchingspercentage in

Zodra je de code uitvoert, kan het een paar minuten duren voordat deze klaar is.

Hopelijk was dit nuttig! Het heeft mij talloze uren werk bespaard en de investering in een dure tool om dit probleem op te lossen.

import pandas as pd
from fuzzywuzzy import fuzz, process

# Function to match name using fuzzy matching
def match_name(name, list_names, min_score=0):
    max_score = -1
    max_name = ""
    for name2 in list_names:
        score = fuzz.ratio(name, name2)
        if (score > min_score) & (score > max_score):
            max_name = name2
            max_score = score
    return max_name, max_score

# Reading the data - insert your file structure in there
df3 = pd.read_csv('/Users/harisodobasic/Projects/duplication/file1', encoding='ISO-8859-1')
df4 = pd.read_csv('/Users/harisodobasic/Projects/duplication/file2', encoding='ISO-8859-1')

# Convert the 'Account Name' (insert here your matching variable) columns to strings (had to be done as in some cases strange strings in were in the name)
df3['Account Name'] = df3['Account Name'].apply(lambda x: str(x) if not pd.isnull(x) else '')
df4['Accont Name'] = df4['Accont Name'].apply(lambda x: str(x) if not pd.isnull(x) else '')

# Performing the fuzzy matching
dict_list = []
for name in df3['Account Name']:
    match = match_name(name, df4['Accont Name'], 90)
    dict_ = {
        "Account_Name_df3": name,
        "match_name_df4": match[0],
        "score": match[1]
    }
    dict_list.append(dict_)

merge_table = pd.DataFrame(dict_list)

# Merging the fuzzy match results with the original data from df3
final_data = pd.merge(merge_table, df3, how='left', left_on='Account_Name_df3', right_on='Account Name')

# Merging the above result with df4 using an 'outer' join to include unmatched rows from df4
final_data = pd.merge(final_data, df4, how='outer', left_on='match_name_df4', right_on='Accont Name')

# Removing redundant columns
final_data.drop(columns=['Account_Name_df3', 'match_name_df4'], inplace=True)

# Exporting the result to a CSV file
final_data.to_csv('result.csv', index=False)

print("Fuzzy matching completed and results saved to 'result.csv'")