CAMT-bestand
CAMT-bestanden zijn XML-bestanden die door banken worden gebruikt om transacties te rapporteren. We zullen een CAMT.053 bestand gebruiken, dat rekeningafschriften bevat.
Relevante velden:
- Naam begunstigde (
<Nm>
) - IBAN (
<IBAN>
) - Bedrag (
<Amt>
) - Datum (
<BookgDt>
)
Voor een oefenbestand om deze analyse zelf uit te voeren, kun je dit test-CAMT-bestand downloaden.
Meer informatie over het CAMT.053-formaat en de specificaties ervan kun je vinden op deze externe pagina.
Data-analyse in Python
Om deze analyse uit te voeren, hebben we de volgende Python-packages nodig:
pandas
voor datamanipulatiexml.etree.ElementTree
voor het parseren van XML-bestanden. Deze zit standaard in python.
Als je dat nog niet eerder gedaan hebt, kun je pandas installeren met het volgende commando:
pip install pandas
Hieronder laten we stap voor stap zien hoe we een CAMT-bestand inlezen en dubbele IBANs detecteren.
1. CAMT-bestand inlezen
We gebruiken xml.etree.ElementTree
om het XML-bestand te parseren en relevante velden te extraheren.
# inladen van ElemenTree wat we nodig hebben om de XML in te lezen.
import xml.etree.ElementTree as ET
import pandas as pd
# Het ontleden van de CAMT 053 met een leesbaar df als resultaat
def parse_camt053(file_path):
tree = ET.parse(file_path)
root = tree.getroot()
ns = {'ns': 'urn:iso:std:iso:20022:tech:xsd:camt.053.001.02'}
transactions = []
# Loop over alle entries heen
for entry in root.findall('.//ns:Ntry', ns):
try:
# Als er geen bedrag gevonden wordt voor de entry, wordt deze op 0,0 gezet.
amount = float(entry.find('ns:Amt', ns).text) if entry.find('ns:Amt', ns) is not None else 0.0
except ValueError:
amount = 0.0 # Fallback bij conversiefouten
# Hieronder zoekt hij de betreffende velden en koppelt hij ze aan de variabele voor ons overzicht.
currency = entry.find('ns:Amt', ns).attrib.get('Ccy', 'N/A') if entry.find('ns:Amt', ns) is not None else 'N/A'
date = entry.find('.//ns:BookgDt/ns:Dt', ns).text if entry.find('.//ns:BookgDt/ns:Dt', ns) is not None else '-'
debtor = entry.find('.//ns:Dbtr/ns:Nm', ns).text if entry.find('.//ns:Dbtr/ns:Nm', ns) is not None else '-'
debtor_iban = entry.find('.//ns:DbtrAcct/ns:Id/ns:IBAN', ns).text if entry.find('.//ns:DbtrAcct/ns:Id/ns:IBAN', ns) is not None else '-'
creditor = entry.find('.//ns:Cdtr/ns:Nm', ns).text if entry.find('.//ns:Cdtr/ns:Nm', ns) is not None else '-'
creditor_iban_element = entry.find('.//ns:CdtrAcct/ns:Id/ns:IBAN', ns)
creditor_iban = creditor_iban_element.text if creditor_iban_element is not None else '-'
# Koppelt de entry als regel aan ons DataFrame
transactions.append({
"Datum": date,
"Debiteur": debtor,
"Debiteur IBAN": debtor_iban,
"Crediteur": creditor,
"Crediteur IBAN": creditor_iban,
"Bedrag": amount,
"Munteenheid": currency
})
return pd.DataFrame(transactions)
# Laad het CAMT.053-bestand
file_path = "camt053_dummy.xml"
df = parse_camt053(file_path)
# Toon de bovenste rijen
print(df.head())
2. Duplicaten analyseren
We groeperen op begunstigde en tellen het aantal unieke IBANs.
# Groeperen en tellen van unieke IBANs per begunstigde
duplicates = df.groupby('Crediteur')['Crediteur IBAN'].nunique().reset_index()
duplicates = duplicates[duplicates['Crediteur IBAN'] > 1] # Filter alleen begunstigden met meerdere IBANs
# Resultaten tonen
print("Begunstigden met meerdere IBANs:")
print(duplicates)
2.1 Analyse van IBANs met meerdere begunstigden
Naast het identificeren van begunstigden met meerdere IBANs, kunnen we ook analyseren of een IBAN aan meerdere begunstigden is gekoppeld. Dit kan wijzen op gezamenlijke rekeningen of verdachte transacties.
# Groeperen en tellen van unieke begunstigden per IBAN
iban_duplicates = df.groupby('Crediteur IBAN')['Crediteur'].nunique().reset_index()
iban_duplicates = iban_duplicates[iban_duplicates['Crediteur'] > 1] # Filter alleen IBANs met meerdere begunstigden
# Resultaten tonen
print("IBANs die aan meerdere begunstigden zijn gekoppeld:")
print(iban_duplicates)
3. Resultaten visualiseren
We kunnen de resultaten in een tabel weergeven en exporteren naar Excel.
# Exporteren van de resultaten naar een Excel-bestand
duplicates.to_excel("liquide_middelen_dubbele_iban.xlsx", index=False)
iban_duplicates.to_excel("liquide_middelen_dubbele_begunstigden.xlsx", index=False)
Conclusie
Hopelijk heeft deze analyse je een beetje verder geholpen!