Blog post featured image

Python in RevOps: So aktualisieren Sie Ihr CRM und vermeiden Dubletten

Erfahren Sie anhand einer Kundenreferenz, wie Python RevOps-Aufgaben wie CRM-Aktualisierungen und Dublettenbereinigung vereinfachen kann.

Nahaufnahme einer Person mit gelben Augen und Haaren.

Haris Odobasic

Python kann in Revenue Operations hilfreich sein. Ich nutze es gern, wenn ich mit Daten arbeiten muss.

Problem: 300 Millionen Paare überprüfen

Kürzlich mussten wir eine Liste mit 30.000 Accounts mit einem CRM abgleichen, das bereits 10.000 Accounts enthielt. Sie können sich vorstellen, dass es jede Menge Dubletten gab.

Das Hauptproblem: Im CRM wurde häufig der Markenname (The Lego Group) statt des rechtlichen Unternehmensnamens (Lego A/S) verwendet. Die neue Datei enthielt ausschließlich rechtliche Unternehmensnamen. Ärgerlich.

Wir müssen also 300 Millionen mögliche Paare vergleichen. Das bringt grafische Tools wie Excel oder Google Sheets zum Absturz – zumindest war es bei mir so.

Tipp: Bevor Sie Daten in Ihr CRM importieren, sollten Sie sicherstellen, dass Ihr Datensatz in bestmöglichem Zustand ist. Sobald die Daten im CRM sind, werden Korrekturen deutlich zeitaufwendiger und damit teurer.



Lösung: Python & ChatGPT helfen weiter

Lassen Sie mich raten: Python klingt einschüchternd? Das dachte ich auch! Meine Programmierkenntnisse sind alles andere als gut. Heute ist der Einstieg einfacher denn je, und ChatGPT verändert die Möglichkeiten grundlegend. In wenigen Monaten lässt sich genügend Wissen aufbauen, um Python für geschäftliche Anwendungsfälle wie Fuzzy Matching einzusetzen.



Vorgehen

Sie benötigen die beiden Quelldateien, die abgeglichen werden sollen. In unserem Fall:

  • file1 – Quelldaten aus dem CRM mit Datensatz-ID

  • file2 – neue Daten vom Datenanbieter

Tipp: Stellen Sie sicher, dass keine der beiden Dateien selbst Dubletten enthält!



Abgleichvariable

Als Nächstes benötigt jede Datei ein Abgleichkriterium. In unserem Beispiel haben beide ein Feld namens „Account Name“.



Ordnerstruktur

Legen Sie beide Dateien zusammen mit dem Skript im selben Ordner ab. Dort werden später auch die Ergebnisse gespeichert.



Fuzzy Matching

Fuzzy Matching ist eine Methode zum ungefähren Abgleichen von Zeichenfolgen. Einfach gesagt: Sie gleicht ähnliche Wörter ab. Wie im Bild:

People using a map displayed on two screens.



Hier finden Sie eine ausführliche Erklärung des Konzepts.

Für unsere Zwecke müssen Sie nur wissen, dass wir für einen Fuzzy-Abgleich einen Übereinstimmungsprozentsatz festlegen müssen. Der Prozentsatz gibt die maximale Ähnlichkeit der Wörter an. Beispiele:

  • Ist er zu hoch, etwa 97 %, übersehen Sie Übereinstimmungen.

  • Ist er zu niedrig, etwa 84 %, steigt die Wahrscheinlichkeit falscher Zuordnungen.

Bewährt haben sich Werte zwischen 95 und 90 %. Beachten Sie die 90 im Code. Mit diesem Wert sollten Sie experimentieren.

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

Sie können auch unter 90 gehen. Dann würde ich jedoch einige Testläufe durchführen und die Daten manuell auf ungewöhnliche Zuordnungen prüfen. Es hängt alles von Ihren Quelldaten ab.





Vollständiger Code

Unten finden Sie das vollständige Skript. Sie müssen nur wenige Anpassungen vornehmen:

  1. Passen Sie den Dateipfad jeder Datei an.

  2. Ersetzen Sie die Abgleichvariable, in diesem Beispiel 'Account Name'.

  3. Legen Sie den Prozentsatz für Fuzzy Matching fest.

Nach dem Start des Codes kann die Ausführung einige Minuten dauern.

Ich hoffe, das war hilfreich! Mir hat es unzählige Arbeitsstunden und die Investition in ein zusätzliches Tool zur Lösung des Problems erspart.

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 kann in Revenue Operations hilfreich sein. Ich nutze es gern, wenn ich mit Daten arbeiten muss.

Problem: 300 Millionen Paare überprüfen

Kürzlich mussten wir eine Liste mit 30.000 Accounts mit einem CRM abgleichen, das bereits 10.000 Accounts enthielt. Sie können sich vorstellen, dass es jede Menge Dubletten gab.

Das Hauptproblem: Im CRM wurde häufig der Markenname (The Lego Group) statt des rechtlichen Unternehmensnamens (Lego A/S) verwendet. Die neue Datei enthielt ausschließlich rechtliche Unternehmensnamen. Ärgerlich.

Wir müssen also 300 Millionen mögliche Paare vergleichen. Das bringt grafische Tools wie Excel oder Google Sheets zum Absturz – zumindest war es bei mir so.

Tipp: Bevor Sie Daten in Ihr CRM importieren, sollten Sie sicherstellen, dass Ihr Datensatz in bestmöglichem Zustand ist. Sobald die Daten im CRM sind, werden Korrekturen deutlich zeitaufwendiger und damit teurer.



Lösung: Python & ChatGPT helfen weiter

Lassen Sie mich raten: Python klingt einschüchternd? Das dachte ich auch! Meine Programmierkenntnisse sind alles andere als gut. Heute ist der Einstieg einfacher denn je, und ChatGPT verändert die Möglichkeiten grundlegend. In wenigen Monaten lässt sich genügend Wissen aufbauen, um Python für geschäftliche Anwendungsfälle wie Fuzzy Matching einzusetzen.



Vorgehen

Sie benötigen die beiden Quelldateien, die abgeglichen werden sollen. In unserem Fall:

  • file1 – Quelldaten aus dem CRM mit Datensatz-ID

  • file2 – neue Daten vom Datenanbieter

Tipp: Stellen Sie sicher, dass keine der beiden Dateien selbst Dubletten enthält!



Abgleichvariable

Als Nächstes benötigt jede Datei ein Abgleichkriterium. In unserem Beispiel haben beide ein Feld namens „Account Name“.



Ordnerstruktur

Legen Sie beide Dateien zusammen mit dem Skript im selben Ordner ab. Dort werden später auch die Ergebnisse gespeichert.



Fuzzy Matching

Fuzzy Matching ist eine Methode zum ungefähren Abgleichen von Zeichenfolgen. Einfach gesagt: Sie gleicht ähnliche Wörter ab. Wie im Bild:

People using a map displayed on two screens.



Hier finden Sie eine ausführliche Erklärung des Konzepts.

Für unsere Zwecke müssen Sie nur wissen, dass wir für einen Fuzzy-Abgleich einen Übereinstimmungsprozentsatz festlegen müssen. Der Prozentsatz gibt die maximale Ähnlichkeit der Wörter an. Beispiele:

  • Ist er zu hoch, etwa 97 %, übersehen Sie Übereinstimmungen.

  • Ist er zu niedrig, etwa 84 %, steigt die Wahrscheinlichkeit falscher Zuordnungen.

Bewährt haben sich Werte zwischen 95 und 90 %. Beachten Sie die 90 im Code. Mit diesem Wert sollten Sie experimentieren.

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

Sie können auch unter 90 gehen. Dann würde ich jedoch einige Testläufe durchführen und die Daten manuell auf ungewöhnliche Zuordnungen prüfen. Es hängt alles von Ihren Quelldaten ab.





Vollständiger Code

Unten finden Sie das vollständige Skript. Sie müssen nur wenige Anpassungen vornehmen:

  1. Passen Sie den Dateipfad jeder Datei an.

  2. Ersetzen Sie die Abgleichvariable, in diesem Beispiel 'Account Name'.

  3. Legen Sie den Prozentsatz für Fuzzy Matching fest.

Nach dem Start des Codes kann die Ausführung einige Minuten dauern.

Ich hoffe, das war hilfreich! Mir hat es unzählige Arbeitsstunden und die Investition in ein zusätzliches Tool zur Lösung des Problems erspart.

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 kann in Revenue Operations hilfreich sein. Ich nutze es gern, wenn ich mit Daten arbeiten muss.

Problem: 300 Millionen Paare überprüfen

Kürzlich mussten wir eine Liste mit 30.000 Accounts mit einem CRM abgleichen, das bereits 10.000 Accounts enthielt. Sie können sich vorstellen, dass es jede Menge Dubletten gab.

Das Hauptproblem: Im CRM wurde häufig der Markenname (The Lego Group) statt des rechtlichen Unternehmensnamens (Lego A/S) verwendet. Die neue Datei enthielt ausschließlich rechtliche Unternehmensnamen. Ärgerlich.

Wir müssen also 300 Millionen mögliche Paare vergleichen. Das bringt grafische Tools wie Excel oder Google Sheets zum Absturz – zumindest war es bei mir so.

Tipp: Bevor Sie Daten in Ihr CRM importieren, sollten Sie sicherstellen, dass Ihr Datensatz in bestmöglichem Zustand ist. Sobald die Daten im CRM sind, werden Korrekturen deutlich zeitaufwendiger und damit teurer.



Lösung: Python & ChatGPT helfen weiter

Lassen Sie mich raten: Python klingt einschüchternd? Das dachte ich auch! Meine Programmierkenntnisse sind alles andere als gut. Heute ist der Einstieg einfacher denn je, und ChatGPT verändert die Möglichkeiten grundlegend. In wenigen Monaten lässt sich genügend Wissen aufbauen, um Python für geschäftliche Anwendungsfälle wie Fuzzy Matching einzusetzen.



Vorgehen

Sie benötigen die beiden Quelldateien, die abgeglichen werden sollen. In unserem Fall:

  • file1 – Quelldaten aus dem CRM mit Datensatz-ID

  • file2 – neue Daten vom Datenanbieter

Tipp: Stellen Sie sicher, dass keine der beiden Dateien selbst Dubletten enthält!



Abgleichvariable

Als Nächstes benötigt jede Datei ein Abgleichkriterium. In unserem Beispiel haben beide ein Feld namens „Account Name“.



Ordnerstruktur

Legen Sie beide Dateien zusammen mit dem Skript im selben Ordner ab. Dort werden später auch die Ergebnisse gespeichert.



Fuzzy Matching

Fuzzy Matching ist eine Methode zum ungefähren Abgleichen von Zeichenfolgen. Einfach gesagt: Sie gleicht ähnliche Wörter ab. Wie im Bild:

People using a map displayed on two screens.



Hier finden Sie eine ausführliche Erklärung des Konzepts.

Für unsere Zwecke müssen Sie nur wissen, dass wir für einen Fuzzy-Abgleich einen Übereinstimmungsprozentsatz festlegen müssen. Der Prozentsatz gibt die maximale Ähnlichkeit der Wörter an. Beispiele:

  • Ist er zu hoch, etwa 97 %, übersehen Sie Übereinstimmungen.

  • Ist er zu niedrig, etwa 84 %, steigt die Wahrscheinlichkeit falscher Zuordnungen.

Bewährt haben sich Werte zwischen 95 und 90 %. Beachten Sie die 90 im Code. Mit diesem Wert sollten Sie experimentieren.

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

Sie können auch unter 90 gehen. Dann würde ich jedoch einige Testläufe durchführen und die Daten manuell auf ungewöhnliche Zuordnungen prüfen. Es hängt alles von Ihren Quelldaten ab.





Vollständiger Code

Unten finden Sie das vollständige Skript. Sie müssen nur wenige Anpassungen vornehmen:

  1. Passen Sie den Dateipfad jeder Datei an.

  2. Ersetzen Sie die Abgleichvariable, in diesem Beispiel 'Account Name'.

  3. Legen Sie den Prozentsatz für Fuzzy Matching fest.

Nach dem Start des Codes kann die Ausführung einige Minuten dauern.

Ich hoffe, das war hilfreich! Mir hat es unzählige Arbeitsstunden und die Investition in ein zusätzliches Tool zur Lösung des Problems erspart.

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'")